gpt4 book ai didi

Python get 引发 HTTPError 400 Client Error,但手动访问 URL 后,get 暂时有效

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:52 24 4
gpt4 key购买 nike

当我在 iPython (Python 2.7) 中运行这段代码时:

from requests import get
_get = get('http://stats.nba.com/stats/playergamelog', params={'PlayerID': 203083, 'Season':'2015-16', 'SeasonType':'Regular Season'})
print _get.url
_get.raise_for_status()
_get.json()

我得到:

http://stats.nba.com/stats/playergamelog?PlayerID=203083&Season=2015-16&SeasonType=Regular+Season
---------------------------------------------------------------------------
HTTPError Traceback (most recent call last)
<ipython-input-5-8f8343b2c4cd> in <module>()
1 _get = get('http://stats.nba.com/stats/playergamelog', params={'PlayerID': 203083, 'Season':'2015-16', 'SeasonType':'Regular Season'})
2 print _get.url
----> 3 _get.raise_for_status()
4 _get.json()

/Library/Python/2.7/site-packages/requests/models.pyc in raise_for_status(self)
849
850 if http_error_msg:
--> 851 raise HTTPError(http_error_msg, response=self)
852
853 def close(self):

HTTPError: 400 Client Error: Bad Request

但是,如果我在浏览器中访问该 url,它会起作用。然后,当我在浏览器(运行 iPython 的 Chrome)中手动访问 URL 后返回代码并再次运行它时,代码运行没有错误。但是,它可能会返回到在顺序执行中引发错误。

这段代码已经为我工作了数百次甚至数千次都没有问题。如何修复此错误?

谢谢。

最佳答案

HTTPError: 400 Client Error: Bad Request 表示您发出的请求有错误。而且我认为服务器可能会检查 HTTP 请求中的一些 header ,例如 user-agent

所以我尝试设置 User-Agent header 来模仿 Firefox:

# No User-Agent
>>> _get = get('http://stats.nba.com/stats/playergamelog', params={'PlayerID': 203082, 'Season':'2015-16', 'SeasonType':'Regular Season'})
>>> _get.raise_for_status()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\requests\models.py", line 840, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http://stats.nba.com/stats/playergamelog?PlayerID=203082&Season=2015-16&SeasonType=Regular+Season

# This time, set user-agent to mimic a desktop browser
>>> headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'}
>>> _get = get('http://stats.nba.com/stats/playergamelog', params={'PlayerID': 203082, 'Season':'2015-16', 'SeasonType':'Regular Season'}, headers=headers)
>>> _get.raise_for_status()
>>>
# no error

在浏览器中访问 URL 后它可以工作的原因是缓存。

根据 Alastair McCormack 的说法,stats.nba.com 以 Akamai CDN 为前端,因此缓存可能发生在边缘,由查询字符串/URI 而不是额外的 header “变化”。一旦对该 URI 作出有效响应,它就会被为该客户端提供服务的 CDN 边缘节点缓存。

因此,当您在浏览器中访问 url 后运行代码时,CDN 会将缓存的响应返回给您。在这种情况下不会增加400。

关于Python get 引发 HTTPError 400 Client Error,但手动访问 URL 后,get 暂时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35009755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com