Thứ tư, 20/03/2019 | 00:00 GMT+7

Cách cạo các trang web với Beautiful Soup và Python 3

Nhiều dự án phân tích dữ liệu, dữ liệu lớn và máy học yêu cầu các trang web cóp nhặt để thu thập dữ liệu mà bạn sẽ làm việc. Ngôn ngữ lập trình Python được sử dụng rộng rãi trong cộng đồng khoa học dữ liệu và do đó có một hệ sinh thái các module và công cụ mà bạn có thể sử dụng trong các dự án của riêng mình. Trong hướng dẫn này, ta sẽ tập trung vào module Beautiful Soup.

Beautiful Soup , một ám chỉ đến bài hát của Mock Turtle được tìm thấy trong Chương 10 của Cuộc phiêu lưu của Alice ở xứ sở thần tiên của Lewis Carroll, là một thư viện Python cho phép quay vòng nhanh các dự án duyệt web. Hiện có sẵn dưới dạng Beautiful Soup 4 và tương thích với cả Python 2.7 và Python 3, Beautiful Soup tạo một cây phân tích cú pháp từ các trang HTML và XML đã được phân tích cú pháp (bao gồm các tài liệu có thẻ không đóng hoặc súp thẻ và đánh dấu không đúng định dạng khác).

Trong hướng dẫn này, ta sẽ thu thập và phân tích cú pháp một trang web để lấy dữ liệu văn bản và ghi thông tin ta thu thập được vào file CSV.

Yêu cầu

Trước khi thực hiện hướng dẫn này, bạn nên cài đặt môi trường lập trình Python cục bộ hoặc dựa trên server trên máy của bạn .

Bạn nên cài đặt các module Request và Beautiful Soup mà bạn có thể đạt được theo hướng dẫn của ta “ Cách làm việc với dữ liệu web bằng cách sử dụng các yêu cầu và Beautiful Soup với Python 3 ”. Nó cũng sẽ hữu ích nếu bạn làm quen với các module này.

Ngoài ra, vì ta sẽ làm việc với dữ liệu được lấy từ web, bạn nên cảm thấy thoải mái với cấu trúc HTML và gắn thẻ.

Hiểu dữ liệu

Trong hướng dẫn này, ta sẽ làm việc với dữ liệu từ trang web chính thức của National Gallery of Art ở USA . National Gallery là một bảo tàng nghệ thuật nằm trên National Mall ở Washington, DC. Nơi đây lưu giữ hơn 120.000 tác phẩm có niên đại từ thời Phục hưng cho đến ngày nay do hơn 13.000 nghệ sĩ thực hiện.

Ta muốn tìm kiếm Index của nghệ sĩ, trong đó, tại thời điểm cập nhật hướng dẫn này, có sẵn thông qua Internet Archive 's Wayback Machine tại URL sau:

https://web.archive.org/web/20170131230332/https://www.nga.gov/collection/an.shtm

Lưu ý : URL dài ở trên là do trang web này đã được lưu trữ bởi Internet Archive.

Internet Archive là một thư viện kỹ thuật số phi lợi nhuận cung cấp quyền truy cập miễn phí vào các trang web internet và các phương tiện kỹ thuật số khác. Tổ chức này chụp ảnh nhanh các trang web để lưu giữ lịch sử của các trang web và ta hiện có thể truy cập version cũ hơn của trang web của Thư viện Quốc gia đã có khi hướng dẫn này được viết lần đầu tiên. Internet Archive là một công cụ tốt cần lưu ý khi thực hiện bất kỳ loại quét dữ liệu lịch sử nào, bao gồm so sánh giữa các lần lặp lại của cùng một trang web và dữ liệu có sẵn.

Bên dưới tiêu đề của Kho lưu trữ Internet, bạn sẽ thấy một trang trông giống như sau:

Chỉ mục Trang đích của Nghệ sĩ

Vì ta sẽ thực hiện dự án này để tìm hiểu về cách cạo trang web với Beautiful Soup, ta không cần lấy quá nhiều dữ liệu từ trang web, vì vậy hãy giới hạn phạm vi dữ liệu nghệ sĩ mà ta đang tìm kiếm.Do đó, ta hãy chọn một chữ cái - trong ví dụ của ta , ta sẽ chọn chữ Z - và ta sẽ thấy một trang giống như sau:

