1. Giới thiệu về các trang web động
Nếu bạn từng cố gắng scrape dữ liệu từ các trang web
cập nhật nội dung ngay lập tức nhờ JavaScript, thì bạn
sẽ biết rằng điều này có thể trở thành một câu đố thực thụ. Nhưng đừng
lo lắng! Như người ta thường nói, mọi đoạn code phức tạp đều có thể
được cài đặt để trở nên giống như phép thuật. Hãy cùng tìm hiểu cách
requests_html
cho phép chúng ta làm việc với nội dung kiểu này.
Như đã biết, không phải tất cả các trang web đều có cùng giá trị. Một số trang tải nội dung ngay lập tức, trong khi những trang khác có thể tạo hoặc cập nhật nội dung một cách động bằng JavaScript. Điều này tạo ra một số khó khăn cho những ai muốn trích xuất dữ liệu, bởi HTML mà bạn nhìn thấy qua công cụ dành cho nhà phát triển có thể khác với HTML mà bạn nhận được khi thực hiện một yêu cầu thông thường.
Vấn đề phát sinh khi scrape nội dung động
Phần lớn các thư viện làm việc với web, như là requests, chỉ làm việc với phản hồi từ server và không thể thực thi JavaScript. Điều này có nghĩa là nếu nội dung được tải hoặc thay đổi thông qua JavaScript, bạn có thể không thấy chúng khi thực hiện một yêu cầu thông thường.
2. Sử dụng thư viện requests_html
Và đây là lúc requests_html
xuất hiện — một thư viện
kết hợp sự đơn giản của requests và sức mạnh của trình duyệt
để thực thi JavaScript. Nó cung cấp cho bạn một engine cơ bản
để render, cho phép tương tác với
các trang web động giống như bạn đang sử dụng
một trình duyệt thực sự.
Cài đặt và cấu hình thư viện
Để bắt đầu, hãy cài đặt thư viện requests_html
. Mở
terminal yêu thích của bạn và chạy lệnh sau:
pip install requests-html
Tuyệt vời, thư viện đã được cài đặt! Bây giờ chúng ta có thể làm việc với nó.
Cơ bản sử dụng requests_html
để trích xuất
nội dung JavaScript
requests_html
làm cho cuộc sống của chúng ta đơn giản hơn. Hãy xem cách nó hoạt động trên thực tế. Giả sử chúng ta có một
trang tạo ra một số dữ liệu thông qua JavaScript.
from requests_html import HTMLSession
# Tạo session HTML
session = HTMLSession()
# Thực hiện yêu cầu đến trang web
response = session.get('https://example-dynamic-page.com')
# Render JavaScript
response.html.render()
# Trích xuất dữ liệu
data = response.html.find('#dynamic-content', first=True)
print(data.text)
Thật là kỳ diệu! Không giống như requests, requests_html
cung cấp cho chúng ta phương thức .render()
, cho phép
"làm sống" trang web và thực thi JavaScript. Ngay khi trang "sống lại", bạn có thể
trích xuất tất cả dữ liệu cần thiết bằng cách sử dụng các selector mà chúng ta đã học trước đó.
3. Ví dụ về trích xuất dữ liệu
Bây giờ, hãy đi sâu hơn và xem xét một vài ví dụ,
để bạn có thể thấy requests_html
cứu chúng ta trong
những tình huống khác nhau như thế nào.
Trích xuất dữ liệu thực tế từ các trang động
Hãy tưởng tượng một trang tải tin tức mới nhất
chỉ khi bạn cuộn xuống. Với requests_html
, chúng ta có thể giả lập
hành vi của người dùng.
url = 'https://example-news-site.com'
# Tải trang
response = session.get(url)
# Thực hiện rendering với thời gian chờ tăng thêm nếu cần thiết
response.html.render(timeout=20)
# Tìm các mục tin tức
news_items = response.html.find('.news-item')
for item in news_items:
print(item.text)
Rất đơn giản và nhẹ nhàng, chúng ta đã truy cập được nội dung trước đây tưởng chừng không thể nắm bắt!
Xử lý nội dung JavaScript tải về bằng cách sử dụng
requests_html
Với requests_html
và các CSS-selector mà chúng ta
đã xem trước đó trong các bài giảng, bạn có thể làm việc với
nội dung trang web giống như bạn đã thực hiện scraping trong nhiều năm!
# Chọn phần tử tiêu đề tin tức đầu tiên
headline = response.html.find('.news-headline', first=True)
print(headline.text)
# Trích xuất liên kết từ phần tử
link = headline.find('a', first=True).attrs['href']
print(link)
4. Lời khuyên và mẹo thực tiễn
Mặc dù requests_html
là một công cụ mạnh mẽ, khi làm việc với nó,
bạn cần lưu ý một vài điều:
- Thời gian chờ và độ trễ: Đừng quên cấu hình thời gian chờ render cho các trang phức tạp hơn. Điều này sẽ giúp tránh lỗi do tải chậm.
-
Khả năng render:
requests_html
có thể tiêu tốn nhiều tài nguyên vì nó render JavaScript. Với khối lượng dữ liệu lớn hoặc các trang phức tạp, điều này có thể làm chậm quá trình. -
CAPTCHA và bảo vệ bot:
requests_html
không vượt qua các bảo vệ chống bot và CAPTCHA, vì vậy với các trường hợp khó khăn hơn, tốt nhất là sử dụng Selenium.
GO TO FULL VERSION