Ich bin von requests
Bibliothek von Python zu scrapy
, und ich habe Probleme mit einer einfachen POST-Anfrage. Ich gründe Header und Nutzlast als solche:Scrapy POST-Anfrage funktioniert nicht - 400 Bad Request
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}}
Und dann machen die Anfrage wie folgt aus:
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)
Und das hält auf dem Geben Sie mir 400-Status. Wenn ich die Anfrage unter Verwendung der exakt gleichen Header und Payload mit der requests
Bibliothek mache, gibt es mir 200 Status und gibt wie erwartet einen JSON zurück.
r = requests.post(url, headers=headers, data=json.dumps(payload), verify=False)
Was mache ich falsch?
Sie sollten wirklich nicht Ihre eigenen 'Content-Length' Header setzen. Die meisten Bibliotheken berechnen das für Sie. Wenn 'scrapy' es zweimal sendet, wird der Server * von der Spezifikation * aufgefordert, eine 400 zurückzugeben. –
Das war es! Funktioniert jetzt wie ein Zauber. Vielen Dank! :) –
@ sigmavirus24 diese Antwort ist großartig, bitte posten Sie es im Antwortbereich. –