美文网首页
Requests可以Scrapy不行

Requests可以Scrapy不行

作者: 会爬虫的小蟒蛇 | 来源:发表于2022-08-18 16:02 被阅读0次

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自己做了一些操作 导致请求头不一样了 此时可以用抓包软件进行抓包分析 找到两者的不同之处 再强制换成我们需要的样子

注意:不要照搬我的代码,因为你遇到的情况和我的并不一定完全一样,最重要的还是抓包分析,找到问题根源

相关文章

网友评论

      本文标题:Requests可以Scrapy不行

      本文链接:https://www.haomeiwen.com/subject/ynsugrtx.html