Python đọc bảng html từ trang web

Dữ liệu dạng bảng là một trong những nguồn dữ liệu tốt nhất trên web. Chúng có thể lưu trữ một lượng lớn thông tin hữu ích mà không làm mất định dạng dễ đọc của nó, khiến nó trở thành mỏ vàng cho các dự án liên quan đến dữ liệu

Cho dù đó là cạo dữ liệu bóng đá hay trích xuất dữ liệu thị trường chứng khoán, chúng ta có thể sử dụng Python để nhanh chóng truy cập, phân tích cú pháp và trích xuất dữ liệu từ các bảng HTML nhờ Requests và Beautiful Soup

Ngoài ra, cuối cùng chúng tôi có một bất ngờ đen trắng nhỏ dành cho bạn, vì vậy hãy tiếp tục đọc

Hiểu cấu trúc của bảng HTML

Nhìn trực quan, bảng HTML là một tập hợp các hàng và cột hiển thị thông tin ở định dạng bảng. Đối với hướng dẫn này, chúng tôi sẽ cạo bảng ở trên

Để có thể cạo dữ liệu có trong bảng này, chúng ta sẽ cần tìm hiểu sâu hơn một chút về mã hóa của nó

Nói chung, các bảng HTML thực sự được xây dựng bằng cách sử dụng các thẻ HTML sau

  • //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    0. Nó đánh dấu sự bắt đầu của một bảng HTML
  • //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    1 hoặc

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    2. Xác định một hàng làm tiêu đề của bảng
  • //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    3. Cho biết phần chứa dữ liệu
  • //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    4. Cho biết một hàng trong bảng
  • //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    5. Định nghĩa một ô trong bảng

Tuy nhiên, như chúng ta sẽ thấy trong các tình huống thực tế, không phải tất cả các nhà phát triển đều tôn trọng các quy ước này khi xây dựng bảng của họ, khiến cho một số dự án khó hơn những dự án khác. Tuy nhiên, hiểu cách chúng hoạt động là rất quan trọng để tìm ra phương pháp phù hợp

