Python中Scrapy下载管道遇到301重定向报错如何解决?
7882 2019-01-01 19:21:26 [searchwww][scrapy.core.engine] INFO: Spider opened 7883 2019-01-01 19:21:26 [searchwww][scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 7884 2019-01-01 19:21:26 [searchwww][scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6031 7885 2019-01-01 19:21:38 [searchwww][scrapy.core.engine] DEBUG: Crawled (200) <GET https://searchwww.sec.gov/EDGARFSClient/jsp/EDGAR_MainAccess.jsp?search_text=F-1+ for&sort=Date&startDoc=101&numResults=100&isAdv=true&formType=FormF1&fromDate=mm/dd/yyyy&toDate=mm/dd/yyyy&stemming=true> (referer: None) 7886 2019-01-01 19:21:38 [searchwww][scrapy.core.engine] DEBUG: Crawled (301) <GET http://www.sec.gov/Archives/edgar/data/1747624/000121390018017885/ff12018_fitboxxholdings.htm> (referer: None) 7887 2019-01-01 19:21:38 [searchwww][scrapy.pipelines.files] WARNING: File (code: 301): Error downloading file from <GET http://www.sec.gov/Archives/edgar/data/1747624/000121390018017885/ ff12018_fitboxxholdings.htm> referred in <none></none>
from scrapy.pipelines.files import FilesPipeline from scrapy import Request
class download_pipeline(FilesPipeline):
def file_path(self, request, response=None, info=None):
return request.meta.get('filename', '')
def get_media_requests(self, item, info):
file_url = item[‘file_url’]
meta = {‘filename’: item[‘name’]}
yield Request(url=file_url, meta=meta)
这个在下载的管道里面总是报错 301 求指教
Python中Scrapy下载管道遇到301重定向报错如何解决?
被重定向了吗?
在Scrapy下载管道里遇到301重定向报错,通常是因为请求被重定向到了HTTPS或其他URL,但处理不当。主要问题出在Request.meta的dont_redirect设置或中间件配置上。
直接解决方案:
在你的爬虫请求里加上dont_redirect和handle_httpstatus_list参数,像这样:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url,
meta={'dont_redirect': True,
'handle_httpstatus_list': [301]},
callback=self.parse)
def parse(self, response):
# 检查状态码
if response.status == 301:
# 从响应头获取重定向目标
redirect_url = response.headers.get('Location')
if redirect_url:
# 重新发起请求到新URL
yield scrapy.Request(redirect_url.decode(), callback=self.parse)
else:
# 正常处理响应
# ... 你的解析代码 ...
pass
如果问题在下载中间件:
检查settings.py,确保重定向中间件是启用的(默认就是开的):
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 543,
}
有时候网站会返回非标准的301状态码,可以在设置里扩展处理的状态码列表:
HTTPERROR_ALLOWED_CODES = [301]
根本原因:
Scrapy的RedirectMiddleware默认会自动处理301/302重定向。但如果网站重定向逻辑特殊(比如循环重定向、重定向到不同协议),或者响应头信息不标准,就可能报错。手动处理能让你更精确地控制重定向流程。
一句话建议: 在Request的meta里设置dont_redirect=True并手动处理301响应,是最直接可靠的方法。
如何解决
#2 这个是服务端行为啊,你可以看下为什么被重定向了,在 response 里面看下被重定向到了哪个地址
这个主要是框架做的,yield 回去的,我用正常的 request 就没有问题,搞不懂

