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重定向报错如何解决?

5 回复

被重定向了吗?


在Scrapy下载管道里遇到301重定向报错,通常是因为请求被重定向到了HTTPS或其他URL,但处理不当。主要问题出在Request.metadont_redirect设置或中间件配置上。

直接解决方案:

在你的爬虫请求里加上dont_redirecthandle_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 就没有问题,搞不懂

回到顶部