Scrapy的301、302重定向问题原因及解决办法

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

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

2019-02-13 17:18:32 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2019-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>
2019-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>
2019-02-13 17:18:40 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.baidu.com/forbiddenip/forbidden.html> (referer: None)
2019-02-13 17:18:41 [scrapy.core.engine] INFO: Closing spider (finished)
2019-02-13 17:18:41 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 2295,

301、302

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

302:(暂时的重定向)

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

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

参考:https://www.cnblogs.com/haitianzhimen/p/8618251.html

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

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

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

参考:https://www.cnblogs.com/zhengdongdong/p/10876523.html

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

如何伪装爬虫:https://zhidao.baidu.com/question/814573192067571772.html

原因3:在REQUEST_HEADERS指定了Host。

参考:https://www.jianshu.com/p/001d6aa123cb

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

“错误”的解决办法:

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

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

    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,eg:

HTTPERROR_ALLOWED_CODES = [302]

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

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

也因为如此,将这些可能的原因及解决办法汇总,供后来者参考。

Scrapy的301、302重定向问题原因及解决办法根据 HTTP标准 ,返回值为200-300之间的值为成功的response。Scrapy运行爬虫过程中,目标网站返回301或302,而没有获取到想要的网页内容,表示请求失败。eg:2019-02-13 17:18:32 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:60232019-02-13 17:18:33 [scrapy.downloaderm
爬虫的获取数据上,一直在讲一些爬取的方法,想必小伙伴们也学习了不少。在学习的过程中遇到了问题,大家也会一起交流解决,找出不懂和出错的地方。今天小编想就爬虫采集数据时遇到的问题进行一个整理,以及在遇到不同的问题时,我们应该想的是什么样的解决思路,具体内容如下分享给大家。 1、需要带着cookie信息访问 比如大多数的社交化软件,基本上都是需要用户登录之后,才能看到有价值的东西,其实很简单,我们可以使用Python提供的cookielib模块,实现每次访问都带着源网站给的cookie信息去访问,这样只要我们成功模拟了登录,爬虫处于登录状态,那么我们就可以采集到登录用户看到的一切信息了。下面是使用
上一篇文章中使用nodejs程序解析了网页编码为gbk,gb2312,以及utf-8的情况,这里面有三种特殊的乱码情况需要单独的说明一下. 1,网页编码为utf-8,但是解析为乱码,代表网站为www.guoguo-app.com。 这个问题真是个逗逼问题,查看网页源码中给出的编码方式为utf8,如下: <meta charset=UTF-8> <title>查快递</title> 由于解析出来的始终是乱码,我就抓包看了下,报文中的编码方式为gbk,果然我使用gbk的方式之后,得到的不再是乱码了。淘宝为了反爬虫也是操碎了新,但是我也很好奇这种方式是怎么实现的,知道的告诉我。 GET /
在使用Scrapy框架中URl被重定向,总是遇到这类问题: DEBUG: Redirecting (301/302) to <GET https://XXXX refer https://XXXX> 解决方式: 在Scrapy中的Request中添加 dont_filter=True,因为Scrapy是默认过滤掉重复的请求URL,添加上参数之后即使被重定向了也能请求到正常的数据了。 在Scrapy框架中的 settings.py文件里添加 HTTPERROR_ALLOWED_COD
在使用scrapy爬取网站数据的时候遇到了302重定向问题,可以在Request中添加meta参数。 yield scrapy.Request(url, callback=self.parse, meta={'dont_redirect': True, 'handle_httpstatus_list': [302]}) 'dont_redirect’是禁止重定向。 'handle_httpstatus_list’是scrapy可以处理的响应状态码。 因为scrapy默认只能处理状态码在200-300之间的响
1.什么是状态码301,302 301 Moved Permanently(永久重定向) 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。比如百度百科:http://baike.baidu.com/fenlei/%E6%94%BF%E6%B2%BB%E4%BA%BA%E7%89%A9 解决(一) 1.在Request中将scrapy的dont...
今天,在采集数据的时候,目标网站一直返回301,百思不得其解,在网上也找了好多的解决办法,大多不靠谱,经过分析后,问题终于解决了, 目标网站返回301原因肯定是,爬虫伪装的不够好,被服务器识别出是爬虫,所以直接返回了301后者是404,403等状态码。 解决办法是:通过f12分析,得到浏览器访问网站是带的一些参数,如下图: 可以一个一个的试验,看到底是那几个参数是关键参数,一般来说肯定...
记录一下我爬虫遇到的一个简单问题,为了不试爬虫过多的出现转向问题,我加了一个allow_redirects=False,默认它是为True的,后来跑着跑着就出现301的问,偶然测试我把allow_redirects=False去掉,就出现响应码正常了。为了防止跳转问题,每次运行完,我把resp.close(),手动关闭连接。 resp = requests.get(url=url, headers...
m0_63471180: 运行make出现: NDT_PCL_demo/normal_distributions_transform.cpp:49:16: error: ‘boost::this_thread’ has not been declared 49 | boost::this_thread::sleep (boost::posix_time::microseconds (100000));