一个奇怪的错误请求错误

时间:2017-08-27 02:02:02

标签: python web-scraping http-post

我想从这里获取跑步者的信息:http://results.nyrr.org/event/M2016/finishers。我发送一个帖子请求来获取单个跑步者的信息(在这种情况下,第一个):

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

问题是我收到Response [400],错误的请求错误。但是,如果我去网站,点击跑步者,再次运行发布请求,我会得到Response [200]我想要的信息。

我想要所有参赛者的信息,所以在使用发布请求之前我不能点击每个参赛者的信息。为什么我有这个错误?我该如何解决?

2 个答案:

答案 0 :(得分:0)

当您从网站下载时,您会发送一些cookie以及请求。检查浏览器中“开发者工具”发送的Cookie,并将其与requests.post一起发送。

答案 1 :(得分:0)

您的代码在我的计算机上顺利运行:

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

screenshot

所以我只能猜到你的代码无法正常工作。

以下是浏览器的正常请求:

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}

与python代码发送的请求相比,我们可以看到以下差异:

  • 普通请求使用JSON发送参数,而您的代码以表单格式发送参数。
  • 普通请求包含一些标题,例如User-AgentReferer,它们通常用于执行反刮。
  • 正常请求具有由JS代码生成的UsernamePassword标头。绝对是用于防刮,但我不知道为什么这不起作用。

接下来是我可以给你的建议:

  • 以JSON格式发送参数。喜欢:requests.post('http://...', json={'runnerId': 11585036})
  • 添加更多标题。喜欢:requests.post('http://...', json=..., headers={'User-Agent':'...', ...})
  • 如果您仍然被禁刮技术禁止,请使用selenium