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

Scrapy POST request not working - 400 Bad Request

我正从 python 的 requests 库转移到 scrapy,我在发出简单的 POST 请求时遇到了问题。我正在设置 headers 和有效载荷:

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 库完全相同的 headers 和有效负载发出请求,它会按预期为我提供 200 状态和 returns 和 json。

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

我做错了什么?

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

  • 主持人
  • Content-Length

具体来说,HTTP RFC 非常清楚地指定任何时候 Content-Length header 被发送不止一次(Scrapy 可能正在做)然后响应 必须 是 400。请求,可能不会设置它自己的 Content-Length header 并遵从你的。