Trong bài viết này, tôi sẽ tạo một công cụ quét web bằng Python để quét các trang Wikipedia.
Máy quét sẽ chuyển đến một trang Wikipedia, cạo tiêu đề và theo một liên kết ngẫu nhiên đến trang Wikipedia tiếp theo.
Tôi nghĩ sẽ rất thú vị khi xem những trang Wikipedia ngẫu nhiên mà máy quét này sẽ truy cập!
Thiết lập cạp
Để bắt đầu, tôi sẽ tạo một tệp python mới có tên scraper.py
:
touch scraper.py
Để thực hiện yêu cầu HTTP, tôi sẽ sử dụng requests
thư viện. Bạn có thể cài đặt nó bằng lệnh sau:
pip install requests
Hãy sử dụng trang wiki cạo web làm điểm bắt đầu của chúng tôi:
import requests
response = requests.get(
url="https://en.wikipedia.org/wiki/Web_scraping",
)
print(response.status_code)
Khi chạy trình cạp, nó sẽ hiển thị mã trạng thái 200:
python3 scraper.py
200
Được rồi, cho đến nay rất tốt! ?
Hãy trích xuất tiêu đề từ trang HTML. Để làm cho cuộc sống của tôi dễ dàng hơn, tôi sẽ sử dụng gói BeautifulSoup cho việc này.
pip install beautifulsoup4
Khi kiểm tra trang Wikipedia tôi thấy rằng thẻ tiêu đề có #firstHeading
TÔI.

Súp đẹp cho phép bạn tìm một phần tử bằng thẻ ID.
title = soup.find(id="firstHeading")
Kết hợp tất cả lại với nhau, chương trình bây giờ trông như thế này:
import requests
from bs4 import BeautifulSoup
response = requests.get(
url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.string)
Và khi chạy chương trình này, nó hiển thị tiêu đề của bài viết Wiki: ?
python3 scraper.py
Web scraping
Cạo các liên kết khác
Bây giờ tôi sẽ đi sâu vào Wikipedia. Tôi sẽ lấy ngẫu nhiên <a>
gắn thẻ vào một bài viết Wikipedia khác và cạo trang đó.
Để làm điều này, tôi sẽ sử dụng món súp đẹp mắt để tìm tất cả <a>
các thẻ trong bài viết wiki. Sau đó, tôi xáo trộn danh sách để biến nó thành ngẫu nhiên.
import requests
from bs4 import BeautifulSoup
import random
response = requests.get(
url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.content)
# Get all the links
allLinks = soup.find(id="bodyContent").find_all("a")
random.shuffle(allLinks)
linkToScrape = 0
for link in allLinks:
# We are only interested in other wiki articles
if link['href'].find("/wiki/") == -1:
continue
# Use this link to scrape
linkToScrape = link
break
print(linkToScrape)
Như bạn có thể thấy, tôi sử dụng soup.find(id="bodyContent").find_all("a")
để tìm tất cả các <a>
các thẻ trong bài viết chính.
Vì tôi chỉ quan tâm đến các liên kết đến các bài viết khác trên wikipedia, nên tôi đảm bảo rằng liên kết đó chứa /wiki
tiếp đầu ngữ.
Bây giờ khi chạy chương trình, nó sẽ hiển thị một liên kết đến một bài viết wikipedia khác, thật tuyệt!
python3 scraper.py
<a href="https://www.freecodecamp.org/wiki/Link_farm" title="Link farm">Link farm</a>
Tạo một cạp vô tận
Được rồi, hãy làm cho máy cạo thực sự cạo liên kết mới.
Để làm điều này, tôi sẽ chuyển mọi thứ vào một scrapeWikiArticle
chức năng.
import requests
from bs4 import BeautifulSoup
import random
def scrapeWikiArticle(url):
response = requests.get(
url=url,
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.text)
allLinks = soup.find(id="bodyContent").find_all("a")
random.shuffle(allLinks)
linkToScrape = 0
for link in allLinks:
# We are only interested in other wiki articles
if link['href'].find("/wiki/") == -1:
continue
# Use this link to scrape
linkToScrape = link
break
scrapeWikiArticle("https://en.wikipedia.org" + linkToScrape['href'])
scrapeWikiArticle("https://en.wikipedia.org/wiki/Web_scraping")
Các scrapeWikiArticle
sẽ lấy bài viết wiki, trích xuất tiêu đề và tìm một liên kết ngẫu nhiên.
Sau đó, nó sẽ gọi scrapeWikiArticle
một lần nữa với liên kết mới này. Do đó, nó tạo ra một chu kỳ vô tận của một Scraper xuất hiện khắp nơi trên wikipedia.
Hãy chạy chương trình và xem những gì chúng tôi nhận được:
pythron3 scraper.py
Web scraping
Digital object identifier
ISO 8178
STEP-NC
ISO/IEC 2022
EBCDIC 277
Code page 867
Code page 1021
EBCDIC 423
Code page 950
G
R
Mole (unit)
Gram
Remmius Palaemon
Encyclopædia Britannica Eleventh Edition
Geography
Gender studies
Feminism in Brazil
Tuyệt vời, trong khoảng 10 bước, chúng tôi đã chuyển từ “Tìm kiếm trên web” sang “Chủ nghĩa nữ quyền ở Brazil”. Kinh ngạc!
Phần kết luận
Chúng tôi đã xây dựng một công cụ quét web bằng Python để quét các trang Wikipedia ngẫu nhiên. Nó xuất hiện không ngừng trên Wikipedia bằng cách đi theo các liên kết ngẫu nhiên.
Đây là một mánh lới quảng cáo thú vị và Wikipedia khá khoan dung khi đề cập đến việc thu thập thông tin trên web.
Ngoài ra còn có các trang web khó cạo hơn như Amazon hoặc Google. Nếu bạn muốn cạo một trang web như vậy, bạn nên thiết lập một hệ thống có trình duyệt Chrome không đầu và máy chủ proxy. Hoặc bạn có thể sử dụng một dịch vụ xử lý tất cả những thứ đó cho bạn như dịch vụ này.
Nhưng hãy cẩn thận để không lạm dụng các trang web và chỉ cạo dữ liệu mà bạn được phép cạo.
Chúc mừng mã hóa!