Tên nghệ sĩ bắt đầu bằng danh sách Z

Trong trang trên, ta thấy rằng nghệ sĩ đầu tiên được liệt kê tại thời điểm viết bài là Zabaglia, Niccola , đây là một điều tốt cần lưu ý khi ta bắt đầu lấy dữ liệu. Ta sẽ bắt đầu bằng cách làm việc với trang đầu tiên này, với URL sau cho chữ Z :

https://web.archive.org/web/20121007172955/http://www.nga.gov/collection/an Z 1.htm

Điều quan trọng cần lưu ý là sau này có tổng cộng bao nhiêu trang cho bức thư bạn đang chọn để liệt kê, bạn có thể khám phá điều này bằng cách nhấp qua trang cuối cùng của các nghệ sĩ. Trong trường hợp này, có tổng cộng 4 trang, và nghệ sĩ cuối cùng được liệt kê tại thời điểm viết là Zykmund, Václav . Trang cuối cùng của nghệ sĩ Z có URL sau:

https://web.archive.org/web/20121010201041/http://www.nga.gov/collection/an Z 4.htm

Tuy nhiên , bạn cũng có thể truy cập trang trên bằng cách sử dụng cùng một chuỗi số Lưu trữ Internet của trang đầu tiên:

https://web.archive.org/web/ 20121007172955 /http://www.nga.gov/collection/an Z 4.htm

Điều quan trọng cần lưu ý vì ta sẽ lặp lại các trang này sau trong hướng dẫn này.

Để bắt đầu tự làm quen với cách cài đặt trang web này, bạn có thể xem qua DOM của nó, điều này sẽ giúp bạn hiểu cách cấu trúc HTML. Để kiểm tra DOM, bạn có thể mở Công cụ dành cho nhà phát triển của trình duyệt.

Nhập các thư viện

Để bắt đầu dự án mã hóa của ta , hãy kích hoạt môi trường lập trình Python 3 của ta . Đảm bảo rằng bạn đang ở trong folder chứa môi trường của bạn và chạy lệnh sau:

  • . my_env/bin/activate

Với môi trường lập trình của ta được kích hoạt, ta sẽ tạo một file mới, chẳng hạn với nano. Bạn có thể đặt tên file của bạn bạn muốn , ta sẽ gọi nó là nga_z_artists.py trong hướng dẫn này.

  • nano nga_z_artists.py

Trong file này, ta có thể bắt đầu nhập các thư viện mà ta sẽ sử dụng - Yêu cầu và Món canh đẹp.

Thư viện Yêu cầu cho phép bạn sử dụng HTTP trong các chương trình Python của bạn theo cách mà con người có thể đọc được và module Beautiful Soup được thiết kế để hoàn thành việc tìm kiếm trên web một cách nhanh chóng.

Ta sẽ nhập cả Yêu cầu và Súp đẹp với câu lệnh import . Đối với Beautiful Soup, ta sẽ nhập nó từ bs4 , gói trong đó Beautiful Soup 4 được tìm thấy.

nga_z_artists.py
# Import libraries import requests from bs4 import BeautifulSoup 

Với cả hai module Yêu cầu và Súp đẹp đã được nhập, ta có thể chuyển sang làm việc để thu thập một trang trước rồi phân tích cú pháp trang đó.

Thu thập và phân tích cú pháp một trang web

Bước tiếp theo ta cần làm là thu thập URL của trang web đầu tiên với Yêu cầu. Ta sẽ gán URL cho trang đầu tiên để các biến page bằng cách sử dụng các phương pháp requests.get() .

nga_z_artists.py
import requests from bs4 import BeautifulSoup   # Collect first page of artists’ list page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm') 

Lưu ý : Vì URL dài, mã ở trên và trong suốt hướng dẫn này sẽ không vượt qua PEP 8 E501 gắn cờ các dòng dài hơn 79 ký tự. Bạn có thể cần gán URL cho một biến để làm cho mã dễ đọc hơn trong các version cuối cùng. Mã trong hướng dẫn này dành cho mục đích demo và sẽ cho phép bạn swap các URL ngắn hơn như một phần của các dự án của bạn .

