Requests和Scrapy都是python爬虫的主流框架
但是在爬虫过程中经常遇到一种情况:Requests能拿到数据,同样的逻辑和请求头放到Scrapy就不行了
出现这种情况的主要原因是Scrapy会自动带一些请求头
以http://www.hngp.gov.cn/henan/content?infoId=1221840&channelCode=H600106这个网址为例
Requests代码
import requests
url = "http://www.hngp.gov.cn/henan/content?infoId=1221840&channelCode=H600106"
response = requests.request("GET", url)
print(response.text)
requests能轻轻松松拿到数据 甚至请求头都不需要带
Scrapy代码
class HenanzhenfucaigouwangSpider(scrapy.Spider):
name = 'HeNanZhenFuCaiGouWang'
start_urls = ['http://www.hngp.gov.cn/henan/content?infoId=1221840&channelCode=H600106']
def start_requests(self):
yield scrapy.Request(
url='http://www.hngp.gov.cn/henan/list2?pageNo=1&pageSize=16&bz=1&gglx=0',
callback=self.parse
)
def parse(self, response, **kwargs):
urls = response.css(".List2>ul>li>a")
yield from response.follow_all(urls=urls, callback=self.parse_item)
def parse_item(self, response):
print(response.text)
此时会报出如下错误 404
Ignoring response <404 http://www.hngp.gov.cn/henan/content?infoId=1223857&c
hannelCode=H600104>: HTTP status code is not handled or not allowed
要想解决此类问题,需要借助抓包软件,进行抓包分析他们请求的不同之处 我是用的是Fiddler
抓包结果
requests.png scrapy.png上述分别是 requests和scrapy的抓包结果
不难看出scrapy自己”好心“的为我们做了很多事 比如Accept还有cookies
我们把这些都清除掉再试一下
class HenanzhenfucaigouwangSpider(scrapy.Spider):
name = 'HeNanZhenFuCaiGouWang'
start_urls = []
custom_settings = {
# 清除cookies 也可以直接配置在settings中
"COOKIES_ENABLED": False
}
def start_requests(self):
yield scrapy.Request(
url='http://www.hngp.gov.cn/henan/list2?pageNo=1&pageSize=16&bz=1&gglx=0',
callback=self.parse
)
def parse(self, response, **kwargs):
urls = response.css(".List2>ul>li>a")
# 强制换成我们需要的请求头
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Host': 'www.hngp.gov.cn',
}
yield from response.follow_all(urls=urls, callback=self.parse_item, headers=headers)
def parse_item(self, response):
print(response.text)
再次请求就可以发现成功了
总结
如果出现requests可以scrapy不行的情况 首先要排除是不是我们代码写错了 其余基本上都是因为Scrapy自己做了一些操作 导致请求头不一样了 此时可以用抓包软件进行抓包分析 找到两者的不同之处 再强制换成我们需要的样子
注意:不要照搬我的代码,因为你遇到的情况和我的并不一定完全一样,最重要的还是抓包分析,找到问题根源
网友评论