Làm cách nào để trích xuất dữ liệu HTML bằng Python?

Quét web là thu thập thông tin theo chương trình từ các trang web khác nhau. Mặc dù có nhiều thư viện và khung bằng nhiều ngôn ngữ khác nhau có thể trích xuất dữ liệu web, Python từ lâu đã là một lựa chọn phổ biến vì có rất nhiều tùy chọn để quét web

Bài viết này sẽ cung cấp cho bạn một khóa học cấp tốc về quét web bằng Python với Beautiful Soup - một thư viện Python phổ biến để phân tích cú pháp HTML và XML

Quét web có đạo đức

Quét web phổ biến và cung cấp cho chúng tôi dữ liệu như chúng tôi sẽ nhận được với API. Tuy nhiên, với tư cách là những công dân tốt của Internet, chúng tôi có trách nhiệm tôn trọng chủ sở hữu trang web mà chúng tôi thu thập từ. Dưới đây là một số nguyên tắc mà một trình quét web nên tuân thủ

  • Không yêu cầu nội dung cóp nhặt là của riêng chúng tôi. Chủ sở hữu trang web đôi khi dành nhiều thời gian để tạo bài viết, thu thập thông tin chi tiết về sản phẩm hoặc thu thập nội dung khác. Chúng ta phải tôn trọng sức lao động và sự độc đáo của họ
  • Đừng cạo một trang web không muốn bị cạo. Các trang web đôi khi đi kèm với tệp
    from bs4 import BeautifulSoup
    
    with open("doc.html") as fp:
        soup = BeautifulSoup(fp, "html.parser")
    
    0 - xác định các phần của trang web có thể được loại bỏ. Nhiều trang web cũng có Điều khoản sử dụng có thể không cho phép cạo. Chúng ta phải tôn trọng những trang web không muốn bị cạo
  • Đã có sẵn API chưa? . API được tạo để cung cấp quyền truy cập vào dữ liệu theo cách được kiểm soát theo quy định của chủ sở hữu dữ liệu. Chúng tôi muốn sử dụng API nếu chúng có sẵn
  • Đưa ra yêu cầu cho một trang web có thể ảnh hưởng đến hiệu suất của trang web. Một trình quét web đưa ra quá nhiều yêu cầu có thể gây suy nhược như một cuộc tấn công DDOS. Chúng tôi phải cạo một cách có trách nhiệm để không gây ra bất kỳ sự gián đoạn nào đối với hoạt động bình thường của trang web

Tổng quan về Beautiful Soup

Nội dung HTML của các trang web có thể được phân tích cú pháp và loại bỏ bằng Beautiful Soup. Trong phần sau, chúng tôi sẽ đề cập đến các chức năng hữu ích cho việc quét các trang web

Điều làm cho Beautiful Soup trở nên hữu ích là vô số chức năng mà nó cung cấp để trích xuất dữ liệu từ HTML. Hình ảnh dưới đây minh họa một số chức năng chúng ta có thể sử dụng

Hãy thực hành và xem cách chúng ta có thể phân tích cú pháp HTML bằng Beautiful Soup. Hãy xem xét trang HTML sau được lưu vào tệp dưới dạng

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
1



  Head's title



  

Body's title

line begins 1 2 3

line ends

Các đoạn mã sau được thử nghiệm trên

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
2. Bạn có thể cài đặt mô-đun
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
3 bằng cách gõ lệnh sau vào terminal

$ pip3 install beautifulsoup4

Tệp HTML

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
1 cần được chuẩn bị. Điều này được thực hiện bằng cách chuyển tệp tới hàm tạo
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
3, hãy sử dụng trình bao Python tương tác cho việc này, vì vậy chúng tôi có thể in ngay nội dung của một phần cụ thể của trang

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")

Bây giờ chúng tôi có thể sử dụng Beautiful Soup để điều hướng trang web của mình và trích xuất dữ liệu

Từ đối tượng soup được tạo ở phần trước, hãy lấy thẻ tiêu đề của

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
1

Đây là bảng phân tích của từng thành phần chúng tôi đã sử dụng để lấy tiêu đề

Beautiful Soup mạnh mẽ vì các đối tượng Python của chúng tôi phù hợp với cấu trúc lồng nhau của tài liệu HTML mà chúng tôi đang tìm kiếm

Để lấy nội dung của thẻ

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
7 đầu tiên, hãy nhập nội dung này

Để lấy tiêu đề trong thẻ nội dung HTML (được biểu thị bằng lớp "tiêu đề"), hãy nhập nội dung sau vào thiết bị đầu cuối của bạn

Đối với các tài liệu HTML được lồng sâu, việc điều hướng có thể nhanh chóng trở nên tẻ nhạt. May mắn thay, Beautiful Soup có chức năng tìm kiếm nên chúng tôi không phải điều hướng để truy xuất các phần tử HTML

Tìm kiếm các phần tử của thẻ

Phương thức

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8 lấy thẻ HTML làm đối số chuỗi và trả về danh sách các phần tử khớp với thẻ được cung cấp. Ví dụ: nếu chúng tôi muốn tất cả các thẻ
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
9 trong
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
1

soup.find_all("a")

Chúng tôi sẽ xem danh sách các thẻ

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
9 này dưới dạng đầu ra

[1, 2, 3]

Đây là bảng phân tích từng thành phần mà chúng tôi đã sử dụng để tìm kiếm thẻ

Chúng tôi cũng có thể tìm kiếm các thẻ của một lớp cụ thể bằng cách cung cấp đối số

soup.find_all("a")
2. Beautiful Soup sử dụng
soup.find_all("a")
2 vì
soup.find_all("a")
4 là từ khóa dành riêng trong Python. Hãy tìm kiếm tất cả
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
9 thẻ có lớp "phần tử"

soup.find_all("a", class_="element")

Vì chúng tôi chỉ có hai liên kết với lớp "phần tử", bạn sẽ thấy kết quả này

[1, 2]

Điều gì sẽ xảy ra nếu chúng tôi muốn tìm nạp các liên kết được nhúng bên trong các thẻ

from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
9? . Nó hoạt động giống như
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8 nhưng nó trả về phần tử phù hợp đầu tiên thay vì một danh sách. Nhập cái này vào vỏ của bạn

Hàm

soup.find_all("a")
8 và
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8 cũng chấp nhận biểu thức chính quy thay vì chuỗi. Đằng sau hậu trường, văn bản sẽ được lọc bằng cách sử dụng phương pháp
[1, 2, 3]
2 của biểu thức chính quy đã biên dịch. Ví dụ

import re

for tag in soup.find_all(re.compile("^b")):
    print(tag)

Danh sách khi lặp lại, tìm nạp các thẻ bắt đầu bằng ký tự

[1, 2, 3]
3 bao gồm và
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
7

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó


 

Body's title

line begins 1 2 3

line ends

Body's title

Chúng tôi đã đề cập đến những cách phổ biến nhất để nhận thẻ và thuộc tính của chúng. Đôi khi, đặc biệt là đối với các trang web ít động hơn, chúng tôi chỉ muốn văn bản từ đó. Hãy xem làm thế nào chúng ta có thể có được nó

Lấy toàn bộ văn bản

Hàm

[1, 2, 3]
5 lấy tất cả văn bản từ tài liệu HTML. Hãy lấy tất cả văn bản của tài liệu HTML

soup.get_text()

Đầu ra của bạn phải như thế này

$ pip3 install beautifulsoup4
0

Đôi khi các ký tự dòng mới được in, vì vậy đầu ra của bạn cũng có thể trông như thế này

$ pip3 install beautifulsoup4
1

Bây giờ chúng ta đã biết cách sử dụng Beautiful Soup, hãy tạo một trang web

Súp đẹp trong hành động - Tìm kiếm danh sách sách

Bây giờ chúng ta đã thành thạo các thành phần của Beautiful Soup, đã đến lúc áp dụng kiến ​​thức của chúng ta. Hãy xây dựng một trình cạp để trích xuất dữ liệu từ https. //sách. để cạo. com/ và lưu nó vào tệp CSV. Trang web chứa dữ liệu ngẫu nhiên về sách và là một không gian tuyệt vời để kiểm tra các kỹ thuật quét web của bạn

Đầu tiên, tạo một tệp mới có tên

[1, 2, 3]
6. Hãy nhập tất cả các thư viện chúng tôi cần cho tập lệnh này

$ pip3 install beautifulsoup4
2

Trong các mô-đun được đề cập ở trên

  • [1, 2, 3]
    
    7 - thực hiện yêu cầu URL và tìm nạp HTML của trang web
  • [1, 2, 3]
    
    8 - giới hạn số lần chúng tôi cạo trang cùng một lúc
  • [1, 2, 3]
    
    9 - giúp chúng tôi xuất dữ liệu cóp nhặt của mình sang tệp CSV
  • soup.find_all("a", class_="element")
    
    0 - cho phép chúng tôi viết các biểu thức chính quy sẽ hữu ích cho việc chọn văn bản dựa trên mẫu của nó
  • soup.find_all("a", class_="element")
    
    1 - thực sự là của bạn, mô-đun cạo để phân tích cú pháp HTML

Bạn đã cài đặt sẵn

