我最近正在一個網站蜘蛛工作,並且注意到它請求無限數量的頁面,因爲一個網站沒有編碼他們的分頁來停止。Scrapy - 如何避免分頁黑洞?
因此,儘管他們只有內容幾頁,它仍然會產生下一個鏈接和網址...?頁= 400,...?頁= 401等
內容沒不會改變,只是網址。當內容停止更改時,有沒有辦法讓Scrapy停止分頁?或者我可以編寫自定義的東西。
我最近正在一個網站蜘蛛工作,並且注意到它請求無限數量的頁面,因爲一個網站沒有編碼他們的分頁來停止。Scrapy - 如何避免分頁黑洞?
因此,儘管他們只有內容幾頁,它仍然會產生下一個鏈接和網址...?頁= 400,...?頁= 401等
內容沒不會改變,只是網址。當內容停止更改時,有沒有辦法讓Scrapy停止分頁?或者我可以編寫自定義的東西。
如果內容沒有改變,您可以將當前頁面的內容與前一頁面進行比較,如果相同,則中斷爬網。
例如:
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}
將'yield'和'return'混合起來是行不通的,但限制產品鏈接的一般想法是非常有趣的。另外,不妨在產生產品'Request'對象之前測試'response.meta.get('prev_urls')== product_urls'。 –
@paultrmbrth謝謝,開始時移動了支票。儘管只要'return'不返回任何東西,混合返回和yield就可以在python2中正常工作,但它在這裏的作用就像'break'。 – Granitosaurus
哦,對。我從來不知道:) Thx –
你需要跟蹤的東西,改變,當它已經不停止,即網頁標題或顯示結果的標題(你可以通過一個XPath分析文本明顯地查詢)。 – Jan
但是,我會如何將它鏈接到一個URL,它即將刮掉並阻止LinkExtractor使用它?將它集成到CrawlSpider中已經超出了我的想象。 –