2017-02-15 142 views
1

我正在從python的requests庫移動到scrapy,並且我在發出簡單POST請求時遇到問題。我設置標題和有效載荷這樣:Scrapy POST請求不起作用 - 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}} 

然後發出請求是這樣的:

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庫完全相同的標頭和有效載荷發出請求,它會給我200個狀態並按預期返回一個json。

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

我在做什麼錯?

+2

你真的不應該設置你自己的'Content-Length'頭。大多數圖書館都會爲你計算。如果'scrapy'發送兩次,服務器*規格要求*返回400. –

+0

就是這樣!現在就像魅力一樣。謝謝! :) –

+0

@ sigmavirus24這個答案很好,請將它發佈在答案區。 –

回答

2

您在請求中使用的這些標頭中的幾個不適合使用通用HTTP庫。大多數圖書館會產生這些自己:

  • 主機
  • 內容長度

具體來說,HTTP RFC中規定得很清楚,任何時候Content-Length頭中發送一次以上(其中Scrapy可能做),那麼響應必須是400.請求,可能不會設置它自己的內容長度標題,並推遲到你的。