美文网首页
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