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

Làm thế nào để, Python, Cạo, Nov-15-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 vào dữ liệu có cấu trúc theo cách tự động với sự trợ giúp của việc quét web. Ví dụ: bạn có thể sử dụng web scraping cho: Infinite scrolling, còn được gọi là endless scrolling, 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 vào dữ liệu có cấu trúc theo cách tự động với sự trợ giúp của việc quét web. Ví dụ: bạn có thể sử dụng web scraping cho:

  • Giám sát giá
  • Tạo khách hàng tiềm năng
  • Giám sát tin tức
  • Nghiên cứu thị trường
  • Thông tin về giá

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 độ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 cuộc 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 lợi thế, nhưng nó không được khuyến khích cho các nhiệm vụ tìm kiếm theo định hướng mục tiêu yêu cầu mọi người xác định vị trí nội dung cụ thể.

Trước tiên chúng ta hãy hiểu lợi ích của việc cạo các trang cuộn vô hạn.

Tại sao bạn cần cạo các trang cuộn vô hạn?

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

  • Tương tác với 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 để cuộn qua các trang web truyền thông xã hội như Twitter và Facebook, vì vậy người dùng liên tục tham gia. 
  • Ít nhấp chuột hơn - Cuộn yêu cầu ít hành động hơn và người dùng dễ dàng hơn so với nhấp chuột.
  • Lý tưởng cho thiết bị di động - Infinite Scrolling rất phù hợp cho các 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 trên của việc cạo các trang cuộn vô hạn, còn có một số nhược điểm như:

  • Nó không phải là tuyệt vời cho Search Engine Optimization (SEO).
  • Người dùng khuyết tật về thể chất không dễ dàng điều hướng qua các trang có cuộn vô hạn.
  • Các trang web cuộn vô hạn có thể có thời gian tải dài có thể đến từ phía người dùng hoặc kết thúc phát triển.

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

Hãy xem cách qué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ừ webdriver nhập khẩu selen
từ selenium.webdriver.common.keys nhập khóa                       
Thời gian nhập khẩu

Thiết lập Selen

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

def get_selenium():                          
   Tùy chọn = Webdriver. ChromeOptions()
   Tùy chọn.add_argument('--ignore-certificate-errors')
   Tùy chọn.add_argument('--ẩn danh')
   Tùy chọn.add_argument('không đầu')                       
   Trình điều khiển = Webdriver. Chrome(chrome_options=tùy chọn)
   Trả lại (tài xế)

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

Chúng ta có thể bỏ qua hai lá cờ i-e;  bỏ qua-chứng chỉ-lỗi và ẩn danh.

Nếu bạn gặp 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à mất 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 trang của mình để sửa lỗi cuộn vô hạn và làm theo các bước được đề cập bên dưới.

  • 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ử đó.
  • Để đợi 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 quy trình tương tự cho đến khi bạn đến cuối trang.

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

selen = get_selenium()                           
selenium.get("của bạn / 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(cuộn)
   Thời gian. ngủ(3)
   nếu (last_elem == current_elem)
      phá vỡ
   khác
      last_elem = current_elem

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

Ở đây

  • Chúng tôi đã sử dụng hàm selenium.get() sẽ 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.
selen. get("của bạn/url.com/{0}".định dạng (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 trống trong đó.
  • Chúng tôi đã sử dụng một vòng lặp while, trong đó chúng tôi sử dụng CSS_selector hoặc Xpath để lấy current_last_elem. Để có được đườ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ử bạn cần đường dẫn đến, bạn phải sử dụng các 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ử bạn cần đường dẫn đến, bạn phải sử dụng các 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 kép và dấu ngoặc kép và các ký tự thoát.

  • Chúng ta chạy tập lệnh js bằng cách sử dụng selenium.execute_script().
  • Bạn cần cung cấp cho trang đủ thời gian để tải để nó 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 ngừng thực thi trong vài giây. Nếu bạn không cho trang đủ thời gian để tải, nó sẽ ngừ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 một phần tử cuối cùng mới có được tìm thấy mỗi khi chúng tôi cuộn xuống cuối trang hay không. Nếu nó được tìm thấy, điều đó có nghĩa là chúng ta chưa đến cuối trang và chúng ta 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 xong và chúng ta có thể thoát ra khỏi vòng lặp.

Khắc phục sự cố thường gặp

Một số vấn đề thường xảy ra khi thực hiện cuộn vô hạn là:

  • 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 kép và dấu ngoặc kép trong tập lệnh js.
  • Nếu bạn nhận được undefined hoặc cùng một phần tử cuối cùng mỗi lần, bạn cần tăng thời lượng i-e., 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à kết quả là nhận được một danh sách. 

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

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

Trong đoạn mã trên,

  • Chúng ta đã tạo ra một mảng trống gọi 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 mỗi img.src trong mảng của chúng tôi.
  • Chúng tôi trả lại 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 tôi.

Sau đó, chúng ta có thể chạy script với selenium.execute_script(). Sau đó, chúng ta có thể lưu trữ giá trị trả về bởi js trong một biến python i-e., python_list. 

Đây là cách chúng ta có thể cạo 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 hoạt động như một 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'% hostname +":"+port)
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 proxy cuộn hỗ trợ cuộn theo chương trình của các chế độ xem có thể cuộn trong 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 --save

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

var myScroll = ScrollProxy mới ();

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ì nó sẽ báo cáo các hành động theo mặc định khi người dùng cuộn trang.

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

var myDiv = tài liệu. querySelector('.scrollable');
var myDivScroll = ScrollProxy mới (myDiv);

Tại sao sử dụng proxy để cạo cuộn vô hạn?

Dưới đây là một số lý do để sử dụng proxy trong khi quét 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 quét của bạn. Bạn có thể kiểm tra trang theo cách thủ công để tìm captcha nếu bạn gặp lỗi hết thời gian chờ thường xuyên. Hầu hết các captcha được kích hoạt bởi các biện pháp an ninh và bạn có thể tránh chúng bằng cách sử dụng proxy dân cư luân phiên cùng với trình cạp của bạn.
  • Một số trang web thích lọc ra 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ờ đỏ cho bạn (tác nhân người dùng). 

Kết thúc

Chúng tôi đã thảo luận rằng cuộn vô hạn được ưa thích 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 truyền thông xã hội liên tục tạo nội dung mới có thể được hưởng lợi từ việc cuộn vô hạn. Mặt khác, các trang kinh doanh và trang web thương mại điện tử không phải là ứng cử viên tốt cho việc cuộn vô hạn khi 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 cạo các trang cuộn vô hạn bằng Selenium. Chúng tôi cũng có thể sử dụng proxy dân cư xoay vòng để 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 tôi.

Hy vọng bạn đã hiểu về cách cạo các trang cuộn vô hạn bằng Python.