CodeGym /Các khóa học /Python SELF VI /Tải nội dung động với requests_html

Tải nội dung động với requests_html

Python SELF VI
Mức độ, Bài học
Có sẵn

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:

Bash
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.

Python

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:

Python

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_html trở 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.

Python
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.

Python
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.

Python

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! 😇

1
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tải và in nội dung động
Tải và in nội dung động
2
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tự động cuộn và trích xuất các phần tử
Tự động cuộn và trích xuất các phần tử
3
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Hệ thống giám sát nội dung động
Hệ thống giám sát nội dung động
4
Nhiệm vụ
Python SELF VI, mức độ, bài học
Đã khóa
Tích hợp scraper với API để thu thập dữ liệu
Tích hợp scraper với API để thu thập dữ liệu
1
Khảo sát/đố vui
, cấp độ , bài học
Không có sẵn
Đọc nội dung động
Đọc nội dung động
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION