如何配置Scrapy允许跟随Wayback Machine的重定向?
我需要从Wayback Machine抓取数千个历史网页备份,不想逐个查找精确快照日期,只想用https://web.archive.org/web/<some_date>/<some_url>格式的链接,让Wayback自动重定向到最近可用快照。
我已有一个能正常抓取当前网页的Scrapy爬虫,但抓取备份页面时只收到重定向提示,没有数据返回,日志如下:
2023-05-04 20:18:33 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2023-05-04 20:18:33 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2023-05-04 20:18:33 [scrapy.core.engine] INFO: Spider opened
2023-05-04 20:18:33 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2023-05-04 20:18:33 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2023-05-04 20:18:36 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://web.archive.org/web/20200204105913/<some_url>> from <GET https://web.archive.org/web/20050313/<some_url>>
我需要让Scrapy允许跟随重定向,该怎么操作?
解决方案
- 确认默认重定向配置:Scrapy默认开启重定向跟随,
REDIRECT_ENABLED默认值为True。如果未修改过该配置,问题大概率出在其他环节。 - 更新允许的域名列表:Wayback重定向后的URL仍属于
web.archive.org域名,若爬虫的allowed_domains仅包含原网站域名,会被OffsiteMiddleware过滤。需把web.archive.org加入列表:allowed_domains = ['原网站域名', 'web.archive.org'] - 调整深度限制:若爬虫设置了
DEPTH_LIMIT,可能限制了重定向跳转次数。可在settings.py中调高该值,确保至少允许1次跳转:DEPTH_LIMIT = 5 # 默认值为0,即无限制,可按需调整 - 自定义重定向中间件:如果默认中间件处理存在异常,可自定义中间件专门适配Wayback的重定向逻辑。在
middlewares.py中添加:
然后在from scrapy.downloadermiddlewares.redirect import RedirectMiddleware class WaybackRedirectMiddleware(RedirectMiddleware): def process_response(self, request, response, spider): if response.status in (301, 302, 303, 307, 308) and 'web.archive.org' in response.url: return super().process_response(request, response, spider) return responsesettings.py中启用自定义中间件,替换默认的RedirectMiddleware:DOWNLOADER_MIDDLEWARES = { '你的项目名.middlewares.WaybackRedirectMiddleware': 600, 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': None, } - 适配快照页面解析逻辑:Wayback的快照页面会带有自身的导航栏,需检查爬虫的
parse方法中,XPath或CSS选择器是否能正确定位原网页的核心内容,必要时调整选择器规则。
内容的提问来源于stack exchange,提问作者NotAName

