python - Scrapy POST 请求不工作 - 400 错误请求

标签 python scrapy python-requests http-status-code-400

我正在从 python 的 requests 库迁移到 scrapy,但我在发出简单的 POST 请求时遇到了问题。我正在这样设置 header 和有效负载:

headers = {
    'Accept':'*/*',
    'Accept-Encoding':'gzip, deflate, br',
    'accept-language':'en_US',
    'Connection':'keep-alive',
    'Content-Length':'151',
    'content-type':'application/json',
    'Cookie':cookie,
    'Host':host,
    'Origin':origin,
    'Referer':referer,
    'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'x-csrf-token':token
}

payload = {"targetLocation":{"latitude":lat,"longitude":lng}}

然后像这样发出请求:

def start_requests(self):
    u = self.url
    yield scrapy.Request(u, method='POST',
                            callback=self.parse_httpbin,
                            errback=self.errback_httpbin,
                            body=json.dumps(self.payload),
                            headers=self.headers)

这一直给我 400 状态。如果我使用与 requests 库完全相同的 header 和负载发出请求,它会给我 200 状态并返回一个 json,如预期的那样。

r = requests.post(url, headers=headers, data=json.dumps(payload), verify=False)

我做错了什么?

最佳答案

您请求中的一些 header 不建议使用通用 HTTP 库。大多数图书馆会自己生成这些:

  • 主持人
  • 内容长度

具体来说,HTTP RFC 非常明确地规定,任何时候 Content-Length header 被发送多次(Scrapy 可能会这样做)然后响应必须一个 400. 请求,可能没有设置它自己的 Content-Length header 并遵从你的。

关于python - Scrapy POST 请求不工作 - 400 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248903/

相关文章:

mysql - Pipeline 不写入 MySQL,但也没有给出错误

python - 如何使用 Scrapy 抓取 JSON 数据

python - 如何从 Python POST 请求中获取 JSON 数据

python - 请求有效而 URLFetch 无效

python - Windows 如何将 pe 文件链接到它在目录文件中的签名?

python - lxml 未安装在 AWS Elasticbeanstalk 实例上

python - scrapy抓取多个页面,提取数据并保存到mysql中

Python requests_ntlm导入错误

python - 是否有一个版本的 __file__ 在函数中使用时会获取使用该库的文件的名称?

python - Pandas 对一列进行分组而不丢失其他列?