2012-09-20 148 views
25

我寫了很多刮板,但我不知道如何處理無限滾動。這些天大部分網站等,Facebook,Pinterest有無限的滾動。scle網站無限滾動

+2

這裏最好的選擇就是使用這些網站的API--到目前爲止,這將是最簡單和最可靠的選擇。除此之外,你將不得不處理JavaScript,這基本上意味着運行一個完整的瀏覽器 - 這樣的庫確實存在。 –

+0

聽起來像一個模擬,你可以指向一些處理jscript的例子 –

回答

24

你可以使用硒來取消像twitter或facebook這樣的無限滾動網站。

步驟1:使用PIP

pip install selenium 

步驟2安裝硒:使用下面的代碼來自動無限滾動和提取源代碼

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() 

步驟3:如果需要,打印這些數據。

+0

循環是否意味着我們向下滾動100次?其中100是隨機選擇的數字。是對的嗎? –

+0

@satarupa你是對的循環向下滾動100次 –

20

大多數無限滾動的網站(如Lattyware筆記)也具有適當的API,並且您可能會更好地使用這種方式,而不是通過抓取。

但是如果你必須湊...

這類網站都使用JavaScript,當您到達頁面的底部,要求從網站的附加內容。所有你需要做的是找出額外的內容的URL,你可以檢索它。找出所需的URL可以通過檢查腳本,使用Firefox Web控制檯或使用debug proxy來完成。

例如,打開Firefox Web控制檯,關閉除Net之外的所有過濾器按鈕,然後加載要擦除的站點。您將在加載時看到所有文件。在瀏覽Web控制檯的同時滾動頁面,您將看到用於其他請求的URL。然後你可以自己請求這個URL,看看數據是什麼格式(可能是JSON),然後把它放到你的Python腳本中。

+0

你能舉一個具體的例子來說明如何去做嗎? – tatsuhirosatou

+0

我已經添加了一些更多的細節,希望它有幫助! – kindall

1

找到ajax源代碼的網址將是最好的選擇,但對某些網站來說可能很麻煩。或者,您可以使用QWebKit之類的無頭瀏覽器從PyQt發送鍵盤事件,同時從DOM樹中讀取數據。 QWebKit有一個不錯的和簡單的API。