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 并遵从你的。
我正从 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 并遵从你的。