2016-08-18 54 views
0

我最近正在一個網站蜘蛛工作,並且注意到它請求無限數量的頁面,因爲一個網站沒有編碼他們的分頁來停止。Scrapy - 如何避免分頁黑洞?

因此,儘管他們只有內容幾頁,它仍然會產生下一個鏈接和網址...?頁= 400,...?頁= 401等

內容沒不會改變,只是網址。當內容停止更改時,有沒有辦法讓Scrapy停止分頁?或者我可以編寫自定義的東西。

+0

你需要跟蹤的東西,改變,當它已經不停止,即網頁標題或顯示結果的標題(你可以通過一個XPath分析文本明顯地查詢)。 – Jan

+0

但是,我會如何將它鏈接到一個URL,它即將刮掉並阻止LinkExtractor使用它?將它集成到CrawlSpider中已經超出了我的想象。 –

回答

1

如果內容沒有改變,您可以將當前頁面的內容與前一頁面進行比較,如果相同,則中斷爬網。

例如:

def parse(self, response): 
    product_urls = response.xpath("//a/@href").extract() 
    # check last page 
    if response.meta.get('prev_urls') == product_urls: 
     logging.info('reached the last page at: {}'.format(response.url)) 
     return # reached the last page 
    # crawl products 
    for url in product_urls: 
     yield Request(url, self.parse_product) 
    # create next page url 
    next_page = response.meta.get('page', 0) + 1 
    next_url = re.sub('page=\d+', 'page={}'.format(next_page), response.url) 
    # now for the next page carry some data in meta 
    yield Request(next_url, 
        meta={'prev_urls': product_urls, 
         'page': next_page} 
+0

將'yield'和'return'混合起來是行不通的,但限制產品鏈接的一般想法是非常有趣的。另外,不妨在產生產品'Request'對象之前測試'response.meta.get('prev_urls')== product_urls'。 –

+1

@paultrmbrth謝謝,開始時移動了支票。儘管只要'return'不返回任何東西,混合返回和yield就可以在python2中正常工作,但它在這裏的作用就像'break'。 – Granitosaurus

+0

哦,對。我從來不知道:) Thx –