gpt4 book ai didi

python - Scrapy 重试或重定向中间件

转载 作者:太空狗 更新时间:2023-10-29 22:22:41 29 4
gpt4 key购买 nike

在使用 scrapy 爬取网站时,大约有 1/5 的时间我被重定向到用户阻止的页面。当发生这种情况时,我丢失了从 重定向的页面。我不知道要使用哪个中间件或在该中间件中使用什么设置,但我想要这个:

调试:从 (GET http://domain.com/bar.htm) 重定向 (302) 到 (GET http://domain.com/foo.aspx)

不要删除 bar.htm。当抓取器完成时,我最终没有来自 bar.htm 的数据,但我正在轮换代理,所以如果它再次尝试 bar.htm(可能再试几次),我应该得到它。如何设置尝试次数?

如果重要的话,我只允许爬虫使用一个非常具体的起始 url,然后只跟随“下一页”链接,所以它应该按顺序浏览少量页面——这就是为什么我需要它要么重试,例如第 34 页,要么稍后再返回。 Scrapy 文档说它应该默认重试 20 次,但我根本没有看到它重试。此外,如果它有帮助:所有重定向都转到同一页面(一个“离开”页面,上面的 foo.com) - 有没有办法告诉 Scrapy 该特定页面“不算数”,如果它被重定向到那里,继续重试?我在下载器中间件中看到某些内容引用列表中的特定 http 代码 - 我可以以某种方式将 302 添加到“始终继续尝试此”列表吗?

最佳答案

我今天在一个使用 301..303 重定向但有时也使用元重定向的网站上遇到了同样的问题。我建立了一个 retry middleware并使用了 redirect 中的一些 block 中间件:

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,
}

关于python - Scrapy 重试或重定向中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805932/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com