2017-02-15 20 views
1

私はPythonのrequestsライブラリからscrapyに移動しています。単純なPOSTリクエストを作成する際に問題が発生しています。Scrapy POSTリクエストが機能しない - 400 Bad Request

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件のステータスを与え続けている。このような要求を行う

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}} 

そして:私は、ヘッダやペイロードなどを設定しています。 requestsライブラリと全く同じヘッダーとペイロードを使用してリクエストを行うと、期待通りに200ステータスが返され、jsonが返されます。

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

私は間違っていますか?

+2

本当にあなた自身の 'Content-Length'ヘッダを設定すべきではありません。ほとんどの図書館がそれを計算します。 'scrapy'が2回送信している場合、サーバは仕様によって400を返す必要があります。 –

+0

それでした!今の魅力のように動作します。ありがとう! :) –

+0

@ sigmavirus24この回答は素晴らしいです、回答エリアに投稿してください。 –

答えて

2

あなたがリクエストしたこれらのヘッダーは、汎用HTTPライブラリを使用することはお勧めできません。ほとんどのライブラリは、これら自身が生成されます。

  • ホスト
  • のContent-Length

具体的には、HTTPのRFCはScrapyがであるかもしれない(任意の時間がContent-Lengthヘッダが複数回送信されることを非常に明確に指定しますその場合、レスポンスでなければなりません。リクエストでは、独自のContent-Lengthヘッダーが設定されていない可能性があります。

関連する問題