我有以下文件(associate.py)
import bottlenose
from bs4 import BeautifulSoup
from urllib2 import HTTPError
;; My real keys are here in reality, I just replaced them
;; with the following because they are private.
credentials = {'access-key' : 'MY_ACCESS_KEY_GOES_HERE',
'secret-key' : 'MY_SECRET_KEY_GOES_HERE',
'associate-tag' : 'MY_ASSOCIATE_TAG'}
def error_handler(err):
ex = err['exception']
if isinstance(ex, HTTPError) and ex.code == 503:
time.sleep(random.expovariate(0.1))
return True
api = bottlenose.Amazon(credentials['access-key'],
credentials['secret-key'],
credentials['associate-tag'],
Parser=BeautifulSoup,
ErrorHandler=error_handler,
MaxQPS=0.9)
def get_item(asin):
return api.ItemLookup(ItemId=asin,
ResponseGroup="Large,Images,ItemAttributes")
这是我使用上述内容的 Ipython 会话的结果:
In [1]: import associate
In [2]: associate.get_item("B003K1IJWC")
---------------------------------------------------------------------------
HTTPError Traceback (most recent call last)
<ipython-input-2-31ffe6a959e1> in <module>()
----> 1 associate.get_item("B003K1IJWC")
/home/stephen/work/pantry/associate.pyc in get_item(asin)
22 def get_item(asin):
23 return api.ItemLookup(ItemId=asin,
---> 24 ResponseGroup="Large,Images,ItemAttributes")
/home/stephen/work/pantry/bottlenose/api.pyc in __call__(self, **kwargs)
240 # make the actual API call
241 response = self._call_api(api_url,
--> 242 {'api_url': api_url, 'cache_url': cache_url})
243
244 # decompress the response if need be
/home/stephen/work/pantry/bottlenose/api.pyc in _call_api(self, api_url, err_env)
201 else:
202 # the simple way
--> 203 return urllib2.urlopen(api_request, timeout=self.Timeout)
204 except:
205 if not self.ErrorHandler:
/usr/lib/python2.7/urllib2.pyc in urlopen(url, data, timeout)
125 if _opener is None:
126 _opener = build_opener()
--> 127 return _opener.open(url, data, timeout)
128
129 def install_opener(opener):
/usr/lib/python2.7/urllib2.pyc in open(self, fullurl, data, timeout)
408 for processor in self.process_response.get(protocol, []):
409 meth = getattr(processor, meth_name)
--> 410 response = meth(req, response)
411
412 return response
/usr/lib/python2.7/urllib2.pyc in http_response(self, request, response)
521 if not (200 <= code < 300):
522 response = self.parent.error(
--> 523 'http', request, response, code, msg, hdrs)
524
525 return response
/usr/lib/python2.7/urllib2.pyc in error(self, proto, *args)
446 if http_err:
447 args = (dict, 'default', 'http_error_default') + orig_args
--> 448 return self._call_chain(*args)
449
450 # XXX probably also want an abstract factory that knows when it makes
/usr/lib/python2.7/urllib2.pyc in _call_chain(self, chain, kind, meth_name, *args)
380 func = getattr(handler, meth_name)
381
--> 382 result = func(*args)
383 if result is not None:
384 return result
/usr/lib/python2.7/urllib2.pyc in http_error_default(self, req, fp, code, msg, hdrs)
529 class HTTPDefaultErrorHandler(BaseHandler):
530 def http_error_default(self, req, fp, code, msg, hdrs):
--> 531 raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
532
533 class HTTPRedirectHandler(BaseHandler):
HTTPError: HTTP Error 400: Bad Request
奇怪的是,上面的请求associate.get_item("B003K1IJWC")
在我的笔记本电脑上工作得很好,但在我的桌面上却失败了。
我的笔记本电脑是带有 python 2.7.5 的 Crouton Ubuntu 12.04,我的桌面是带有 Python 2.7.6 的 Ubuntu 14.04。我很难解释为什么这适用于一个而不是另一个。如果您对前面的代码为什么不能在桌面上运行有任何猜测,我将不胜感激。签名请求是否存在加密问题?我只是被难住了,不知道如何进行。谢谢你。