Scrapy爬虫遇到301、302重定向问题解决办法

PS:有需要爬取网站数据的老板可以联系我,微信:n389660610

根据 HTTP标准 ,返回值为200-300之间的值为成功的response。

Scrapy运行爬虫过程中,目标网站返回301或302,而没有获取到想要的网页内容,表示请求失败,如下:

2021-02-13 17:18:32 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2021-02-13 17:18:33 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET http://www.baidu.com/search/?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=%D3%E2%C6%DA%C1%CB%D3%D0%BA%DC%C3%B4%CE%A3%BA%A6> from <GET https://zhidao.baidu.com/search?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=%D3%E2%C6%DA%C1%CB%D3%D0%BA%DC%C3%B4%CE%A3%BA%A6>
2021-02-13 17:18:36 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://www.baidu.com/forbiddenip/forbidden.html> from <GET http://www.baidu.com/search/?lm=0&rn=10&pn=0&fr=search&ie=gbk&word=%D3%E2%C6%DA%C1%CB%D3%D0%BA%DC%C3%B4%CE%A3%BA%A6>
2021-02-13 17:18:40 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.baidu.com/forbiddenip/forbidden.html> (referer: None)
2021-02-13 17:18:41 [scrapy.core.engine] INFO: Closing spider (finished)
2021-02-13 17:18:41 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 2295,

301、302
301 :(永久重定向) 被请求的资源已永久移动到新位置
302:(暂时的重定向)

两个都属于重定向的问题,原因和解决办法差不多,通常是由原因1或原因2导致的。

原因1:网址发生改变,而我们还用旧网址去访问。

比如,我们访问 http😕/www.baidu.com 会跳转到 https😕/www.baidu.com,发送请求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

解决办法:根据重定向的网址(即新的网址)来请求

原因2:爬虫伪装的不够好,被服务器识别出是爬虫。

解决办法:添加User-Agent,Cookie等伪装手段,可以在浏览器中输入about:version查看User-Agent,Cookie。

原因3:在REQUEST_HEADERS指定了Host。

解决办法:注释或删除相关设置

“错误”的解决办法:

“错误”不是指真正的错误,而是指大概率不管用,但也值得一试。

方式1:在请求时添加handle_httpstatus_list,如下:

    def start_requests(self):
        for i in self.start_urls:
            yield scrapy.Request(url=i, meta={
                'dont_redirect': True,		# 这个可以
                'handle_httpstatus_list': [301, 302]	# 这个不行
            }, callback=self.parse)

这个等于掩耳盗铃,不能真正解决问题

方式2:在yield里面加上dont_filter=True

yield scrapy.Request(url=listUrl[i],callback=self.get_content,meta={'item':item},method='GET',dont_filter=True)

部分帖子说在yield里面加上dont_filter=True,能解决这个问题,但实际上不是所有问题都能解决。dont_filter是对出现问题的url将会再次被传递,只是代表多试几次,若是像原因1这样的,无论请求多少次,都是301.

方式3:在settings中添加HTTPERROR_ALLOWED_CODES

HTTPERROR_ALLOWED_CODES = [302]

这个表示允许302的错误而不处理。

这几种方式可能对你有用,因为不同的环境原因不同,我之所以将其归到“错误”,是因为我曾经遇到了一个301问题,因为我用了旧的http://,而新的为https://,试过了上面几种方式都不能解决。

今天的分享到此结束!

爬虫群:794630151

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Scrapy发出请求时,如果遇到重定向Scrapy会自动处理重定向。默认情况下,Scrapy会遵循HTTP重定向,直到达到最终目标URL或达到最大重定向次数。 如果您想在重定向时执行特定的操作,例如跟踪重定向链或修改请求头,您可以使用Scrapy的`meta`参数。以下是一个示例,演示如何在遇到重定向时跟踪重定向链: ```python import scrapy class MySpider(scrapy.Spider): name = 'myspider' start_urls = ['http://www.example.com'] def start_requests(self): for url in self.start_urls: yield scrapy.Request(url, callback=self.parse, meta={'redirect_urls': []}) def parse(self, response): # 从meta参数中获取重定向URL列表 redirect_urls = response.meta.get('redirect_urls', []) # 将当前URL添加到重定向URL列表中 redirect_urls.append(response.url) # 如果存在重定向URL,则跟踪重定向链 if 'Location' in response.headers: location = response.headers['Location'].decode('utf-8') redirect_urls.append(location) yield scrapy.Request(location, callback=self.parse, meta={'redirect_urls': redirect_urls}) else: # 如果没有重定向,则处理响应 yield { 'url': response.url, 'redirect_urls': redirect_urls } ``` 在这个例子中,我们定义了一个名为`myspider`的Spider,并将`start_urls`设置为`http://www.example.com`。我们使用`start_requests`函数创建一个初始请求,并使用`meta`参数传递一个空的重定向URL列表。 在`parse`函数中,我们首先从`meta`参数中获取重定向URL列表。然后,我们将当前URL添加到重定向URL列表中,并检查响应头中是否存在`Location`字段。如果存在,则表示响应是一个重定向,我们将重定向URL添加到重定向URL列表中,并创建一个新的请求,以跟踪重定向链。如果没有重定向,则处理响应。 最后,我们可以通过以下方式启动Spider: ```python from scrapy.crawler import CrawlerProcess process = CrawlerProcess() process.crawl(MySpider) process.start() ``` 在Scrapy日志中,我们可以看到跟踪的重定向链。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿肆si

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值