2017-02-15 21 views
1

Я перехожу из библиотеки requests от python в 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-библиотек общего назначения. Большинство библиотек будут они генерируют сами:

  • Хост
  • Content-Length

В частности, HTTP РЛК указать очень ясно, что любое время заголовок Content-Length отправляется несколько раз (что может быть Scrapy то ответ должен быть быть 400. Запросы, скорее всего, не устанавливают собственный заголовок Content-Length и отменяют ваш.