Scrapy重试或重定向中间件

  发布于 2023-02-07 19:24

在使用scrapy浏览网站时,我会在大约1/5的时间内被重定向到用户阻止的页面.我输了,我重定向的页面当这种情况发生.我不知道在中间件中使用哪个中间件或使用什么设置,但我想要这个:

DEBUG: Redirecting (302) to (GET http://domain.com/foo.aspx) from (GET http://domain.com/bar.htm)

不要掉落bar.htm.当刮刀完成时,我最终没有来自bar.htm的数据,但我正在旋转代理,所以如果它再次尝试bar.htm(可能再多次),我应该得到它.如何设置尝试次数?

如果它很重要,我只允许爬虫使用一个非常具体的起始网址然后只按照"下一页"链接,所以它应该按顺序通过少量页面 - 因此我需要它重试,例如,第34页,或稍后再回来.Scrapy文档说默认情况下应该重试20次,但我根本没有看到它重试.此外,如果它有帮助:所有重定向都转到同一页面(一个"离开"页面,上面的foo.com) - 有没有办法告诉Scrapy该特定页面"不计数",如果它被重定向到那里,继续重试?我在下载程序中间件中看到了一些引用列表中特定http代码的内容 - 我能以某种方式向"始终保持尝试此"列表中添加302吗?

1 个回答
  • 我今天遇到了同样的问题,一个使用301..303重定向的网站,但有时也有元重定向.我已经构建了一个重试中间件,并使用了重定向中间件的一些块:

    from scrapy.contrib.downloadermiddleware.retry import RetryMiddleware
    from scrapy.selector import HtmlXPathSelector
    from scrapy.utils.response import get_meta_refresh
    from scrapy import log
    
    class CustomRetryMiddleware(RetryMiddleware):
    
        def process_response(self, request, response, spider):
            url = response.url
            if response.status in [301, 307]:
                log.msg("trying to redirect us: %s" %url, level=log.INFO)
                reason = 'redirect %d' %response.status
                return self._retry(request, reason, spider) or response
            interval, redirect_url = get_meta_refresh(response)
            # handle meta redirect
            if redirect_url:
                log.msg("trying to redirect us: %s" %url, level=log.INFO)
                reason = 'meta'
                return self._retry(request, reason, spider) or response
            hxs = HtmlXPathSelector(response)
            # test for captcha page
            captcha = hxs.select(".//input[contains(@id, 'captchacharacters')]").extract()
            if captcha:
                log.msg("captcha page %s" %url, level=log.INFO)
                reason = 'capcha'
                return self._retry(request, reason, spider) or response
            return response
    

    为了使用这个中间件,最好在settings.py中禁用此项目的现有重定向中间件:

    DOWNLOADER_MIDDLEWARES = {
                             'YOUR_PROJECT.scraper.middlewares.CustomRetryMiddleware': 120,
                              'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': None,
                              'scrapy.contrib.downloadermiddleware.redirect.MetaRefreshMiddleware': None,
    }
    

    2023-02-07 19:26 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有