Bây giờ ta sẽ tạo một đối tượng BeautifulSoup hoặc một cây phân tích cú pháp. Đối tượng này lấy các đối số của nó là tài liệu page.text từ các Yêu cầu (nội dung phản hồi của server ) và sau đó phân tích cú pháp nó từ html.parser tích hợp sẵn của Python.

nga_z_artists.py
import requests from bs4 import BeautifulSoup   page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')  # Create a BeautifulSoup object soup = BeautifulSoup(page.text, 'html.parser') 

Với việc trang của ta được thu thập, phân tích cú pháp và cài đặt như một đối tượng BeautifulSoup , ta có thể chuyển sang thu thập dữ liệu mà ta muốn.

Kéo văn bản từ một trang web

Đối với dự án này, ta sẽ thu thập tên của các nghệ sĩ và các liên kết có liên quan có sẵn trên trang web. Bạn có thể cần thu thập các dữ liệu khác nhau, chẳng hạn như quốc tịch và ngày tháng của nghệ sĩ. Bất kỳ dữ liệu nào bạn muốn thu thập, bạn cần tìm hiểu cách mô tả dữ liệu đó bằng DOM của trang web.

Để thực hiện việc này, trong trình duyệt web , nhấp chuột phải - hoặc CTRL + nhấp vào macOS - vào tên nghệ sĩ đầu tiên, Zabaglia, Niccola . Trong menu ngữ cảnh bật lên, bạn sẽ thấy một mục menu tương tự như Kiểm tra phần tử (Firefox) hoặc Kiểm tra (Chrome).

Menu ngữ cảnh - Kiểm tra phần tử

Khi bạn nhấp vào mục menu Kiểm tra có liên quan, các công cụ dành cho nhà phát triển web sẽ xuất hiện trong trình duyệt của bạn. Ta muốn tìm lớp và các thẻ gắn với tên của các nghệ sĩ trong danh sách này.

Trình kiểm tra trang web

Đầu tiên ta sẽ thấy rằng bảng tên nằm trong <div> nơi class="BodyText" . Điều quan trọng cần lưu ý là ta chỉ tìm kiếm văn bản trong phần này của trang web. Ta cũng nhận thấy rằng tên Zabaglia, Niccola có trong thẻ liên kết, vì tên này tham chiếu đến trang web mô tả nghệ sĩ. Vì vậy, ta sẽ muốn tham chiếu thẻ <a> cho các liên kết. Tên của mỗi nghệ sĩ là một tham chiếu đến một liên kết.

Để làm điều này, ta sẽ sử dụng phương thức find()find_all() Beautiful Soup để lấy văn bản tên của các nghệ sĩ từ BodyText <div> .

nga_z_artists.py
import requests from bs4 import BeautifulSoup   # Collect and parse first page page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm') soup = BeautifulSoup(page.text, 'html.parser')  # Pull all text from the BodyText div artist_name_list = soup.find(class_='BodyText')  # Pull text from all instances of <a> tag within BodyText div artist_name_list_items = artist_name_list.find_all('a') 

Tiếp theo, ở cuối file chương trình của ta , ta sẽ muốn tạo một vòng lặp for để lặp lại tất cả các tên nghệ sĩ mà ta vừa đặt vào biến artist_name_list_items .

Ta sẽ in những tên này ra bằng phương thức prettify() để biến cây phân tích cú pháp Beautiful Soup thành một chuỗi Unicode được định dạng độc đáo.

nga_z_artists.py
... artist_name_list = soup.find(class_='BodyText') artist_name_list_items = artist_name_list.find_all('a')  # Create for loop to print out all artists' names for artist_name in artist_name_list_items:     print(artist_name.prettify()) 

Hãy chạy chương trình như ta có cho đến nay:

  • python nga_z_artists.py

Khi ta làm như vậy, ta sẽ nhận được kết quả sau:

Output
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630"> Zabaglia, Niccola </a> ... <a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=3427"> Zao Wou-Ki </a> <a href="/web/20121007172955/https://www.nga.gov/collection/anZ2.htm"> Zas-Zie </a> <a href="/web/20121007172955/https://www.nga.gov/collection/anZ3.htm"> Zie-Zor </a> <a href="/web/20121007172955/https://www.nga.gov/collection/anZ4.htm"> <strong> next <br/> page </strong> </a>