Hãy nhập URL của bảng [https. //dữ liệu. mạng/ví dụ/tạo kiểu/sọc. html] trong trình duyệt của chúng tôi và kiểm tra trang để xem điều gì đang xảy ra bên trong

This is why this is a great page to practice scraping tabular data with Python. There’s a clear

tag pair opening and closing the table and all the relevant data is inside the tag. It only shows ten rows which matches the number of entries selected on the front-end.

Một vài điều nữa cần biết về bảng này là nó có tổng cộng 57 mục mà chúng tôi muốn thu thập và dường như có hai giải pháp để truy cập dữ liệu. Đầu tiên là nhấp vào menu thả xuống và chọn “100” để hiển thị tất cả các mục nhập

Hoặc nhấp vào nút tiếp theo để di chuyển qua phân trang

Vậy cái nào sẽ là?

Tất nhiên, vì đây là bảng HTML nên tất cả dữ liệu phải nằm trên chính tệp HTML mà không cần phải tiêm AJAX. Để xác minh điều này, Nhấp chuột phải> Xem nguồn trang. Tiếp theo, sao chép một vài ô và tìm kiếm chúng trong Mã nguồn

Chúng tôi đã làm điều tương tự cho một vài mục khác từ các ô được phân trang khác nhau và vâng, có vẻ như tất cả dữ liệu mục tiêu của chúng tôi đều ở đó mặc dù giao diện người dùng không hiển thị nó

Và với thông tin này, chúng tôi đã sẵn sàng chuyển sang mã

Cạo các bảng HTML bằng cách sử dụng món súp đẹp mắt của Python

Bởi vì tất cả dữ liệu nhân viên mà chúng tôi muốn thu thập đều nằm trên tệp HTML, nên chúng tôi có thể sử dụng thư viện Yêu cầu để gửi yêu cầu HTTP và phân tích cú pháp phản hồi bằng Beautiful Soup

Ghi chú. Nếu bạn chưa quen với việc quét web, chúng tôi đã tạo một hướng dẫn về quét web trong Python dành cho người mới bắt đầu. Mặc dù bạn có thể làm theo mà không cần kinh nghiệm, nhưng luôn luôn nên bắt đầu từ những điều cơ bản

1. Gửi yêu cầu chính của chúng tôi

Hãy tạo một thư mục mới cho dự án có tên python-html-table, sau đó một thư mục mới có tên bs4-table-scraper và cuối cùng, tạo một python_table_scraper mới. tập tin py. 54

Từ thiết bị đầu cuối, hãy

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

6 và nhập chúng vào dự án của chúng tôi như sau

import requests from bs4 import BeautifulSoup

Để gửi yêu cầu HTTP bằng Yêu cầu, tất cả những gì chúng ta cần làm là đặt URL và chuyển qua yêu cầu. get[], lưu trữ HTML được trả về bên trong một biến phản hồi và in phản hồi. status_code

Ghi chú. Nếu bạn hoàn toàn chưa quen với Python, bạn có thể chạy mã của mình từ thiết bị đầu cuối bằng lệnh python3 python_table_scraper. py

________số 8

Nếu nó hoạt động, nó sẽ trả về mã trạng thái 200. Bất cứ điều gì khác có nghĩa là IP của bạn đang bị từ chối bởi các hệ thống chống cạo mà trang web đã đặt. Một giải pháp tiềm năng là thêm các tiêu đề tùy chỉnh vào tập lệnh của bạn để làm cho tập lệnh của bạn trông giống con người hơn – nhưng điều đó có thể là chưa đủ. Một giải pháp khác là sử dụng API quét web để xử lý tất cả những vấn đề phức tạp này cho bạn

2. Tích hợp ScraperAPI để tránh hệ thống Anti-Scraping

ScraperAPI là một giải pháp tao nhã để tránh hầu hết mọi loại kỹ thuật chống cạo. Nó sử dụng máy học và nhiều năm phân tích thống kê để xác định các tiêu đề và tổ hợp IP tốt nhất để truy cập dữ liệu, xử lý CAPTCHA và xoay vòng IP của bạn giữa mỗi yêu cầu

Để bắt đầu, hãy tạo một tài khoản miễn phí ScraperAPI mới để đổi 5000 API miễn phí và Khóa API của chúng tôi. Từ bảng điều khiển tài khoản của chúng tôi, chúng tôi có thể sao chép giá trị chính của mình để tạo URL của yêu cầu

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

Theo cấu trúc này, chúng tôi thay thế chủ sở hữu bằng dữ liệu của chúng tôi và gửi lại yêu cầu của chúng tôi

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

0

Tuyệt vời, nó hoạt động mà không có bất kỳ trục trặc nào

3. Xây dựng trình phân tích cú pháp bằng cách sử dụng Beautiful Soup

Trước khi có thể trích xuất dữ liệu, chúng tôi cần biến HTML thô thành dữ liệu được định dạng hoặc phân tích cú pháp. Chúng tôi sẽ lưu trữ HTML được phân tích cú pháp này vào một đối tượng súp như thế này

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

1

Từ đây, chúng ta có thể duyệt qua cây phân tích cú pháp bằng cách sử dụng các thẻ HTML và các thuộc tính của chúng

Nếu chúng ta quay trở lại bảng trên trang, chúng ta đã thấy rằng bảng được đặt giữa các thẻ

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

0 với lớp

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

8, mà chúng ta có thể sử dụng để chọn bảng

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

4

Ghi chú. Sau khi test thêm class thứ 2 [dataTable] không trả về phần tử. Trên thực tế, trong các phần tử trả về, lớp của bảng chỉ có sọc. Bạn cũng có thể sử dụng id = ‘ví dụ’

Đây là những gì nó trả về

Bây giờ chúng tôi đã lấy bảng, chúng tôi có thể lặp qua các hàng và lấy dữ liệu chúng tôi muốn

4. Vòng qua bảng HTML

Nghĩ lại về cấu trúc của bảng, mỗi hàng được đại diện bởi một phần tử

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

4 và bên trong chúng có phần tử

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

5 chứa dữ liệu, tất cả những thứ này được bao bọc giữa một cặp thẻ

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

3

Để trích xuất dữ liệu, chúng tôi sẽ tạo hai giao diện, một để lấy phần

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

3 của bảng [nơi chứa tất cả các hàng] và một để lưu trữ tất cả các hàng vào một biến mà chúng tôi có thể sử dụng

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

9

Trong các hàng, chúng tôi sẽ lưu trữ tất cả các phần tử

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

4 được tìm thấy trong phần nội dung của bảng. Nếu bạn đang làm theo logic của chúng tôi, bước tiếp theo là lưu trữ từng hàng riêng lẻ vào một đối tượng và lặp qua chúng để tìm dữ liệu mong muốn

Để bắt đầu, hãy thử chọn tên của nhân viên đầu tiên trên bảng điều khiển của trình duyệt bằng cách sử dụng. phương thức querySelectorAll[]. Một tính năng thực sự hữu ích của phương pháp này là chúng ta có thể đi sâu hơn vào hệ thống phân cấp thực hiện ký hiệu lớn hơn [>] để xác định phần tử cha [ở bên trái] và phần tử con mà chúng ta muốn lấy [ở bên phải]

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

1

That couldn’t work any better. As you see, once we grab all

elements, these become a nodelist. Because we can’t rely on a class to grab each cell, all we need to know is their position in the index and the first one, name, is 0.

Từ đó, chúng ta có thể viết mã của mình như thế này

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

2

Nói một cách đơn giản, chúng tôi đang lấy từng hàng, từng hàng một và tìm tất cả các ô bên trong, khi chúng tôi có danh sách, chúng tôi chỉ lấy ô đầu tiên trong chỉ mục [vị trí 0] và kết thúc bằng. text để chỉ lấy văn bản của phần tử, bỏ qua dữ liệu HTML mà chúng ta không cần

Họ đây rồi, một danh sách với tất cả tên nhân viên. Đối với phần còn lại, chúng tôi chỉ làm theo logic tương tự

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

3

Tuy nhiên, việc in tất cả dữ liệu này trên bảng điều khiển của chúng tôi không thực sự hữu ích. Thay vào đó, hãy lưu trữ dữ liệu này ở định dạng mới, hữu ích hơn

5. Lưu trữ dữ liệu dạng bảng vào tệp JSON

Mặc dù chúng tôi có thể dễ dàng tạo tệp CSV và gửi dữ liệu của mình đến đó, nhưng đó sẽ không phải là định dạng dễ quản lý nhất nếu chúng tôi có thể tạo nội dung mới bằng cách sử dụng dữ liệu đã loại bỏ

Tuy nhiên, đây là một dự án chúng tôi đã thực hiện cách đây vài tháng giải thích cách tạo tệp CSV để lưu trữ dữ liệu cóp nhặt

Tin tốt là Python có mô-đun JSON riêng để làm việc với các đối tượng JSON, vì vậy chúng tôi không cần cài đặt bất cứ thứ gì, chỉ cần nhập nó

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

0

Tuy nhiên, trước khi chúng tôi có thể tiếp tục và tạo tệp JSON của mình, chúng tôi cần chuyển tất cả dữ liệu đã loại bỏ này thành một danh sách. Để làm như vậy, chúng tôi sẽ tạo một mảng trống bên ngoài vòng lặp của chúng tôi

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

1

Và sau đó nối thêm dữ liệu vào nó, với mỗi vòng lặp nối thêm một đối tượng mới vào mảng

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

2

Nếu chúng tôi

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

04, đây là kết quả

Vẫn còn một chút lộn xộn, nhưng chúng tôi có một bộ đối tượng sẵn sàng để chuyển đổi thành JSON

Ghi chú. Để thử nghiệm, chúng tôi đã in chiều dài của

//api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

05 và nó trả về 57, đây là số hàng chính xác mà chúng tôi đã loại bỏ [các hàng hiện là đối tượng trong mảng]

Nhập danh sách vào JSON chỉ cần hai dòng mã

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

3

  • Đầu tiên, chúng tôi mở một tệp mới chuyển qua tên mà chúng tôi muốn cho tệp

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    06 và 'w' khi chúng tôi muốn ghi dữ liệu vào đó
  • Tiếp theo, chúng tôi sử dụng hàm

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    07 để kết xuất dữ liệu từ mảng

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    08

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    05

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    10 và

    //api.scraperapi.com?api_key={Your_API_KEY}&url={TARGET_URL}

    11 để mọi đối tượng có dòng riêng thay vì mọi thứ nằm trong một dòng không thể đọc được

6. Chạy Script và Full Code

Nếu bạn đã theo dõi, codebase của bạn sẽ trông như thế này

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

4

Ghi chú. Chúng tôi đã thêm một số nhận xét cho ngữ cảnh

Và đây là ba đối tượng đầu tiên từ tệp JSON

Lưu trữ dữ liệu đã loại bỏ ở định dạng JSON cho phép chúng tôi sử dụng lại thông tin cho các ứng dụng mới hoặc

Cạo các bảng HTML bằng Pandas

Trước khi bạn rời khỏi trang, chúng tôi muốn khám phá cách tiếp cận thứ hai để loại bỏ các bảng HTML. Trong một vài dòng mã, chúng ta có thể cạo tất cả dữ liệu dạng bảng từ tài liệu HTML và lưu trữ vào khung dữ liệu bằng Pandas

Tạo một thư mục mới bên trong thư mục của dự án [chúng tôi đặt tên là pandas-html-table-scraper] và tạo tên tệp mới là pandas_table_scraper. py

Hãy mở một terminal mới và điều hướng đến thư mục chúng ta vừa tạo [cd pandas-html-table-scraper] và từ đó cài đặt pandas

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

5

Và chúng tôi nhập nó ở đầu tệp

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

6

Pandas có một chức năng được gọi là read_html[] về cơ bản sẽ loại bỏ URL mục tiêu cho chúng tôi và trả về tất cả các bảng HTML dưới dạng danh sách các đối tượng DataFrame

However, for this to work, the HTML table needs to be structured at least somewhat decently, as the function will look for elements like

to identify the tables on the file.

Để sử dụng hàm, hãy tạo một biến mới và chuyển URL mà chúng ta đã sử dụng trước đó cho nó

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

7

Khi in nó sẽ trả về một danh sách các bảng HTML trong trang

Nếu chúng ta so sánh ba hàng đầu tiên trong DataFrame thì chúng hoàn toàn phù hợp với những gì chúng ta đã thu thập bằng Beautiful Soup

Để làm việc với JSON, Pandas có thể có chức năng tích hợp. Nó sẽ chuyển đổi danh sách các đối tượng DataFrame thành chuỗi JSON

Tất cả những gì chúng ta cần làm là gọi phương thức trên DataFrame của mình và chuyển vào đường dẫn, định dạng [phân tách, dữ liệu, bản ghi, chỉ mục, v.v. ] và thêm thụt lề để dễ đọc hơn

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

8

Nếu chúng tôi chạy mã của mình ngay bây giờ, đây là tệp kết quả

Lưu ý rằng chúng tôi cần chọn bảng của mình từ chỉ mục [[0]] vì. read_html[] trả về một danh sách không phải là một đối tượng

Đây là mã đầy đủ để bạn tham khảo

url = '//datatables.net/examples/styling/stripe.html' response = requests.get[url] print[response.status_code]

9

Được trang bị kiến ​​thức mới này, bạn đã sẵn sàng để bắt đầu cạo hầu như bất kỳ bảng HTML nào trên web. Chỉ cần nhớ rằng nếu bạn hiểu cách trang web được cấu trúc và logic đằng sau nó, thì không có gì bạn không thể cạo

Điều đó nói rằng, các phương pháp này sẽ chỉ hoạt động miễn là dữ liệu nằm trong tệp HTML. Nếu bạn gặp một bảng được tạo động, bạn sẽ cần tìm một cách tiếp cận mới. Đối với các loại bảng này, chúng tôi đã tạo hướng dẫn từng bước để loại bỏ các bảng JavaScript bằng Python mà không cần trình duyệt không đầu

Cho đến lần sau, hạnh phúc cạo

Giới thiệu về tác giả

Zoltan Bettenbuk

Zoltan Bettenbuk là CTO của ScraperAPI - giúp hàng nghìn công ty truy cập vào dữ liệu họ cần. Anh ấy là một chuyên gia nổi tiếng về xử lý dữ liệu và quét web. Với hơn 15 năm kinh nghiệm trong lĩnh vực phát triển phần mềm, quản lý sản phẩm và lãnh đạo, Zoltan thường xuyên công bố những hiểu biết của mình trên blog của chúng tôi cũng như trên Twitter và LinkedIn

Mục lục

Những bài viết liên quan

Cách ẩn địa chỉ IP của bạn để quét web

Scrapers điều hướng internet theo cách chúng tôi làm thông qua các trình duyệt của chúng tôi. Khi chúng tôi cung cấp một URL cho trình quét của mình, nó sẽ gửi một yêu cầu HTTP với

đọc bài viết

Ngày 15 tháng 12 năm 2022

Cách cạo dữ liệu quảng cáo Google của đối thủ cạnh tranh để cải thiện chính bạn

Quảng cáo trả tiền [PPC] là một không gian cạnh tranh, đòi hỏi các chiến thuật thông minh để thành công. Khi kênh quảng cáo này trưởng thành và chi phí quảng cáo tiếp tục tăng đáng kể,

đọc bài viết

Ngày 21 tháng 11 năm 2022

Cách sử dụng Web Scraping để trao quyền cho các quyết định tiếp thị

Thu hút đúng người tiêu dùng và chuyển đổi họ thành khách hàng trả tiền luôn đòi hỏi sự cân bằng giữa tính sáng tạo, kiến ​​thức ngành và sự hiểu biết rõ ràng về người tiêu dùng.

Làm cách nào để lấy dữ liệu từ bảng HTML trong Python?

Đối với điều này, bạn có thể sử dụng các thư viện python khác nhau giúp bạn trích xuất nội dung từ bảng HTML. Một phương thức như vậy có sẵn trong thư viện Python Pandas phổ biến, nó được gọi là read_html[] . Phương thức này chấp nhận nhiều đối số cho phép bạn tùy chỉnh cách bảng sẽ được phân tích cú pháp.

Làm cách nào để đọc dữ liệu HTML trong Python?

Python – Đọc các trang HTML .
Cài đặt BeautifulSoup. Sử dụng trình quản lý gói Anaconda để cài đặt gói cần thiết và các gói phụ thuộc của nó. .
Đọc tệp HTML. Trong ví dụ dưới đây, chúng tôi yêu cầu một url được tải vào môi trường python. .
Trích xuất giá trị thẻ. .
Trích xuất tất cả các thẻ

Python có thể lấy dữ liệu từ một trang web không?

Khi thu thập dữ liệu từ các trang web bằng Python , bạn thường quan tâm đến các phần cụ thể của trang. Bằng cách dành thời gian xem qua tài liệu HTML, bạn có thể xác định các thẻ có thuộc tính duy nhất mà bạn có thể sử dụng để trích xuất dữ liệu mình cần.

Làm thế nào để đọc bảng HTML?

Các bảng HTML cho phép các nhà phát triển web sắp xếp dữ liệu thành các hàng và cột. . Thẻ bảng HTML

Chủ Đề