Cách lấy bảng từ các trang web – hướng dẫn Python

Cách thực hiện , Python , Scraping ,13-12-20245 phút đọc

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 .

Điều kiện tiên quyết

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:

  • Đảm bảo Python được cài đặt trên hệ thống của bạn. Bạn có thể tải xuống phiên bản mới nhất tại đây .
  • Thư viện cần thiết:
    • yêu cầu —Để lấy nội dung HTML từ các trang web. Đây là một gói phổ biến để gửi yêu cầu HTTP trong Python.
    • Beautiful Soup — Một thư viện mạnh mẽ để phân tích cú pháp tài liệu HTML và XML. Chúng ta sẽ sử dụng nó để trích xuất các thành phần cụ thể từ trang web của mình.
    • pandas —Thư viện dùng để xử lý và phân tích dữ liệu trong Python. Đây sẽ là đích đến cuối cùng của chúng ta, nơi chúng ta lưu trữ dữ liệu bảng đã trích xuất.

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

Hướng dẫn từng bước để cạo bảng

Bước 1: Hiểu cấu trúc trang web

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 2: Gửi yêu cầu HTTP

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()

Bước 3: Trích xuất dữ liệu từ Bảng

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:

  • Bàn: Được bao bọc trong <table> thẻ, nó đóng vai trò là nơi chứa tất cả các hàng và ô.
  • Hàng: Mỗi <tr> (hàng của bảng) biểu thị một lát cắt ngang của bảng.
  • Tế bào: Bên trong mỗi hàng, <td> thẻ giữ các giá trị dữ liệu riêng lẻ (hoặc <th> thẻ cho tiêu đề).
  • Thuộc tính: Bảng thường có lớp , ID hoặc các thuộc tính khác để định dạng hoặc xác định chúng.

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()

Bước 4: Lưu dữ liệu vào tệp CSV

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

Mã đầy đủ: Thu thập và lưu dữ liệu bảng

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}")

Phần kết luận

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:

  • Bỏ qua giới hạn tốc độ: Thay đổi địa chỉ IP để tránh bị các trang web chặn vì gửi quá nhiều yêu cầu.
  • Duy trì tính ẩn danh: Giữ bí mật danh tính của bạn bằng cách che giấu địa chỉ IP thực.
  • Truy cập dữ liệu bị giới hạn theo vị trí địa lý: Sử dụng proxy có vị trí cụ thể để thu thập nội dung theo từng khu vực.

ProxyScrape cung cấp nhiều loại proxy, bao gồm proxy dân dụng , cao cấp , chuyên dụngdi độ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ả.