Những gì ta thấy trong kết quả tại thời điểm này là văn bản đầy đủ và các thẻ liên quan đến tên của tất cả các nghệ sĩ trong các thẻ <a> được tìm thấy trong <div class="BodyText"> trên trang đầu tiên, cũng như một số văn bản liên kết bổ sung ở dưới cùng. Vì ta không muốn có thêm thông tin này, ta hãy làm việc để loại bỏ thông tin này trong phần tiếp theo.

Loại bỏ dữ liệu thừa

Lúc này, ta đã có thể thu thập tất cả dữ liệu văn bản liên kết trong một phần <div> của trang web của ta . Tuy nhiên, ta không muốn có các liên kết dưới cùng không tham chiếu đến tên các nghệ sĩ, vì vậy ta hãy cố gắng xóa phần đó.

Để xóa các liên kết dưới cùng của trang, hãy nhấp lại chuột phải và Kiểm tra DOM. Ta sẽ thấy rằng các liên kết ở cuối phần <div class="BodyText"> được chứa trong một bảng HTML: <table class="AlphaNav"> :

Các liên kết trong Bảng HTML AlphaNav

Do đó, ta có thể sử dụng Beautiful Soup để tìm lớp AlphaNav và sử dụng phương thức decompose() để xóa một thẻ khỏi cây phân tích cú pháp và sau đó hủy nó cùng với nội dung của nó.

Ta sẽ sử dụng biến last_links để tham chiếu các liên kết dưới cùng này và thêm chúng vào file chương trình:

nga_z_artists.py
import requests from bs4 import BeautifulSoup   page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')  soup = BeautifulSoup(page.text, 'html.parser')  # Remove bottom links last_links = soup.find(class_='AlphaNav') last_links.decompose()  artist_name_list = soup.find(class_='BodyText') artist_name_list_items = artist_name_list.find_all('a')  for artist_name in artist_name_list_items:     print(artist_name.prettify()) 

Bây giờ, khi ta chạy chương trình bằng lệnh python nga_z_artist.py , ta sẽ nhận được kết quả sau:

Output
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630"> Zabaglia, Niccola </a> <a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=34202"> Zaccone, Fabian </a> ... <a href="/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=11631"> Zanotti, Giampietro </a> <a href="/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=3427"> Zao Wou-Ki </a>

Đến đây, ta thấy rằng kết quả không còn bao gồm các liên kết ở cuối trang web, và bây giờ chỉ hiển thị các liên kết được liên kết với tên của các nghệ sĩ.

Cho đến bây giờ, ta đã nhắm đến cụ thể các liên kết có tên của các nghệ sĩ, nhưng ta có thêm dữ liệu thẻ mà ta không thực sự muốn. Hãy loại bỏ điều đó trong phần tiếp theo.

Kéo nội dung từ thẻ

Để chỉ truy cập vào tên các nghệ sĩ thực, ta sẽ muốn nhắm đến nội dung của các thẻ <a> thay vì in ra toàn bộ thẻ liên kết.

Ta có thể làm điều này với .contents của Beautiful Soup, nó sẽ trả về thẻ con của thẻ dưới dạng dữ liệu danh sách Python.

Hãy sửa lại vòng lặp for để thay vì in toàn bộ liên kết và thẻ của nó, ta sẽ in danh sách các con (tức là tên đầy đủ của các nghệ sĩ):

nga_z_artists.py
import requests from bs4 import BeautifulSoup   page = requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ1.htm')  soup = BeautifulSoup(page.text, 'html.parser')  last_links = soup.find(class_='AlphaNav') last_links.decompose()  artist_name_list = soup.find(class_='BodyText') artist_name_list_items = artist_name_list.find_all('a')  # Use .contents to pull out the <a> tag’s children for artist_name in artist_name_list_items:     names = artist_name.contents[0]     print(names) 

Lưu ý ta đang lặp lại danh sách trên bằng cách gọi số index của mỗi mục.

Ta có thể chạy chương trình bằng lệnh python để xem kết quả sau:

