簡體   English   中英

Scrapy CrawlSpider重試刮擦

[英]Scrapy CrawlSpider retry scrape

對於我要抓取的頁面,有時會在響應中返回一個“占位符”頁面,其中包含一些會自動重新加載直到獲取真實頁面的JavaScript。 我可以檢測到何時發生這種情況,我想重試下載並抓取頁面。 我在CrawlSpider中使用的邏輯類似於:

def parse_page(self, response):
    url = response.url

    # Check to make sure the page is loaded
    if 'var PageIsLoaded = false;' in response.body:
        self.logger.warning('parse_page encountered an incomplete rendering of {}'.format(url))
        yield Request(url, self.parse, dont_filter=True)
        return

    ...
    # Normal parsing logic

但是,似乎當調用重試邏輯並發出新的請求時,頁面及其包含的鏈接不會被爬網或刮擦。 我的想法是,通過使用self.parse用於應用爬網規則的dont_filter=Truedont_filter=True ,我可以避免使用重復的過濾器。 但是,如果DUPEFILTER_DEBUG = True ,我可以看到重試請求已被過濾掉。

我是否缺少某些東西,或者有更好的方法來解決這個問題? 我想避免使用splash之類的方法進行動態js渲染的復雜性,並且這種情況只會間歇性地發生。

我會考慮使用自定義的Retry Middleware ,它類似於內置的

示例實現(未經測試):

import logging

logger = logging.getLogger(__name__)


class RetryMiddleware(object):
    def process_response(self, request, response, spider):
        if 'var PageIsLoaded = false;' in response.body:
            logger.warning('parse_page encountered an incomplete rendering of {}'.format(response.url))
            return self._retry(request) or response

        return response

    def _retry(self, request):
        logger.debug("Retrying %(request)s", {'request': request})

        retryreq = request.copy()
        retryreq.dont_filter = True
        return retryreq

並且不要忘記激活它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM