Cách cạo các trang cuộn vô hạn bằng Python

Cách thực hiện , Python , Scraping ,15-11-20225 phút đọc

Trong thế giới ngày nay, mọi người đều sử dụng các công nghệ mới. Bạn có thể truy cập dữ liệu có cấu trúc theo cách tự động với sự trợ giúp của web scraping. Ví dụ, bạn có thể sử dụng web scraping để: Cuộn vô hạn, còn được gọi là cuộn vô tận, là một kỹ thuật thiết kế web mà các trang web thường sử dụng với AJAX hoặc Javascript

Mục lục

Trong thế giới ngày nay, mọi người đều sử dụng các công nghệ mới. Bạn có thể truy cập dữ liệu có cấu trúc theo cách tự động với sự trợ giúp của web scraping. Ví dụ, bạn có thể sử dụng web scraping cho:

  • Theo dõi giá
  • Tạo khách hàng tiềm năng
  • Theo dõi tin tức
  • Nghiên cứu thị trường
  • Thông tin giá cả

Cuộn vô hạn, còn được gọi là cuộn vô tận, là một kỹ thuật thiết kế web mà các trang web thường sử dụng với AJAX hoặc Javascript để tải nội dung bổ sung một cách động khi người dùng cuộn xuống cuối trang web. Kỹ thuật này trở nên phổ biến do thành công của nó trên các trang mạng xã hội. Ví dụ, cuộn vô hạn trong Twitter được tạo ra thông qua tải không đồng bộ. Twitter thực hiện các lệnh gọi AJAX sau khi trang được tải để liên tục thêm nội dung mới khi cuộn. Mặc dù cuộn vô hạn có nhiều ưu điểm, nhưng không nên sử dụng cho các tác vụ tìm kiếm theo mục tiêu yêu cầu mọi người phải định vị nội dung cụ thể.

Trước tiên, chúng ta hãy tìm hiểu lợi ích của việc thu thập các trang cuộn vô hạn.

Tại sao bạn cần phải thu thập các trang cuộn vô hạn?

Sau đây là một số lý do để thu thập các trang cuộn vô hạn.

  • Sự tương tác của người dùng – Cuộn vô hạn giúp người dùng tương tác trên một trang. Có rất nhiều nội dung do người dùng tạo ra để cuộn qua trên các trang mạng xã hội như Twitter và Facebook, do đó người dùng luôn tương tác. 
  • Ít nhấp chuột hơn – Cuộn ít cần thao tác hơn và dễ dàng hơn cho người dùng so với nhấp chuột.
  • Lý tưởng cho thiết bị di động – Cuộn vô hạn rất tuyệt vời cho thiết bị di động và màn hình cảm ứng. Người dùng có thể vuốt xuống để tạo nội dung mới thay vì chuyển sang tab mới. 

Ngoài những lợi ích nêu trên của việc thu thập các trang cuộn vô hạn, còn có một số nhược điểm như:

  • Nó không tốt cho việc Tối ưu hóa công cụ tìm kiếm (SEO).
  • Người dùng khuyết tật sẽ không dễ dàng điều hướng qua các trang có chức năng cuộn vô hạn.
  • Các trang web cuộn vô hạn có thể có thời gian tải lâu, có thể do phía người dùng hoặc phía phát triển.

Cách cạo các trang cuộn vô hạn bằng Python

Hãy cùng xem cách trích xuất các trang cuộn vô hạn bằng Python với sự trợ giúp của các bước được đề cập bên dưới.

Nhập thư viện

Bạn cần nhập thư viện Selenium.

từ selenium nhập webdriver từ selenium.webdriver.common.keys nhập Keys nhập thời gian

Thiết lập Selenium

Ở đây bạn phải chọn trình duyệt mà bạn muốn sử dụng. Chúng tôi sẽ chọn Chrome vì nó cung cấp nhiều tùy chọn hơn Firefox. 

def get_selenium(): options = webdriver.ChromeOptions() options .add_argument( '--ignore-certificate-errors' ) options .add_argument( '--incognito' ) options .add_argument( 'headless' ) driver = webdriver.Chrome(chrome_options= options ) return (trình điều khiển)

Đối số headless được đề cập ở trên khá quan trọng. Selenium sẽ không mở Chrome trong một cửa sổ mới khi chạy headless trong Python. Tuy nhiên, nếu bạn gặp sự cố khi đang thu thập dữ liệu, bạn có thể bình luận về tùy chọn headless và xem những gì đang diễn ra trong Chrome và những gì được tải trên trang.

Chúng ta có thể bỏ qua hai cờ là: ignore-certificate-errors và incognito.

Nếu bạn gặp phải captcha hoặc biểu ngữ cookie ngăn trang của bạn tải, bạn có thể nhấp vào OK và tiếp tục đến trang bình thường. Tuy nhiên, nếu trình duyệt bị đóng đột ngột, bạn có thể sử dụng time.sleep() để tạm dừng mã và dành nhiều thời gian để gỡ lỗi.

