scrapy.Request请求地址返回400,但是用单独request模块请求同样的url返回正常

一 问题描述

用scrapy.Request()方法请求一个url地址,发现返回400错误,我检查了我不是被封ip,把请求链接直接copy到浏览器上,是可以正常显示结果的,单独用python的requests模块post请求同样的url地址,获得的是正常的返回,我就不明白了,是我scrapy.Request的里面格式错误了?

二 代码展示

scrapy的 spider文件,scrapy项目是用scrapy的命令行执行出来的,常规设置,其他不变

# -*- coding: utf-8 -*-
import scrapy


class PileSpider(scrapy.Spider):
    name = "pile"
    allowed_domains = ["www.evehicle.cn"]

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'Content-Length': '11',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Host': 'www.evehicle.cn',
        'Origin': 'http://www.evehicle.cn',
        'Referer': 'http://www.evehicle.cn/wp-content/themes/newsite/html/emap.html',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest',

    }
    url_all = 'http://www.evehicle.cn/wp-content/themes/newsite/tool/api.php?api=web/sites'

    def start_requests(self):
        print('1')
        yield scrapy.Request(url=self.url_all, callback=self.parse_all, headers=self.headers, method='POST')

    def parse_all(self, response):
        print(response)

图片描述

三 错误反馈

图片描述

如图,请求scrapy后台提示出现了400返回,请求链接错误,可是我是按照chrome工具中显示的头部请求信息填写的scrapy.Request()的请求。我就不知道错在哪里了。

相反,我单独用requests模块请求这个url,相同的头部就是返回正确的信息,没用http抱错。

requests.post(url=all_url, headers=headers, timeout=5)
阅读 9k
评论
    6 个回答

      你这就是个GET 为啥要POST...

        400是因为你的请求头部有错误。用GET请求,Content-Length:0(这个头部也可以不用)。你的请求体没有任何东西,Content-Length怎么会是11呢

          yield scrapy.Request(url=self.url_all, callback=self.parse_all, headers=self.headers, method='POST')

          既然你用了post,那么post的内容呢?

            • 1
            • 新人请关照

            我遇到的问题是
            cookie
            header都设置正确
            并且debug,检查scrapy生效

            用requqests请求是200
            但是scrapy是400

            检查了下url
            发现 /引起的问题

            比如https://www.a.com?a=b
            https://www.a.com/?a=b

            上述两个url,一个是200,一个是400
            。。。。。
            终于fix了

              • 1
              • 新人请关照

              我也遇到了同样的问题,请问你解决了吗?

              该答案已被忽略,原因:无意义的内容 - 赞、顶、同问等毫无意义的内容

                撰写回答

                登录后参与交流、获取后续更新提醒