Scrapy CrawlSpider重试抓取



对于我试图抓取的页面,我有时会在我的响应中得到一个"占位符"页面,其中包含一些自动重新加载的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 (CrawlSpider用来应用抓取规则)和dont_filter=True,我可以避免重复过滤器。然而,与DUPEFILTER_DEBUG = True,我可以看到重试请求被过滤掉。

是我错过了什么,还是有更好的方法来处理这个?如果可能的话,我想避免使用飞溅之类的东西进行动态js渲染的复杂性,这只会间歇性地发生。

我会考虑用一个自定义的重试中间件来代替——类似于内置的。

示例实现(未测试):

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

别忘了激活它

最新更新