Giới thiệu
Quét web đang 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 trong các 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ì 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 về sự cố trên web trong Python với súp đẹp - một thư viện Python nổi tiếng để phân tích HTML và XML.
Xóa web đạo đức
Quét web có mặt khắp nơi 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, là những công dân tốt của Internet, trách nhiệm của chúng tôi là tôn trọng các chủ sở hữu trang web mà chúng tôi cào. Dưới đây là một số nguyên tắc mà một người cạo web nên tuân thủ:
- Đừng yêu cầu nội dung bị loại bỏ là của riêng chúng tôi. Chủ sở hữu trang web đôi khi dành một lượng thời gian dài để tạo ra các bài báo, thu thập chi tiết về sản phẩm hoặc thu hoạch nội dung khác. Chúng ta phải tôn trọng lao động và độc đáo của họ.
- Đừng cạo một trang web không muốn được cạo. Các trang web đôi khi đi kèm với một tệp
7 - xác định các phần của trang web có thể được xóa. Nhiều trang web cũng có một đ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 các trang web không muốn được cạo.from bs4 import BeautifulSoup with open["doc.html"] as fp: soup = BeautifulSoup[fp, "html.parser"]
- Có API có sẵn không? Lộng lẫy, không cần chúng tôi viết một cái cào. 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 định nghĩa của chủ sở hữu dữ liệu. Chúng tôi thích sử dụng API nếu chúng có sẵn.
- Thực hiện yêu cầu đến một trang web có thể gây ra một khoản phí cho hiệu suất của trang web. Một cái cào web thực hiện quá nhiều yêu cầu có thể bị suy nhược như một cuộc tấn công DDoS. Chúng tôi phải cạo có trách nhiệm để chúng tôi không gây ra bất kỳ sự gián đoạn nào đối với hoạt động thường xuyên của trang web.
Tổng quan về món súp đẹp
Nội dung HTML của các trang web có thể được phân tích cú pháp và cạo bằng súp đẹp. Trong phần sau, chúng tôi sẽ bao gồm các chức năng hữu ích cho việc xóa các trang web.
Điều làm cho súp đẹp 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 này 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 làm thế nào chúng ta có thể phân tích HTML với súp đẹp. Xem xét trang HTML sau được lưu vào tệp là
from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
8:
Head's title
Body's title
line begins
1
2
3
line ends
Các đoạn mã sau đây được kiểm tra trên
from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
9. Bạn có thể cài đặt mô -đun soup.head.title # returns Head's title
0 bằng cách nhập lệnh sau vào thiết bị đầu cuối:$ pip3 install beautifulsoup4
Tệp HTML
from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
8 cần được chuẩn bị. Điều này được thực hiện bằng cách chuyển tệp cho hàm tạo soup.head.title # returns Head's title
0, chúng ta hãy sử dụng Shell Python tương tác cho việc này, vì vậy chúng ta có thể in ngay nội dung của một phần cụ thể của một 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 súp đẹp để điều hướng trang web của chúng tôi và trích xuất dữ liệu.
Điều hướng đến các thẻ cụ thể
Từ đối tượng súp được tạo trong 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"]
8:soup.head.title # returns Head's title
Đây là sự cố của từng thành phần chúng tôi đã sử dụng để có được tiêu đề:
Súp đẹp rất mạnh mẽ vì các đối tượng Python của chúng ta phù hợp với cấu trúc lồng nhau của tài liệu HTML mà chúng ta đang cạo.
Để nhận văn bản của thẻ
soup.head.title # returns Head's title
4 đầu tiên, hãy nhập cái này:soup.body.a.text # returns '1'
Để có được tiêu đề trong thẻ cơ thể của HTML [được biểu thị bằng lớp "Tiêu đề"], hãy nhập các loại sau trong thiết bị đầu cuối của bạn:
soup.body.p.b # returns Body's title
Đối với các tài liệu HTML được lồng sâu, điều hướng có thể nhanh chóng trở nên tẻ nhạt. May mắn thay, súp đẹp đi kèm với chức năng tìm kiếm vì vậy chúng tôi không phải điều hướng để lấy các yếu tố HTML.
Tìm kiếm các yếu tố của thẻ
Phương thức
soup.head.title # returns Head's title
5 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 ta muốn tất cả các thẻ soup.head.title # returns Head's title
6 trong from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
8:soup.find_all["a"]
Chúng ta sẽ thấy danh sách các thẻ
soup.head.title # returns Head's title
6 này làm đầu ra:[1, 2, 3]
Dưới đây là sự cố của từng thành phần chúng tôi sử dụng để tìm kiếm thẻ:
Chúng tôi 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.head.title # returns Head's title
9. Súp đẹp sử dụng soup.head.title # returns Head's title
9 vì soup.body.a.text # returns '1'
1 là một từ khóa dành riêng trong Python. Hãy tìm kiếm tất cả các thẻ soup.head.title # returns Head's title
6 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 đầu ra này:
[1, 2]
Điều gì sẽ xảy ra nếu chúng ta muốn tìm nạp các liên kết được nhúng bên trong các thẻ
soup.head.title # returns Head's title
6? Chúng ta hãy truy xuất thuộc tính soup.body.a.text # returns '1'
4 của liên kết bằng tùy chọn soup.body.a.text # returns '1'
5. Nó hoạt động giống như soup.head.title # returns Head's title
5 nhưng nó trả về phần tử phù hợp đầu tiên thay vì danh sách. Nhập cái này vào vỏ của bạn:$ pip3 install beautifulsoup4
0Các hàm
soup.body.a.text # returns '1'
5 và soup.head.title # returns Head's title
5 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 phương pháp soup.body.a.text # returns '1'
9 biểu thức được biên dịch. Ví dụ:$ pip3 install beautifulsoup4
1Danh sách khi lặp lại, tìm nạp các thẻ bắt đầu bằng ký tự
soup.body.p.b # returns Body's title
0 bao gồm soup.body.p.b # returns Body's title
1 và soup.body.p.b # returns Body's title
2:Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!
$ pip3 install beautifulsoup4
2Chúng tôi đã đề cập đến các 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 năng động hơn, chúng tôi chỉ muốn văn bản từ nó. Hãy xem làm thế nào chúng ta có thể có được nó!
Nhận toàn bộ văn bản
Hàm
soup.body.p.b # returns Body's title
3 lấy tất cả cá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:$ pip3 install beautifulsoup4
3Đầu ra của bạn sẽ như thế này:
$ pip3 install beautifulsoup4
4Đôi khi các ký tự mới được in, vì vậy đầu ra của bạn cũng có thể trông giống như thế này:
$ pip3 install beautifulsoup4
5Bây giờ chúng ta có cảm giác về cách sử dụng súp đẹp, hãy cạo một trang web!
Súp đẹp trong hành động - Quét danh sách sách
Bây giờ chúng tôi đã thành thạo các thành phần của súp đẹp, đã đến lúc phải học cách sử dụng. Hãy xây dựng một cạp để trích xuất dữ liệu từ //books.toscrape.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
soup.body.p.b # returns Body's title
4. Hãy nhập tất cả các thư viện mà chúng tôi cần cho tập lệnh này:$ pip3 install beautifulsoup4
6Trong các mô -đun được đề cập ở trên:
5 - Thực hiện yêu cầu URL và tìm kiếm HTML của trang websoup.body.p.b # returns Body's title
6 - Giới hạn số lần chúng tôi cạo trên trang cùng một lúcsoup.body.p.b # returns Body's title
7 - Giúp chúng tôi xuất dữ liệu được quét vào tệp CSVsoup.body.p.b # returns Body's title
8 - Cho phép chúng tôi viết các biểu thức chính quy sẽ có ích để chọn văn bản dựa trên mẫu của nósoup.body.p.b # returns Body's title
9 - của bạn thực sự, mô -đun cạo để phân tích HTMLsoup.body.p.b # returns Body's title
Bạn sẽ có
soup.body.p.b # returns Body's title
9 đã được cài đặt và soup.body.p.b # returns Body's title
6, soup.body.p.b # returns Body's title
7 và soup.body.p.b # returns Body's title
8 là các gói tích hợp trong Python. Bạn sẽ cần cài đặt mô -đun soup.body.p.b # returns Body's title
5 trực tiếp như thế này:$ pip3 install beautifulsoup4
7Trước khi bạn 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, chúng ta hãy truy cập //books.toscrape.com/catalogue/page-1.html. Sau đó, nhấp chuột phải vào các thành phần của trang web sẽ được cạo và nhấp vào nút Kiểm tra để hiểu hệ thống phân cấp của các thẻ như được hiển thị bên dưới.inspect button to understand the hierarchy of the tags as shown below.
Điều này sẽ cho bạn thấy 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 sau:
Từ việc kiểm tra HTML, chúng tôi tìm hiểu cách truy cập URL của cuốn sách, hình ảnh bìa, tiêu đề, xếp hạng, giá cả và nhiều trường hơn từ HTML. Hãy viết một chức năng loại bỏ một mục sách và trích xuất dữ liệu của nó:
$ pip3 install beautifulsoup4
8Dòng cuối cùng của đoạn trích trên chỉ vào một hàm để viết danh sách các chuỗi được quét vào tệp CSV. Hãy thêm chức năng đó ngay bây giờ:
$ pip3 install beautifulsoup4
9Vì chúng tôi có một chức năng có thể cạo 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 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, chúng ta hãy nhìn vào URL mà chúng ta đang viết cái cào này cho:
from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
0Phần tử khác nhau duy nhất trong URL là số trang. Chúng ta có thể định dạng URL động để nó trở thành URL hạt giống:
from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
1Chuỗi này được định dạng URL với số trang có thể được tìm nạp bằng phương thức
soup.find_all["a"]
5. Sau đó chúng ta có thể tạo một đối tượng soup.head.title # returns Head's title
0 mới. Mỗi lần chúng tôi nhận được đối tượng súp, sự hiện diện của nút "tiếp theo" được kiểm tra để chúng tôi có thể dừng ở trang cuối. Chúng tôi theo dõi một bộ đếm cho số trang được tăng thêm 1 sau khi cạo thành công một trang.from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
2Hàm ở trên,
soup.find_all["a"]
7, được gọi đệ quy cho đến khi hàm soup.find_all["a"]
8 trả về soup.find_all["a"]
9. Tại thời điểm này, mã sẽ xóa phần còn lại của trang web và lối ra.Đối với phần cuối cùng của câu đố, chúng tôi bắt đầu dòng chảy. Chúng tôi xác định
[1, 2, 3]
0 và gọi soup.find_all["a"]
7 để lấy dữ liệu. Điều này được thực hiện trong khối [1, 2, 3]
2:from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
3Nếu bạn muốn tìm hiểu thêm về khối
[1, 2, 3]
2, hãy xem hướng dẫn của chúng tôi về cách thức hoạt động.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 là:
from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
4from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
5Dữ liệu đã được tìm thấy trong thư mục làm việc hiện tại theo tên tệp
[1, 2, 3]
4. Đây là mẫu nội dung của tệp:from bs4 import BeautifulSoup
with open["doc.html"] as fp:
soup = BeautifulSoup[fp, "html.parser"]
6Làm tốt lắm! Nếu bạn muốn có một cái nhìn toàn bộ mã Scraper, bạn có thể tìm thấy nó trên GitHub.
Sự kết luận
Trong hướng dẫn này, chúng tôi đã học được đạo đức của việc viết những người phế liệu web tốt. Sau đó, chúng tôi đã sử dụng súp đẹp để trích xuất dữ liệu từ tệp HTML bằng các thuộc tính đối tượng của súp đẹp và đó là các phương pháp khác nhau như
soup.body.a.text # returns '1'
5, soup.head.title # returns Head's title
5 và soup.body.p.b # returns Body's title
3. Sau đó, chúng tôi đã xây dựng một cạp hơn là lấy mộ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 các 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à hơn thế nữa. Cẩu tiếp theo bạn sẽ xây dựng là gì?