2017-06-13 85 views
1

所以我想刮從分頁網站的文章。基本上,每個頁面都是文章鏈接的列表,並且蜘蛛遵循parse_article方法在頁面上的鏈接以及在下一個連續頁面鏈接之後。但是,在給定數量的文章被刮掉後,有沒有辦法讓這個停止?例如,這是我迄今使用crawlspiderScrapy在條件下停止分頁?

rules = (

    #next page rule: 
    Rule(LinkExtractor(restrict_xpaths="//a[@class='next']"),follow=True) 

    #Extract all internal links which follows this regex: 
    Rule(LinkExtractor(allow=('REGEXHERE',),deny=()),callback='parse_article'), 
) 

def parse_article(self, response): 
    #do parsing stuff here 

我想停下來之後的下一個頁面,一旦我已經解析了150篇。無論我是否超過150,我只是想在達到這個數字後停止進入下一頁。有沒有辦法做到這一點?就像在parse_article方法中有一個計數器一樣? scrapy只是新的,所以我不知道該怎麼嘗試....我看着depth_limit,但我不太確定這就是我正在尋找的。

任何幫助將不勝感激,謝謝!

回答

4

你可以做到這一點通過設置:

CLOSESPIDER_ITEMCOUNT = 150

在您的項目設置。

如果你已經在你的項目中多個蜘蛛,只是想一個特定於該設置的影響,在custom_settings設置類變量:

custom_settings = { 'CLOSESPIDER_ITEMCOUNT': 150 } 
+0

感謝您的建議!但是,對於一個包含多個蜘蛛的項目,是否可以讓這個'CLOSESPIDER_ITEMCOUNT'只適用於一個蜘蛛? – ocean800

+1

@ ocean800我已經更新了我的答案。請嘗試讓我知道它是否按預期工作 –

+0

對不起,對於遲到的回覆,但它的工作,謝謝:) – ocean800

1

我把我的蜘蛛的方法是實際上有一個donescraping標誌,我在每個parse_ *函數中檢查它的第一件事情,並返回結果的空列表。

這增加了允許已經在下載隊列中的項目和URL完成發生而不獲取任何MORE項目的優雅行爲。

我從來沒有使用CLOSESPIDER_ITEMCOUNT,所以我不知道如果「優雅地」關閉蜘蛛。我希望它不會

在每一個解析函數的開頭:

#early exit if done scraping 
    if self.donescraping: 
     return None 
+1

在某些情況下,您可能需要'返回[]'取決於解析函數。 :) – RabidCicada

+0

感謝您的答案!只是試圖瞭解更多 - 這裏的蜘蛛究竟如何關閉?我不明白在解析函數中如何返回'None' /'[]'響應會阻止'CrawlSpider' /'LinkExtractor'爬取更多鏈接? – ocean800

+1

當蜘蛛用完下載隊列中的東西時,它會自行關閉。我的解決方案是在完成處理當前收集的項目之後,讓它在沒有更多項目的情況下優雅地關閉,而不是立即退出。 – RabidCicada