Data Engineering Project — Cửa hàng bán lẻ phần 1 — Web Scraping

Mở đầu

Bài viết này là mở đầu trong chuỗi series về DE Project. Trong project này, tôi sẽ tạo kiến trúc dữ liệu cho 1 cửa hàng bán lẻ rượu whiskey để giúp người quản lý cửa hàng có thể đưa ra quyết định dựa trên dữ liệu của chính họ tạo ra.

Kiến trúc này sẽ bao gồm đa dạng các thành phần khiến việc đưa ra quyết định của người quản lý trở nên dễ dàng nhất có thể.

Tôi sẽ bắt đầu thực hiện quá trình ETL bằng việc trích dữ liệu về whiskey rồi đưa vào cơ sở dữ liệu trung tâm của công ty. Dữ liệu sẽ được trích xuất từ https://www.thewhiskyexchange.com thông qua phương pháp cào dữ liệu bằng ngôn ngữ Python.

Và rồi tôi sẽ lưu trữ dữ liệu vừa được trích xuất trong cơ sở dữ liệu trung tâm, nguồn dữ liệu chính bên trong tổ chức. Tiếp đó thiết kế data warehouse để lấy dữ liệu từ cơ sở dữ liệu nguồn và cung cấp nguồn dữ liệu cho từng bộ phận liên quan bên trong tổ chức.

Đến cuối cùng, tôi sẽ thực hiện 1 số phân tích và tạo các visualizations để trợ giúp việc đưa ra quyết định 1 cách nhanh chóng, dự đoán và hiểu sơ qua tổng quan thực trạng hiện tại của tổ chức.

Phần 1 -- Cào dữ liệu Whiskey

Để lấy được dữ liệu cho cửa hàng bán lẻ, tôi sẽ cào dữ liệu của website https://www.thewhiskyexchange.com với số lượng đa dạng các loại rượu whiskey. Tôi sẽ sử dụng 2 thư viện của Python là requests và BeautifulSoup để cào dữ liệu và tạo đối tượng cào dữ liệu sử dụng OOP.

Lớp đối tượng chính được gọi là whisky_web_scraping và có các phương thức như dưới đây:

1. scrape_html

Tôi sẽ sử dụng phương thức này để gửi GET request thông qua thư viện requests và tạo Beautiful Soup object từ kết quả được trả về.

Đối tượng soup này sẽ là trọng tâm chính của việc khai thác kể từ bây giờ.

2. get_page_content & get_page_price

Tiếp theo, tôi sẽ sử dụng 2 phương thức này để trích xuất các đối tượng cụ thể cùng với soup object từ bước trước. Các đối tượng này bao gồm: tên, số lượng alcohol, phần trăm và giá của từng loại đồ uống.

Cùng xem HTML code của từng loại đồ uống trông như thế nào nhé!

Ví dụ: loại đồ uống "Deanston 18 years old".


Nếu bạn click Inspect vào loại đồ uống đó, bạn sẽ thấy chúng bao gồm 2 div objects, 1 thuộc lớp "product-card__content" và cái còn lại thuộc lớp "product-card__data" sẽ trông như thế này:


2 phương thức này sẽ trích xuất 2 div objects. Dưới đây là 2 phương thức đó:



3. get_product_name, get_product_alcohol_percent, get_product_alcohol_amount & get_product_price

Sau khi trích xuất 2 div object, loạt phương thức tiếp theo sẽ dùng để lấy tên, số lượng alcohol, phần trăm alcohol và giá của từng loại đồ uống.

1 điều cần lưu ý ở đây là 2 div object sẽ có vài paragraphs(P) bao gồm dữ liệu mà tôi cần thu được. 4 phương thức dưới đây sẽ lấy được paragraphs và nội dung bên trong chúng.

4. create_df

Phương thức tiếp theo đơn giản là gộp tất cả dữ liệu thu được từ các phương thức trước đó rồi đưa vào 1 dataframe.

Dataframe này sẽ bao gồm 4 cột: Product_Name, Alcohol_Percent, Alcohol_Amount và Alcohol_Price.


Ví dụ

Trước khi giải thích nốt 3 phương thức cuối thì tôi muốn chứng minh cách mà các phương thức trước vẫn hoạt động tốt với nhau cho đến hiện tại. Hãy thử cào trang web https://www.thewhiskyexchange.com/c/40/single-malt-scotch-whisky nơi thể hiện các loại rượu whiskey loại "single-malt".


Trước tiên hãy import các thư viện cần thiết nhé !


Bây giờ hãy tạo ra 1 Dataframe với dữ liệu từ trang thứ nhất của trang web https://www.thewhiskyexchange.com/c/40/single-malt-scotch-whisky

Output:

5. insert_df

Phương thức tiếp theo sẽ add dữ liệu thêm vào dataframe hiện tại.

Sẽ cho ra kết quả lớn hơn so với dataframe cũ và được cấu trúc từ việc cào dữ liệu trên nhiều trang cùng 1 sản phẩm hơn.


6. get_links

Cho tới hiện tại, tôi đã xây dựng các phương thức để cào dữ liệu trên nhiều trang cho 1 loại sản phẩm của rượu whiskey.

Để tự động hóa quá trình trích xuất dữ liệu cho nhiều loại sản phẩm rượu whiskey, tôi đã tạo phương thức để trích xuất các link của các trang liên quan bên trong https://www.thewhiskyexchange.com

7. scrape_whisky

Đây là phương thức chính được dùng trong class. Cho đến nay, tôi đã liên kết đa dạng các phương thức cho việc trích xuất từng loại link đặc biệt và phương thức để tạo ra 1 danh sách các link.

Phương thức này sẽ ráp tất cả đoạn code mà tôi đã viết lại với nhau để cho phép dễ dàng trích xuất mọi dữ liệu mà tôi mong muốn chỉ thông qua 1 click chuột.

Sau khi hoàn thành với các loại whiskey, phương thức này sẽ export từng lại của whiskey ra 1 file CSV và cũng tạo ra 1 dataframe với tất cả dữ liệu mà ta trích xuất ra được từ https://www.thewhiskyexchange.com/


Và đó là tất cả những gì ta có. Bây giờ ta có thể cào dữ liệu từ nhiều link và trang khác nhau.

Cùng xem ví dụ minh họa:

Phần code toàn bộ project tôi sẽ để trong link sau: thidocapba/whiskey_DE_proj (github.com)

Thực thi đoạn code sau:


Cùng xem kết quả, đầu tiên là dataframe ta thu được:


Thứ 2 cùng xem các file CSV về các loại whiskey khác nhau: 


Và đó là toàn bộ cho phần 1 của project, ở phần tiếp theo tôi sẽ tiếp tục quá trình xây dựng ETL và tập trung vào việc load data vào cơ sở dữ liệu chính và data warehouse. See yahh :D 

Comments

Popular posts from this blog

Sending Emails using Apache Airflow Email Operator

ETL Process Using Airflow and Docker

Built a working Hadoop-Spark-Hive-Superset cluster on Docker