首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘'HTTP错误400:错误请求’与Python宽吻

‘'HTTP错误400:错误请求’与Python宽吻
EN

Stack Overflow用户
提问于 2014-10-25 19:15:32
回答 1查看 1.2K关注 0票数 1

我有以下文件(associate.py)

代码语言:javascript
复制
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会话的结果:

代码语言:javascript
复制
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")在我的笔记本电脑上工作得很好,但在我的桌面上却失败了。

我的笔记本电脑是Crouton Ubuntu 12.04和python 2.7.5,我的桌面是Ubuntu14.04和Python2.7.6。我很不明白为什么这一条适用于其中一种而不是另一种。如果您对前面的代码不能在桌面上工作的原因有任何猜测,我将非常感激。签名的请求有密码问题吗?我只是有点不知所措,不知道该怎么做。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-25 20:15:28

在点燃wireshark并查看回复后,Amazon礼貌地通知我"Timezone过期了“。

好吧,那有点尴尬。看,我的桌面是双引导windows 8(用于游戏)和Ubuntu。当我从一个操作系统引导到另一个操作系统时,时钟到处倾斜,我遇到了很多麻烦。所以,天才,我决定将我的时区设置为冰岛雷克雅未克(UTC偏移量+0),禁用互联网时间同步,并手动将时间设置为本地时间(在窗口和ubuntu上)。解决了我的时间问题。

亚马逊不喜欢这样。它说在我提出请求时时间戳已经过期了。所以,我重新启用了互联网同步,并将我的时区设置为美国洛杉矶.一切都正常。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26566242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档