当我在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)后再次运行代码时,代码运行时没有错误。但是,它可能会回到提高顺序执行中的错误。
这段代码对我来说已经有数百次,甚至数千次也没有问题。如何解决此错误?
感谢。
答案 0 :(得分:3)
HTTPError: 400 Client Error: Bad Request
表示您提出的请求有错误。我认为服务器可能会检查HTTP请求中的某些标头,例如user-agent
。
所以我尝试将User-Agent标头设置为模仿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,因此缓存很可能发生在边缘,并且#34;多变的&#34;通过查询字符串/ URI而不是extranous标头。一旦对该URI进行了有效响应,它就会被服务于该客户端的CDN边缘节点缓存。
因此,当您在浏览器中访问url后运行代码时,CDN将返回缓存的响应。在这种情况下不会筹集400元。