1. Nội dung động và JavaScript
Nếu bạn đã nắm vững các nguyên tắc cơ bản của web-scraping bằng các thư viện như BeautifulSoup và requests, đã đến lúc khám phá khía cạnh thú vị hơn của công việc này. Hôm nay, chúng ta sẽ tìm hiểu cách làm việc với nội dung tải động, chỉ xuất hiện khi cuộn trang. Trình duyệt của bạn không phải người hâm mộ duy nhất của các trang vô hạn, giờ đây bạn có thể dạy kịch bản của mình làm điều đó! 🤖
Internet đầy những trang với nội dung tải động, trong đó nội dung chỉ được cập nhật khi tương tác với JavaScript, thứ tạo ra "phép màu" phía client. Điều này có thể vừa là phước lành vừa là lời nguyền đối với web-scraper. Một mặt, các trang này có thể tương tác và thân thiện hơn với người dùng, nhưng mặt khác — scraping các trang này trở nên khó khăn hơn vì thư viện requests không hiểu JavaScript.
2. Thư viện requests_html
May mắn thay, như bạn đã biết, trên thế giới này có requests_html — thư viện kết hợp sức mạnh của requests và khả năng rendering kiểu trình duyệt từ Pyppeteer. Thư viện này cho phép tải và render các trang có nội dung động, cho phép bạn thực thi JavaScript và thậm chí cuộn trang.
Cài đặt requests_html
Để bắt đầu, bạn cần cài đặt thư viện. Nếu bạn chưa làm điều này, hãy chạy lệnh:
pip install requests-html
Làm việc với requests_html
Sau khi cài đặt, hãy cùng xem cách sử dụng requests_html để tải và làm việc với nội dung động.
Ví dụ: Tải và render trang
Bắt đầu với trường hợp đơn giản: tải trang, thực thi JavaScript và trích xuất dữ liệu. Hãy xem ví dụ, trong đó chúng ta tải trang và lấy văn bản của một phần tử xuất hiện chỉ sau khi thực thi JavaScript.
from requests_html import HTMLSession
# Tạo session
session = HTMLSession()
# Tải trang
response = session.get('https://example.com/dynamic-page')
# Thực thi JavaScript để render trang
response.html.render()
# Lấy văn bản của phần tử xuất hiện sau render
content = response.html.find('#dynamic-content', first=True)
print(content.text)
Trong ví dụ này, chúng ta sử dụng phương thức render() để cho phép requests_html thực thi JavaScript trên trang và render nội dung, có thể bị ẩn khi tải thông thường.
3. Cuộn tự động các trang
Đôi khi nội dung động không tải ngay mà chỉ xuất hiện khi cuộn trang. requests_html có thể giúp bạn trong trường hợp này, cho phép bạn giả lập cuộn trang và tải thêm dữ liệu.
Ví dụ cuộn tự động
Giả sử bạn có một trang với danh sách tin tức vô hạn và muốn lấy càng nhiều phần tử càng tốt. Đây là cách làm:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')
# Render và cuộn trang
response.html.render(scrolldown=5, sleep=1)
# Lấy tất cả các phần tử tin tức
news_items = response.html.find('.news-item')
for news_item in news_items:
print(news_item.text)
Ở đây, phương thức render() được bổ sung với các tham số scrolldown và sleep, chỉ định số lần cuộn xuống và thời gian nghỉ giữa các lần cuộn.
4. Ứng dụng thực tiễn
Tại sao lại quan tâm đến việc như cuộn tự động này? 🤔
- Nghiên cứu thị trường: Nhiều công ty sử dụng các trang này để hiển thị liên tục dữ liệu, có thể hữu ích cho việc phân tích xu hướng và hành vi khách hàng.
- Theo dõi mạng xã hội: Nhiều nền tảng mạng xã hội sử dụng danh sách vô hạn, khiến
requests_htmltrở thành công cụ hữu ích để theo dõi và thu thập dữ liệu từ các nguồn này. - Tin tức và cập nhật: Trích xuất tiêu đề và bài viết từ các trang tin tức vô tận giúp bạn có được thông tin nhanh chóng để phân tích.
5. Các lỗi hay gặp và cách giải quyết
Trong quá trình làm việc với các trang động và requests_html, thường sẽ xảy ra lỗi. Chúng ta hãy xem một vài lỗi phổ biến:
Vấn đề với render
Đôi khi phương thức render() có thể không hoàn thành thành công, đặc biệt khi trang quá lớn hoặc phức tạp. Trong các trường hợp này, tăng thời gian render bằng tham số timeout, hoặc giảm số lần cuộn xuống có thể giúp ích.
response.html.render(timeout=30)
Script chạy lỗi
Có thể xảy ra tình huống mà JavaScript trên trang chặn script của bạn hoặc gây ra sự cố. Hãy thử sử dụng tham số wait để chờ cho các phần tử cần thiết xuất hiện.
response.html.render(wait=2)
Độ phân giải màn hình và loại thiết bị
Một số trang web cung cấp nội dung phụ thuộc vào độ phân giải màn hình hoặc loại thiết bị. Hãy kiểm tra user-agent mà bạn sử dụng khi gửi yêu cầu và điều chỉnh nếu cần.
response.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
6. Đọc thêm
requests_html là một công cụ mạnh mẽ, nhưng để tận dụng tối đa khả năng của nó và tránh các lỗi phổ biến, hãy nghiên cứu tài liệu chính thức. Nó sẽ giúp bạn hiểu rõ hơn cách quản lý cuộn và render thành công các trang phức tạp.
Đến đây, bạn đã có mọi thứ cần thiết để không ngại nội dung động hay các trang vô tận. Hãy cẩn thận, đừng quên chỉ ra rằng script của bạn là hacker trắng, yêu thích tự động hóa nhiệm vụ cho con người chứ không phải kẻ xấu! 😇
GO TO FULL VERSION