2017-02-15 6 views
1

파이썬의 requests 라이브러리에서 scrapy으로 이동하고 간단한 POST 요청을하는 데 문제가 있습니다.Scrapy POST 요청이 작동하지 않음 - 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}} 

을 그리고 요청과 같이 제작 : I는 다음과 같은 헤더와 페이로드를 설정하고

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이 될 수있는 그 다음에 응답 이되어야합니다. 요청은 자신의 Content-Length 헤더를 설정하지 않고 자신을 방어합니다.