soup.find_all("a", class_="element")
1 và
[1, 2, 3]
8,
[1, 2, 3]
9 và
soup.find_all("a", class_="element")
0 là các gói tích hợp sẵn trong Python. Bạn sẽ cần cài đặt trực tiếp mô-đun
[1, 2, 3]
7 như thế này

$ pip3 install beautifulsoup4
3

Trước khi bắt đầu, bạn cần hiểu cách cấu trúc HTML của trang web. Trong trình duyệt của bạn, hãy truy cập http. //sách. để cạo. com/catalogue/trang-1. html. Sau đó nhấp chuột phải vào các thành phần của trang web cần cạo và nhấp vào nút kiểm tra để hiểu phân cấp của các thẻ như hình bên dưới

Điều này sẽ hiển thị cho bạn HTML cơ bản cho những gì bạn đang kiểm tra. Hình ảnh sau đây minh họa các bước này

Từ việc kiểm tra HTML, chúng tôi tìm hiểu cách truy cập URL của sách, ảnh bìa, tiêu đề, xếp hạng, giá và nhiều trường khác từ HTML. Hãy viết một hàm cạo một mục sách và trích xuất dữ liệu của nó

Dòng cuối cùng của đoạn trích trên trỏ đến một hàm để ghi danh sách các chuỗi đã loại bỏ vào tệp CSV. Hãy thêm chức năng đó ngay bây giờ

Vì chúng tôi có một chức năng có thể quét một trang và xuất sang CSV, chúng tôi muốn một chức năng khác thu thập thông tin qua trang web được phân trang, thu thập dữ liệu sách trên mỗi trang

Để làm điều này, hãy xem URL mà chúng tôi đang viết trình quét này cho

$ pip3 install beautifulsoup4
4

Yếu tố thay đổi duy nhất trong URL là số trang. Chúng tôi có thể định dạng URL động để nó trở thành URL gốc

$ pip3 install beautifulsoup4
5

URL được định dạng chuỗi này với số trang có thể được tìm nạp bằng phương pháp

soup.find_all("a", class_="element")
7. Sau đó chúng ta có thể tạo một đối tượng
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
3 mới. Mỗi khi chúng tôi lấy đối tượng súp, sự hiện diện của nút "tiếp theo" sẽ được kiểm tra để chúng tôi có thể dừng ở trang cuối cùng. Chúng tôi theo dõi bộ đếm cho số trang tăng thêm 1 sau khi cạo trang thành công

Hàm ở trên,

soup.find_all("a", class_="element")
9, được gọi đệ quy cho đến khi hàm
[1, 2]
0 trả về
[1, 2]
1. Tại thời điểm này, mã sẽ cạo phần còn lại của trang web và thoát

Đối với phần cuối cùng của câu đố, chúng tôi bắt đầu quy trình cạo. Chúng tôi xác định

[1, 2]
2 và gọi
soup.find_all("a", class_="element")
9 để lấy dữ liệu. Điều này được thực hiện theo khối
[1, 2]
4

$ pip3 install beautifulsoup4
6

Nếu bạn muốn tìm hiểu thêm về khối

[1, 2]
4, hãy xem hướng dẫn của chúng tôi về cách thức hoạt động của nó

Bạn có thể thực thi tập lệnh như được hiển thị bên dưới trong thiết bị đầu cuối của mình và nhận đầu ra dưới dạng

$ pip3 install beautifulsoup4
7
$ pip3 install beautifulsoup4
8

Dữ liệu được cạo có thể được tìm thấy trong thư mục làm việc hiện tại dưới tên tệp

[1, 2]
6. Đây là một mẫu nội dung của tập tin

$ pip3 install beautifulsoup4
9

Làm tốt lắm. Nếu bạn muốn xem toàn bộ mã cạp, bạn có thể tìm thấy nó trên GitHub

Phần kết luận

Trong hướng dẫn này, chúng ta đã học được quy tắc viết web scraper tốt. Sau đó, chúng tôi đã sử dụng Beautiful Soup để trích xuất dữ liệu từ tệp HTML bằng cách sử dụng các thuộc tính đối tượng của Beautiful Soup và đó là các phương thức khác nhau như

soup.find_all("a")
8,
from bs4 import BeautifulSoup

with open("doc.html") as fp:
    soup = BeautifulSoup(fp, "html.parser")
8 và
[1, 2, 3]
5. Sau đó, chúng tôi đã xây dựng một trình thu thập thông tin để truy xuất danh sách sách trực tuyến và xuất sang CSV

Quét web là một kỹ năng hữu ích giúp thực hiện nhiều hoạt động khác nhau như trích xuất dữ liệu như API, thực hiện QA trên trang web, kiểm tra các URL bị hỏng trên trang web, v.v. Máy cạp tiếp theo bạn sẽ xây dựng là gì?