Python 使用urllib2调用NYT times events api时出现HTTPError 596

Python 使用urllib2调用NYT times events api时出现HTTPError 596,python,urllib2,urllib,asp.net-web-api,Python,Urllib2,Urllib,Asp.net Web Api,我试图用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,da

我试图用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: 
>>data=urllib.urlencode({'api-key':os.environ['NYT\u EVENT\u LISTING\u api\u key']})
>>>resp=urllib2.urlopen(“?”.join([url,data]))
>>>resp=urllib2.urlopen(url,数据)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
urlopen中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第126行
return\u opener.open(url、数据、超时)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第400行,打开
响应=方法(请求,响应)
http_响应中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第513行
“http”、请求、响应、代码、消息、hdrs)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第438行出错
返回自我。调用链(*args)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第372行,在调用链中
结果=func(*args)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”,第521行,默认为http\u error\u
raise HTTPError(请求获取完整url(),代码,消息,hdrs,fp)
HTTPError:HTTP错误596:

您的第一个请求是GET请求,第二个是POST请求。请参阅此页上的-当提供参数
数据
时,urlopen将执行POST请求。

@Thomas是对的,您在第一个请求中使用
GET
,这将构造类似以下内容的URL:

nytimes.com/api/?MY_API_KEY
但是,对
urllib2.urlopen
的第二次调用将
数据作为
POST
请求发送到此URL

nytimes.com/api/
相反,这给了您596服务找不到的错误


现在,<>代码> URLILB2因其非直观API和文档而臭名昭著,您可以考虑使用:


通过这种方式,
GET
请求和
POST
请求更容易区分,url和参数也被分开。

如果捕获异常并调用其
read()
方法,您将获得HTTP响应体。也许这会给你一个错误的线索。谢谢,我没有考虑自动更改。谢谢,我希望我早点知道请求。看起来更直观。@bschlueter我喜欢请求:)
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