Sửa lỗi cuộn vô hạn

Bạn cần xem xét cấu trúc HTML của trang để sửa lỗi cuộn vô hạn và làm theo các bước dưới đây.

  • Bạn phải tìm phần tử cuối cùng được tải lên trang.
  • Bạn phải sử dụng Selenium để cuộn xuống phần tử đó.
  • Để chờ trang tải thêm nội dung, hãy sử dụng time.sleep().
  • Cuộn lại đến phần tử cuối cùng được tải lên trang.
  • Bạn cần lặp lại quá trình tương tự cho đến khi đến cuối trang.

Bạn có thể xem xét ví dụ dưới đây để hiểu rõ hơn.

selenium = get_selenium() selenium.get( "your/url" ) last_elem = '' ; trong khi True : current_last_elem = "#my-div > ul > li:last-child" scroll = "document.querySelector(\'" + current_last_elem + "\').scrollIntoView();" selenium.execute_script(scroll) time. sleep ( 3 ) nếu (last_elem == current_elem) ngắt nếu không thì last_elem = current_elem

Trong đoạn mã trên, chúng tôi đã sử dụng jQuery và Javascript bên trong Python. 

Đây,

  • Chúng tôi đã sử dụng hàm selenium.get() để mở trang URL của chúng tôi. Tuy nhiên, nếu bạn muốn thêm từ khóa vào tìm kiếm URL của mình, bạn có thể sử dụng dòng mã sau.
selenium.get ( "your/url.com/{0}" .format (từ khóa))
  • Chúng tôi đã khởi tạo last_time thành 0 bằng cách lưu trữ một chuỗi rỗng trong đó.
  • Chúng tôi đã sử dụng vòng lặp while trong đó chúng tôi sử dụng CSS_selector hoặc Xpath để lấy current_last_elem. Để lấy đường dẫn, hãy làm theo các bước dưới đây. Mở trang của bạn. Để chọn một phần tử mà bạn cần đường dẫn đến, bạn phải sử dụng công cụ webdev. Bạn có thể làm theo hướng dẫn này để chọn phần tử trong cấu trúc HTML của trang và lấy Xpath trong Chrome.
  • Mở trang của bạn.
  • Để chọn một phần tử mà bạn cần đường dẫn đến, bạn phải sử dụng công cụ webdev. Bạn có thể làm theo hướng dẫn này để chọn phần tử trong cấu trúc HTML của trang và lấy Xpath trong Chrome.
  • Để cuộn trang xuống phần tử đã chọn, chúng tôi đã sử dụng jQuery và scrollIntoView(). 
"document.querySelector( \' " + .. + " \' ).scrollIntoView();"

Ở đây, định dạng của bạn phải chính xác, vì vậy bạn cần chú ý đến dấu ngoặc đơn, dấu ngoặc kép và ký tự thoát.

  • Chúng tôi chạy tập lệnh js bằng cách sử dụng selenium.execute_script().
  • Bạn cần cho trang đủ thời gian để tải để có thể tìm thấy phần tử cuối cùng. Do đó, hàm time.sleep() rất quan trọng vì nó tạm dừng thực thi trong vài giây. Nếu bạn không cho trang đủ thời gian để tải, trang sẽ dừng cuộn và bạn sẽ nhận được kết quả không xác định.
  • Chúng tôi kiểm tra xem có tìm thấy phần tử cuối cùng mới nào không mỗi lần chúng tôi cuộn xuống cuối trang. Nếu tìm thấy, điều đó có nghĩa là chúng tôi chưa đến cuối trang và chúng tôi cần tiếp tục cuộn. Nếu không tìm thấy, điều đó có nghĩa là trang đã cuộn xuống xong và chúng tôi có thể thoát khỏi vòng lặp.

Sửa chữa các vấn đề thường gặp

Sau đây là một số vấn đề thường gặp khi thực hiện cuộn vô hạn:

  • Phải mất một thời gian để tìm đúng Xpath đến phần tử cuối cùng. Bạn cần kiểm tra dấu ngoặc đơn và dấu ngoặc kép trong tập lệnh js.
  • Nếu bạn nhận được kết quả không xác định hoặc phần tử cuối cùng giống nhau mọi lúc, bạn cần tăng thời gian, tức là tăng time.sleep() vì trang có thể không có đủ thời gian để tải hoàn toàn. 
  • Bạn có thể chú thích tùy chọn headless trong get_selenium() nếu mọi thứ đều chính xác, nhưng nó vẫn không hoạt động.

Kích hoạt js trong Python

Có thể kích hoạt một tập lệnh js từ bên trong Python và nhận được một danh sách kết quả. 

Ví dụ, chúng ta có thể sử dụng mã bên dưới để lấy nguồn từ tất cả hình ảnh trên trang.

js_script = '''\ var jslist = [] document.querySelectorAll('img').forEach(i => jslist.push(i.src)); trả về jslist; ''' python_list = selenium.execute_script(js_script)

Trong đoạn mã trên,

  • Chúng tôi đã tạo một mảng rỗng có tên là jslist.
  • Chúng tôi đã chọn tất cả các thẻ img trong trang.
  • Chúng tôi sử dụng forEach để đẩy từng img.src vào mảng của mình.
  • Chúng tôi đã trả về jslist.

Chúng ta có thể sử dụng cách tiếp cận tương tự cho các liên kết href bằng cách:

  • Chọn tất cả các thẻ “a”.
  • Đẩy mọi a.href vào mảng của chúng ta.

Sau đó, chúng ta có thể chạy tập lệnh bằng selenium.execute_script(). Sau đó, chúng ta có thể lưu trữ giá trị trả về của js trong một biến python, ví dụ như python_list. 

Đây là cách chúng ta có thể thu thập các trang cuộn vô hạn bằng Python.

Sử dụng Proxy

Bạn biết rằng proxy là máy chủ của bên thứ ba đóng vai trò trung gian giữa máy khách yêu cầu tài nguyên và máy chủ cung cấp tài nguyên đó. Nếu bạn muốn sử dụng proxy với Selenium và Python, bạn có thể sử dụng các dòng mã sau.

chrome_options = webdriver.ChromeOptions() chrome_options.add_argument( '--proxy-server=%s' % tên máy chủ + ":" +cổng) trình điều khiển = webdriver.Chrome( chrome_options =chrome_options)

Để xử lý cuộn vô hạn, bạn có thể sử dụng scroll-proxy hỗ trợ cuộn theo chương trình của các chế độ xem có thể cuộn trong một hệ thống phân cấp chế độ xem. Nếu bạn sử dụng npm, bạn có thể cài đặt scroll-proxy bằng lệnh bên dưới. Chúng tôi sẽ sử dụng js để chứng minh việc sử dụng scroll-proxy.

npm cài đặt scroll -proxy -- lưu

Sau khi cài đặt scroll-proxy, bạn có thể khởi tạo đối tượng ScrollProxy bằng cách sử dụng đoạn mã bên dưới.

var myScroll = new ScrollProxy ();

Bạn có thể thấy chúng tôi không truyền bất kỳ đối số nào cho hàm tạo ScrollProxy vì theo mặc định, nó sẽ báo cáo các hành động khi người dùng cuộn trang.

Tuy nhiên, nếu bạn muốn nhận được thông tin cập nhật khi người dùng cuộn bên trong một phần tử HTML cụ thể, bạn phải truyền phần tử đó vào hàm tạo.

var myDiv = document .querySelector ( '.scrollable' ); var myDivScroll = new ScrollProxy(myDiv);

Tại sao nên sử dụng Proxy để thu thập thông tin Infinite Scrolling?

Dưới đây là một số lý do để sử dụng proxy khi thu thập dữ liệu cuộn vô hạn.

  • Captcha có thể khiến trang của bạn hết thời gian chờ và có thể chặn trình thu thập dữ liệu của bạn. Bạn có thể kiểm tra thủ công trang để tìm captcha nếu bạn thường xuyên gặp lỗi hết thời gian chờ. Hầu hết captcha đều được kích hoạt bởi các biện pháp bảo mật và bạn có thể tránh chúng bằng cách sử dụng proxy dân dụng luân phiên cùng với trình thu thập dữ liệu của mình.
  • Một số trang web thích lọc các yêu cầu tiêu đề đáng ngờ dựa trên giả định hoặc khả năng tác nhân người dùng có thể là bot. Để tránh báo hiệu rằng bạn là bot, bạn có thể sử dụng proxy có thể thay đổi địa chỉ IP của bạn và ngăn chặn các cờ đỏ cho bạn (tác nhân người dùng). 

Phần kết luận

Chúng tôi đã thảo luận rằng cuộn vô hạn được ưa chuộng khi người dùng không tìm kiếm thông tin cụ thể. Các trang web tin tức và nguồn cấp dữ liệu phương tiện truyền thông xã hội liên tục tạo nội dung mới có thể hưởng lợi từ cuộn vô hạn. Mặt khác, các trang kinh doanh và trang thương mại điện tử không phải là ứng cử viên tốt cho cuộn vô hạn vì người dùng tìm kiếm thông tin cụ thể. Hơn nữa, chúng tôi đã thảo luận về các bước liên quan đến việc thu thập các trang cuộn vô hạn bằng Selenium. Chúng ta cũng có thể sử dụng proxy dân dụng luân phiên để xử lý cuộn vô hạn vì chúng giúp tránh captcha và lọc các yêu cầu tiêu đề đáng ngờ của chúng ta.

Hy vọng bạn đã hiểu được cách thu thập các trang cuộn vô hạn bằng Python.