我正在尝试使用urllib2调用NYT事件api,但我收到了596错误。如果我自己构建url,没有问题,但如果我用数据调用urlopen,我会收到596错误。这是怎么回事? 596错误似乎没有记录,因此没有用。
>>> data = urllib.urlencode({'api-key': os.environ['NYT_EVENT_LISTING_API_KEY']})
>>> resp = urllib2.urlopen('?'.join([url,data]))
>>> resp = urllib2.urlopen(url, data)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open
response = meth(req, response)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response
'http', request, response, code, msg, hdrs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error
return self._call_chain(*args)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain
result = func(*args)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 596:
答案 0 :(得分:2)
@Thomas是对的,你在第一个请求中使用GET
,它将构建如下所示的URL:
nytimes.com/api/?MY_API_KEY
但是,您对urllib2.urlopen
的第二次通话会将data
作为POST
请求发送到此网址
nytimes.com/api/
相反,它为您提供 596服务未找到错误。
现在,urllib2
因其非直观的API和文档而臭名昭着,您可以考虑使用Requests
代替:
import requests
api_key = {'api-key': os.environ['NYT_EVENT_LISTING_API_KEY']}
resp = requests.get(url, params=api_key)
print resp.text
print resp.json
这样,GET
请求和POST
请求更容易区分,url和参数也会分开。
答案 1 :(得分:1)
您的第一个请求是GET请求 - 第二个请求是POST请求。请参阅此docs - 当提供参数data
时,urlopen会执行POST请求。