2017-08-27 1 views
0

ここからランナーの情報を入手したい:http://results.nyrr.org/event/M2016/finishers。私は(この場合は、最初の1)単一のランナーのための情報を取得するためのPOSTリクエストを送信します。奇妙で悪いリクエストエラー

request = requests.post('http://results.nyrr.org/api/runners/resultDetails', {'runnerId': 11585036}) 

問題は、不正な要求エラー、私はResponse [400]を得るということです。しかし、私がウェブサイトに行ってランナーをクリックし、ポストリクエストを再度実行すると、私は希望の情報をResponse [200]に得ます。

私はすべての走者の情報を欲しがっていますので、投稿要求を使用する前に各自の情報をクリックすることはできません。なぜこのエラーが発生していますか?どうすれば解決できますか?

答えて

0

あなたのコードは私のコンピュータでスムーズに実行:あなたのコードが動作しない理由を

>>> requests.post('http://results.nyrr.org/api/runners/resultDetails', {'runnerId': 11585036}) 
<Response [200]> 

screenshot

は、だから私は推測することしかできません。ここで

は、ブラウザによって通常のリクエストである:あなたのPythonコードで送信された要求と比較すると

POST http://results.nyrr.org/api/runners/resultDetails HTTP/1.1 
Host: results.nyrr.org 
Connection: keep-alive 
Content-Length: 21 
Accept: application/json, text/plain, */* 
Username: subscriber 
Origin: http://results.nyrr.org 
Password: umPrcNcZKuJ9TQ2 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 
Content-Type: application/json;charset=UTF-8 
Referer: http://results.nyrr.org/event/M2016/result/2 
Accept-Encoding: gzip, deflate 
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 
Cookie: __cfduid=d518b5aad8e36a9f400b27bbf4355f42e1503820652; ARRAffinity=d217e26f983a10c0f58203f7743dc44212160b2fbe97e9354b4a7b599e51a221; __atuvc=2%7C35; __atuvs=59a27b785f22cb33001 

{"runnerId":11585036} 

、我々は次のような違いがわかります。

  • を通常のリクエストはJSONを使用してパラメータを送信します一方、コードはフォーム形式でパラメータを送信します。
  • User-AgentRefererのようないくつかのヘッダーが通常の要求に含まれていますが、これはしばしば擦り止めを実行するために使用されます。
  • 通常のリクエストには、JSコードによって生成されたUsernamePasswordヘッダーがあります。絶対にそれは擦り止めに使用されますが、なぜこれが機能していないのかわかりません。

そしてここで私はあなたに与えることができますアドバイスされています

  • JSON形式でパラメータを送信します。 Like:requests.post('http://...', json={'runnerId': 11585036})
  • ヘッダーを追加します。好きなもの:requests.post('http://...', json=..., headers={'User-Agent':'...', ...})
  • 抗掻き取り技術によってまだ禁止されている場合は、seleniumを使用してください。
+0

あなたのアドバイスは動作しました:) – Belisario

0

ウェブサイトからダウンロードすると、リクエストとともにいくつかのクッキーが送信されます。あなたのブラウザの「デベロッパーツール」から送信されたクッキーを確認し、requests.postと同じものを送信してください。