首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刮伤CrawlSpider重试刮

刮伤CrawlSpider重试刮
EN

Stack Overflow用户
提问于 2015-09-19 03:57:53
回答 1查看 1.3K关注 0票数 2

对于我试图刮掉的页面,我有时会在响应中得到一个“占位符”页面,其中包含一些自动重新加载的javascript,直到得到真正的页面为止。我可以检测到什么时候发生这种情况,我想重试下载和抓取页面。我在我的CrawlSpider中使用的逻辑如下:

代码语言:javascript
复制
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,我可以看到重试请求被过滤掉了。

我是不是遗漏了什么,还是有更好的方法来处理?如果可能的话,我希望避免使用类似splash之类的东西来执行动态js呈现的复杂性,而且这种情况只会间歇性地发生。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-19 04:09:15

我会考虑使用http://doc.scrapy.org/en/1.0/topics/downloader-middleware.html#writing-your-own-downloader-middleware --类似于内建一

示例实现(未测试):

代码语言:javascript
复制
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

别忘了激活它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32664022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档