2012-09-20 29 views
25

Tôi đã viết nhiều mẩu tin lưu niệm nhưng tôi không thực sự chắc chắn cách xử lý các thanh cuộn vô hạn. Những ngày này hầu hết các trang web vv, Facebook, Pinterest có cuộn vô hạn.các trang web cạo với cuộn vô hạn

+2

Đặt cược tốt nhất của bạn ở đây là sử dụng các API của trang web đó - đó sẽ là, cho đến nay, tùy chọn dễ dàng và đáng tin cậy nhất. Ngoài ra, bạn sẽ phải xử lý JavaScript, về cơ bản có nghĩa là chạy một trình duyệt hoàn chỉnh - các thư viện đó tồn tại. –

+0

nghe như mô phỏng, bạn có thể chỉ ra một số ví dụ về xử lý jscript –

Trả lời

24

Bạn có thể sử dụng selen để xóa trang web cuộn vô hạn như twitter hoặc facebook.

Bước 1: Cài đặt Selenium sử dụng pip

pip install selenium 

Bước 2: sử dụng mã dưới đây để tự động cuộn vô hạn và trích xuất mã nguồn

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
import sys 

import unittest, time, re 

class Sel(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Firefox() 
     self.driver.implicitly_wait(30) 
     self.base_url = "https://twitter.com" 
     self.verificationErrors = [] 
     self.accept_next_alert = True 
    def test_sel(self): 
     driver = self.driver 
     delay = 3 
     driver.get(self.base_url + "https://stackoverflow.com/search?q=stckoverflow&src=typd") 
     driver.find_element_by_link_text("All").click() 
     for i in range(1,100): 
      self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
      time.sleep(4) 
     html_source = driver.page_source 
     data = html_source.encode('utf-8') 


if __name__ == "__main__": 
    unittest.main() 

Bước 3: In dữ liệu nếu cần thiết.

+0

Vòng lặp có nghĩa là chúng ta cuộn xuống 100 lần không? trong đó 100 là số được chọn ngẫu nhiên. Có đúng không? –

+0

@satarupa Bạn nói đúng là cuộn xuống 100 lần –

20

Hầu hết các trang web có cuộn vô hạn làm (như ghi chú Lattyware) đều có API thích hợp, và bạn có thể sẽ được phục vụ tốt hơn bằng cách sử dụng này thay vì cạo.

Nhưng nếu bạn phải cạo ...

trang web như vậy được sử dụng JavaScript để yêu cầu nội dung bổ sung từ trang web khi bạn đạt đến dưới cùng của trang. Tất cả những gì bạn cần làm là tìm ra URL của nội dung bổ sung đó và bạn có thể truy xuất nó. Tìm ra URL cần thiết có thể được thực hiện bằng cách kiểm tra kịch bản, bằng cách sử dụng giao diện điều khiển Web Firefox hoặc bằng cách sử dụng debug proxy.

Ví dụ: mở Bảng điều khiển Web Firefox, tắt tất cả các nút bộ lọc ngoại trừ Net và tải trang web bạn muốn xóa. Bạn sẽ thấy tất cả các tệp khi chúng được tải. Cuộn trang trong khi xem Bảng điều khiển Web và bạn sẽ thấy các URL đang được sử dụng cho các yêu cầu bổ sung. Sau đó, bạn có thể tự yêu cầu URL đó và xem định dạng dữ liệu trong (có thể là JSON) và đưa nó vào tập lệnh Python của bạn.

+0

Bạn có thể đưa ra ví dụ cụ thể về cách thực hiện không? – tatsuhirosatou

+0

Tôi đã thêm một số chi tiết, hy vọng nó sẽ giúp! – kindall

1

Tìm url của nguồn ajax sẽ là tùy chọn tốt nhất nhưng nó có thể cồng kềnh đối với một số trang web nhất định. Hoặc bạn có thể sử dụng trình duyệt không đầu như QWebKit từ PyQt và gửi các sự kiện bàn phím trong khi đọc dữ liệu từ cây DOM. QWebKit có api đẹp và đơn giản.

Các vấn đề liên quan