Web scraping đã trở thành một kỹ năng quan trọng đối với các nhà phát triển Python, nhà phân tích dữ liệu và bất kỳ ai làm việc với các tập dữ liệu. Khi nói đến dữ liệu có cấu trúc và phong phú, các bảng được tìm thấy trên các trang web thường là mỏ vàng thông tin. Cho dù bạn đang tìm kiếm danh mục sản phẩm, số liệu thống kê thể thao hay dữ liệu tài chính trên web, khả năng trích xuất và lưu dữ liệu bảng bằng Python là một công cụ vô giá.
Hướng dẫn thực tế này sẽ hướng dẫn bạn từng bước trong quy trình thu thập bảng từ các trang web bằng Python. Cuối cùng, bạn sẽ biết cách sử dụng các thư viện phổ biến như requests , Beautiful Soup và thậm chí là pandas để truy cập dữ liệu bảng và lưu trữ dữ liệu đó ở các định dạng có thể tái sử dụng như tệp CSV .
Trước khi đi sâu vào các chi tiết kỹ thuật, đây là những gì bạn cần phải làm theo:
Chúng ta sẽ sử dụng lệnh pip để cài đặt các thư viện cần thiết. Chỉ cần chạy lệnh sau trong terminal của bạn để hoàn tất cài đặt:
pip cài đặt yêu cầu beautifulsoup4 pandas
Bước đầu tiên trong bất kỳ dự án trích xuất dữ liệu web nào là phân tích cấu trúc của trang web mục tiêu. Trong ví dụ này, chúng tôi sẽ trích xuất dữ liệu từ một trang web mẫu có bảng hiển thị thứ hạng của các đội khúc côn cầu . Dưới đây là bản xem trước của bảng:
Sau đây là cách bảng này xuất hiện trong cấu trúc HTML .
Bước đầu tiên là lấy trang web bạn muốn thu thập. Chúng tôi sẽ sử dụng thư viện yêu cầu để gửi yêu cầu HTTP và lấy nội dung HTML từ trang web giả mà chúng tôi đang sử dụng để lấy nội dung bảng
url = "https://www.scrapethissite.com/pages/forms/"
response = requests.get(url)
if response.status_code == 200:
print("Page fetched successfully!")
html_content = response.text
else:
print(f"Failed to fetch the page. Status code: {response.status_code}")
exit()
Trong HTML, bảng là một cách có cấu trúc để trình bày dữ liệu theo hàng và cột, giống như trong bảng tính. Bảng được tạo bằng cách sử dụng <table>
thẻ và nội dung của chúng được chia thành các hàng (<tr>
) và tế bào (<td>
cho các ô dữ liệu hoặc <th>
(đối với các ô tiêu đề). Sau đây là phân tích nhanh về cách hoạt động của cấu trúc bảng:
<table>
thẻ, nó đóng vai trò là nơi chứa tất cả các hàng và ô.<tr>
(hàng của bảng) biểu thị một lát cắt ngang của bảng.<td>
thẻ giữ các giá trị dữ liệu riêng lẻ (hoặc <th>
thẻ cho tiêu đề). Ví dụ, trong tập lệnh này, chúng tôi xác định vị trí <table>
gắn thẻ với một lớp cụ thể (lớp="bảng"
) và trích xuất các hàng và ô của nó bằng cách sử dụng Súp đẹp. Điều này cho phép chúng tôi trích xuất dữ liệu một cách có hệ thống và chuẩn bị để phân tích hoặc lưu.
soup = BeautifulSoup(html_content, "html.parser")
table = soup.find("table", {"class": "table"})
if not table:
print("No table found on the page!")
exit()
Trong bước này, chúng ta sẽ lưu dữ liệu bảng đã trích xuất vào tệp CSV để sử dụng sau này và cũng hiển thị dưới dạng pandas DataFrame để bạn có thể xem dữ liệu được cấu trúc như thế nào. Lưu dữ liệu dưới dạng CSV cho phép bạn phân tích dữ liệu sau này trong các công cụ như Excel , Google Sheets hoặc chính Python .
headers = [header.text.strip() for header in table.find_all("th")]
rows = []
for row in table.find_all("tr", class_="team"):
cells = [cell.text.strip() for cell in row.find_all("td")]
rows.append(cells)
df = pd.DataFrame(rows, columns=headers)
csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")
print(f"Data saved to {csv_filename}")
Khi bạn chạy mã này, pandas sẽ tạo một tệp có tên scraped_table_data.csv
trong thư mục làm việc của bạn và dữ liệu được trích xuất sẽ được in trong bảng điều khiển như sau:
Tên đội Năm Thắng Thua OT Thua % thắng Bàn thắng vào lưới (GF) Bàn thua vào lưới (GA) + / - 0 Boston Bruins 1990 44 24 0 . 55 299 264 35 1 Buffalo Sabres 1990 31 30 0 . 388 292 278 14 2 Calgary Flames 1990 46 26 0 . 575 344 263 81 3 Chicago Blackhawks 1990 49 23 0 . 613 284 211 73 4 Detroit Red Wings 1990 34 38 0 . 425 273 298 - 25
Dưới đây là tập lệnh Python hoàn chỉnh để trích xuất dữ liệu bảng từ một trang web, lưu vào tệp CSV và hiển thị dữ liệu đã trích xuất. Tập lệnh này kết hợp tất cả các bước được đề cập trong hướng dẫn này thành một quy trình làm việc thống nhất.
import requests
from bs4 import BeautifulSoup
import pandas as pd
url = "https://www.scrapethissite.com/pages/forms/"
response = requests.get(url)
if response.status_code == 200:
print("Page fetched successfully!")
html_content = response.text
else:
print(f"Failed to fetch the page. Status code: {response.status_code}")
exit()
soup = BeautifulSoup(html_content, "html.parser")
table = soup.find("table", {"class": "table"})
if not table:
print("No table found on the page!")
exit()
headers = [header.text.strip() for header in table.find_all("th")]
rows = []
for row in table.find_all("tr", class_="team"):
cells = [cell.text.strip() for cell in row.find_all("td")]
rows.append(cells)
df = pd.DataFrame(rows, columns=headers)
csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")
print(df.head())
print(f"Data saved to {csv_filename}")
Hướng dẫn này hướng dẫn bạn từng bước trong quy trình: hiểu cấu trúc trang web, trích xuất dữ liệu và lưu dữ liệu để phân tích. Cho dù bạn đang xây dựng bộ dữ liệu để nghiên cứu, tự động hóa việc thu thập dữ liệu hay chỉ đơn giản là khám phá khả năng thu thập dữ liệu web, việc thành thạo các kỹ thuật này sẽ mở ra một thế giới cơ hội.
Trong khi thu thập, bạn có thể gặp phải những thách thức như lệnh cấm IP hoặc giới hạn tốc độ do các trang web áp đặt. Đây là lúc proxy trở nên quan trọng. Proxy cho phép bạn:
ProxyScrape cung cấp nhiều loại proxy, bao gồm proxy dân dụng , cao cấp , chuyên dụng và di động , được thiết kế riêng cho việc thu thập dữ liệu web. Các giải pháp proxy đáng tin cậy và có thể mở rộng của họ có thể giúp bạn xử lý các dự án thu thập dữ liệu quy mô lớn mà không bị gián đoạn, đảm bảo thu thập dữ liệu trơn tru và hiệu quả.