2016-05-13 44 views
5

我正在使用scrapy。如何從無限滾動網站上刮取所有內容? scrapy

我使用的網站有無限滾動。

網站有帖子的負荷,但我只刮出13

如何刮職位的休息嗎?

這裏是我的代碼:

class exampleSpider(scrapy.Spider): 
name = "example" 
#from_date = datetime.date.today() - datetime.timedelta(6*365/12) 
allowed_domains = ["example.com"] 
start_urls = [ 
    "http://www.example.com/somethinghere/" 
] 

def parse(self, response): 
    for href in response.xpath("//*[@id='page-wrap']/div/div/div/section[2]/div/div/div/div[3]/ul/li/div/h1/a/@href"): 
    url = response.urljoin(href.extract()) 
    yield scrapy.Request(url, callback=self.parse_dir_contents) 


def parse_dir_contents(self, response): 
    #scrape contents code here 

回答

1
+0

我試着把深度限制在我的設置中,但仍然無法進入..它堅持獲得所有這些鏈接:「www.example.com/blog/2016/05/13」但它沒有點擊鏈接並在裏面刮.. – Michimcchicken

+0

對不起,我不明白它卡在哪裏。你可以在網上查看一些例子,例如https://github.com/scrapy/dirbot/blob/master/dirbot/spiders/dmoz.py – WannaBeCoder

+0

你能查看我的最後一次編輯嗎?我想知道它是否有幫助D: – Michimcchicken

1

我想你在找什麼是分頁邏輯一起一邊你的正常邏輯

在大多數情況下.. 無限滾動==分頁,在這樣的頁面上,當您向下滾動到頁面的3/4或直到頁面結束時,頁面觸發AJAX調用並下載下一頁內容並加載響應到當前頁面

我會建議在Firefox中使用network monitor工具,當你向下滾動

發現任何這樣的頁面請求 - 線索:您將使用scrapy.FormRequestscrapy.FormRequest.from_response而這一解決方案

1

顯然,該目標站點動態地上傳其內容。因此有兩個相應的解決方案有:

  1. 在細微之處解密jQuery的互動,儘量模擬與服務器manually

  2. 使用另一種工具適合做這份工作的數據交換。例如spynner在我看來是一個正確的選擇要注意。

1

我用Selenium而不是scrapy但是你必須能夠做到相當於什麼,我做的是加載文件,即運行一些JavaScript代碼:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

我突出部分保持這樣做直到它不再滾動。它不漂亮,不能在生產中使用,但對特定工作有效。

+0

是否使用'Scrapy'也會運行JavaScript? –

1

檢查網站代碼。

如果無限滾動自動觸發JS行動,你可以繼續使用玉衡建議如下:spynner

繼spynner docs,你可以找到可觸發的jQuery事件。

查找庫代碼以查看可以觸發哪種事件。

嘗試生成一個滾動到底事件或創建在任何網站上的滾動內容裏面的div的CSS屬性變化。繼spynner docs,是這樣的:

browser = spynner.Browser(debug_level=spynner.DEBUG, debug_stream=debug_stream) 
# load here your website as spynner allows 
browser.load_jquery(True) 
ret = run_debug(browser.runjs,'window.scrollTo(0, document.body.scrollHeight);console.log(''scrolling...);') 
# continue parsing ret 

這是不太可能的無限滾動由錨鏈接觸發,但也許可以用一個jQuery動作來觸發,不necesarry連接到的鏈接。對於這種情況,使用如下代碼:對output.html文件

br.load('http://pypi.python.org/pypi') 

anchors = br.webframe.findAllElements('#menu ul.level-two a') 
# chooses an anchor with Browse word as key 
anchor = [a for a in anchors if 'Browse' in a.toPlainText()][0] 
br.wk_click_element_link(anchor, timeout=10) 
output = br.show() 
# save output in file: output.html or 
# plug this actions into your scrapy method and parse output var as you do 
# with response body 

然後,運行scrapy或者,如果你實現它的話,使用本地內存變量您選用存儲JS行動後修改HTML 。

作爲另一種解決方案,您試圖解析該網站可能有一個交替渲染版本,以防止訪問者的瀏覽器還沒有 JS激活。

嘗試渲染帶有JavaScript禁用瀏覽器的網站,也許這樣,網站在內容部分末尾提供錨鏈接。

還有成功實現爬蟲js導航使用的方法與Scrapy一起用Selenium詳述於this這樣回答。

+1

謝謝你的完美答案。 ♥ –