Output
Zabaglia, Niccola Zaccone, Fabian Zadkine, Ossip ... Zanini-Viola, Giuseppe Zanotti, Giampietro Zao Wou-Ki

Ta đã nhận được danh sách tất cả các nghệ sĩ có trên trang đầu tiên của chữ Z.

Tuy nhiên, điều gì sẽ xảy ra nếu ta muốn nắm bắt các URL được liên kết với những nghệ sĩ đó? Ta có thể extract các URL được tìm thấy trong các thẻ <a> của trang bằng cách sử dụng phương thức get('href') của Beautiful Soup.

Từ kết quả kết quả của các liên kết ở trên, ta biết rằng toàn bộ URL không được nắm bắt, vì vậy ta sẽ nối chuỗi liên kết với phía trước của chuỗi URL (trong trường hợp này là https://web.archive.org/ ).

Những dòng này ta cũng sẽ thêm vào vòng lặp for :

nga_z_artists.py
... for artist_name in artist_name_list_items:     names = artist_name.contents[0]     links = 'https://web.archive.org' + artist_name.get('href')     print(names)     print(links) 

Khi ta chạy chương trình ở trên, ta sẽ nhận được cả tên của nghệ sĩ và URL của các liên kết cho ta biết thêm về các nghệ sĩ:

Output
Zabaglia, Niccola https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630 Zaccone, Fabian https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=34202 ... Zanotti, Giampietro https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11631 Zao Wou-Ki https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=3427

Mặc dù ta hiện đang lấy thông tin từ trang web, nhưng hiện tại nó chỉ đang in ra cửa sổ terminal của ta . Thay vào đó, ta hãy nắm bắt dữ liệu này để ta có thể sử dụng nó ở nơi khác bằng cách ghi nó vào một file .

Ghi dữ liệu vào file CSV

Việc thu thập dữ liệu chỉ tồn tại trong một cửa sổ terminal không hữu ích lắm. Tệp giá trị được phân tách bằng dấu phẩy (CSV) cho phép ta lưu trữ dữ liệu dạng bảng ở dạng văn bản thuần túy và là định dạng phổ biến cho bảng tính và database . Trước khi bắt đầu với phần này, bạn nên tự làm quen với cách xử lý các file văn bản thuần túy trong Python .

Đầu tiên, ta cần nhập module csv hợp sẵn của Python cùng với các module khác ở đầu file lập trình Python:

import csv 

Tiếp theo, ta sẽ tạo và mở một file có tên z-artist-names .csv để ta ghi vào ( ta sẽ sử dụng biến f cho file ở đây) bằng cách sử dụng chế độ 'w' . Ta cũng sẽ viết các tiêu đề hàng trên cùng: NameLink mà ta sẽ chuyển đến phương thức writerow() dưới dạng danh sách:

f = csv.writer(open('z-artist-names.csv', 'w')) f.writerow(['Name', 'Link']) 

Cuối cùng, trong vòng lặp for của ta , ta sẽ viết mỗi hàng với names của các nghệ sĩ và các liên links quan của họ:

f.writerow([names, links]) 

Bạn có thể xem các dòng cho từng tác vụ này trong file bên dưới:

nga_z_artists.py
import requests import csv from bs4 import BeautifulSoup   page = requests.get('https://web.archive.org/web/20121007172955/http://www.nga.gov/collection/anZ1.htm')  soup = BeautifulSoup(page.text, 'html.parser')  last_links = soup.find(class_='AlphaNav') last_links.decompose()  # Create a file to write to, add headers row f = csv.writer(open('z-artist-names.csv', 'w')) f.writerow(['Name', 'Link'])  artist_name_list = soup.find(class_='BodyText') artist_name_list_items = artist_name_list.find_all('a')  for artist_name in artist_name_list_items:     names = artist_name.contents[0]     links = 'https://web.archive.org' + artist_name.get('href')       # Add each artist’s name and associated link to a row     f.writerow([names, links]) 

Khi bạn chạy chương trình ngay bây giờ bằng lệnh python , không có kết quả nào được trả về cửa sổ terminal của bạn. Thay vào đó, một file sẽ được tạo trong folder bạn đang làm việc có tên là z-artist-names .csv .

Tùy thuộc vào những gì bạn sử dụng để mở nó, nó có thể trông giống như sau:

z-artist-names.csv
Name,Link "Zabaglia, Niccola",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=11630 "Zaccone, Fabian",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=34202 "Zadkine, Ossip",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=3475w ... 

Hoặc, nó có thể trông giống một bảng tính hơn:

Bảng tính CSV

Trong cả hai trường hợp, bây giờ bạn có thể sử dụng file này để làm việc với dữ liệu theo những cách có ý nghĩa hơn vì thông tin bạn đã thu thập hiện được lưu trữ trong bộ nhớ máy tính của bạn.

Ta đã tạo ra một chương trình sẽ lấy dữ liệu từ trang đầu tiên của danh sách các nghệ sĩ có họ bắt đầu bằng chữ Z. Tuy nhiên, có 4 trang trong tổng số các nghệ sĩ này có sẵn trên trang web.

Để thu thập tất cả các trang này, ta có thể thực hiện nhiều lần lặp hơn với vòng lặp for . Điều này sẽ sửa đổi hầu hết các mã ta đã viết cho đến nay, nhưng sẽ sử dụng các khái niệm tương tự.

Để bắt đầu, ta sẽ muốn khởi tạo một danh sách để chứa các trang:

pages = [] 

Ta sẽ điền danh sách đã khởi tạo này với vòng lặp for sau:

for i in range(1, 5):     url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ' + str(i) + '.htm'     pages.append(url) 

Trước đó trong hướng dẫn này , ta đã lưu ý ta nên chú ý đến tổng số trang có chứa tên các nghệ sĩ bắt đầu bằng chữ Z (hoặc bất kỳ chữ cái nào ta đang sử dụng). Vì có 4 trang cho chữ Z , ta đã xây dựng vòng lặp for ở trên với phạm vi từ 1 đến 5 để nó sẽ lặp lại qua từng trang trong số 4 trang.

Đối với trang web cụ thể này, các URL bắt đầu bằng chuỗi https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ và sau đó được theo sau bằng một số cho trang ( sẽ là số nguyên i từ vòng lặp for mà ta chuyển đổi thành một chuỗi ) và kết thúc bằng .htm . Ta sẽ nối các chuỗi này lại với nhau và sau đó nối kết quả vào danh sách pages .

Ngoài vòng lặp này, ta sẽ có một vòng lặp thứ hai sẽ đi qua từng trang ở trên. Mã trong vòng lặp for này sẽ trông tương tự như mã mà ta đã tạo cho đến nay, vì nó đang thực hiện nhiệm vụ mà ta đã hoàn thành cho trang đầu tiên của các nghệ sĩ chữ Z cho mỗi trang trong tổng số 4 trang. Lưu ý vì ta đã đặt chương trình root vào vòng lặp for thứ hai, nên bây giờ ta có vòng lặp ban đầu như một vòng lặp for lồng nhau chứa trong đó.

Hai vòng lặp for sẽ giống như sau:

pages = []  for i in range(1, 5):     url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ' + str(i) + '.htm'     pages.append(url)  for item in pages:     page = requests.get(item)     soup = BeautifulSoup(page.text, 'html.parser')      last_links = soup.find(class_='AlphaNav')     last_links.decompose()      artist_name_list = soup.find(class_='BodyText')     artist_name_list_items = artist_name_list.find_all('a')      for artist_name in artist_name_list_items:         names = artist_name.contents[0]         links = 'https://web.archive.org' + artist_name.get('href')          f.writerow([names, links]) 

Trong đoạn mã trên, bạn sẽ thấy rằng vòng lặp for đầu tiên đang lặp lại các trang và vòng lặp for thứ hai đang quét dữ liệu từ mỗi trang đó và sau đó thêm tên của các nghệ sĩ và liên kết từng dòng qua mỗi hàng của mỗi trang .

Hai vòng lặp for này nằm bên dưới các câu lệnh import , tạo và ghi file CSV (với dòng để ghi tiêu đề của file ) và khởi tạo biến pages (được gán cho danh sách).

Trong ngữ cảnh lớn hơn của file lập trình, mã hoàn chỉnh trông giống như sau:

nga_z_artists.py
import requests import csv from bs4 import BeautifulSoup   f = csv.writer(open('z-artist-names.csv', 'w')) f.writerow(['Name', 'Link'])  pages = []  for i in range(1, 5):     url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ' + str(i) + '.htm'     pages.append(url)   for item in pages:     page = requests.get(item)     soup = BeautifulSoup(page.text, 'html.parser')      last_links = soup.find(class_='AlphaNav')     last_links.decompose()      artist_name_list = soup.find(class_='BodyText')     artist_name_list_items = artist_name_list.find_all('a')      for artist_name in artist_name_list_items:         names = artist_name.contents[0]         links = 'https://web.archive.org' + artist_name.get('href')          f.writerow([names, links])  

Vì chương trình này đang thực hiện một chút công việc, sẽ mất một chút thời gian để tạo file CSV. Sau khi hoàn thành, kết quả sẽ hoàn chỉnh, hiển thị tên của các nghệ sĩ và các liên kết liên quan của họ từ Zabaglia, Niccola đến Zykmund, Václav .

Cân nhắc

Khi rà soát các trang web, điều quan trọng là phải xem xét các server mà bạn đang lấy thông tin từ đó.

Kiểm tra xem liệu một trang web có điều khoản dịch vụ hoặc điều khoản sử dụng liên quan đến việc tìm kiếm web hay không. Ngoài ra, hãy kiểm tra xem liệu một trang web có API cho phép bạn lấy dữ liệu trước khi tự cạo nó hay không.

Đảm bảo không liên tục đánh server để thu thập dữ liệu. Khi bạn đã thu thập những gì bạn cần từ một trang web, hãy chạy các tập lệnh sẽ chuyển dữ liệu local thay vì tạo gánh nặng cho server của người khác.

Ngoài ra, tốt hơn hết bạn nên sử dụng tiêu đề có tên và email của bạn để trang web có thể nhận dạng bạn và theo dõi nếu họ có bất kỳ câu hỏi nào. Ví dụ về tiêu đề bạn có thể sử dụng với thư viện Yêu cầu Python như sau:

import requests  headers = {     'User-Agent': 'Your Name, example.com',     'From': 'email@example.com' }  url = 'https://example.com'  page = requests.get(url, headers = headers)  

Việc sử dụng tiêu đề có thông tin nhận dạng đảm bảo những người xem qua log của server có thể liên hệ với bạn.

Kết luận

Hướng dẫn này đã sử dụng Python và Beautiful Soup để thu thập dữ liệu từ một trang web. Ta đã lưu trữ văn bản mà ta thu thập được trong file CSV.

Bạn có thể tiếp tục làm việc với dự án này bằng cách thu thập thêm dữ liệu và làm cho file CSV của bạn mạnh mẽ hơn. Ví dụ: bạn có thể cần bao gồm quốc tịch và năm của từng nghệ sĩ. Bạn cũng có thể sử dụng những gì bạn đã học để thu thập dữ liệu từ các trang web khác.

Để tiếp tục tìm hiểu về cách lấy thông tin từ web, hãy đọc hướng dẫn của ta “ Cách thu thập thông tin một trang web bằng Scrapy và Python 3 ”.


Tags:

Các tin liên quan

Cách thu thập thông tin một trang web với Scrapy và Python 3
2019-03-20
Cách sử dụng API Web trong Python 3
2019-03-20
Tạo ứng dụng web tiến bộ (PWA) với React
2019-03-02
Tụ điện: Chạy ứng dụng web trên thiết bị di động
2019-02-27
Cách gửi thông báo đẩy web từ ứng dụng Django
2018-10-24
Cách xây dựng ứng dụng web hiện đại để quản lý thông tin khách hàng với Django và React trên Ubuntu 18.04
2018-10-22
Cách cài đặt Django Web Framework trên Ubuntu 18.04
2018-08-06
Cách sử dụng Trình quản lý cảnh báo và Trình xuất hộp đen để giám sát web server của bạn trên Ubuntu 16.04
2018-05-11
Giải pháp Deep Dive: Xây dựng một ứng dụng web khả dụng cao với khả năng xử lý và lưu trữ web bằng cách sử dụng MongoDB và Elk Stack
2018-03-15
Các bước đầu tiên của bạn với API âm thanh web
2018-01-09