2

我正在尝试使用 urllib2 调用 NYT events 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: 
4

2 回答 2

2

@Thomas 是对的,你GET在你的第一个请求中使用它将构造这样的 URL:

nytimes.com/api/?MY_API_KEY

但是,您的第二次调用urllib2.urlopendata作为POST请求发送到此 URL

nytimes.com/api/

相反,这会给你596 service not found error


现在,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

这样,GETrequests和POSTrequests就更容易区分了,url和参数也分开了。

于 2012-10-21T06:26:45.517 回答
1

您的第一个请求是 GET 请求 - 第二个是 POST 请求。请参阅有关此的文档-data提供参数时, urlopen 执行 POST 请求。

于 2012-10-21T02:30:31.113 回答