尝试使用 python 访问 Google 专利时出现 503 错误

Posted

技术标签:

【中文标题】尝试使用 python 访问 Google 专利时出现 503 错误【英文标题】:503 error when trying to access Google Patents using python 【发布时间】:2013-03-08 13:12:08 【问题描述】:

今天早些时候,我能够使用以下代码从 Google 专利中提取数据

import urllib2

url = 'http://www.google.com/search?tbo=p&q=ininventor:"John-Mudd"&hl=en&tbm=pts&source=lnt&tbs=ptso:us'
req = urllib2.Request(url, headers='User-Agent' : "foobar")

response = urllib2.urlopen(req)

现在当我运行它时,我收到以下 503 错误。我只循环了这段代码大概 30 次(我正在尝试获取 30 个人拥有的所有专利)。

HTTPError                                 Traceback (most recent call last)
<ipython-input-4-01f83e2c218f> in <module>()
----> 1 response = urllib2.urlopen(req)

C:\Python27\lib\urllib2.pyc in urlopen(url, data, timeout)
    124     if _opener is None:
    125         _opener = build_opener()
--> 126     return _opener.open(url, data, timeout)
    127 
    128 def install_opener(opener):

C:\Python27\lib\urllib2.pyc in open(self, fullurl, data, timeout)
    404         for processor in self.process_response.get(protocol, []):
    405             meth = getattr(processor, meth_name)
--> 406             response = meth(req, response)
    407 
    408         return response

C:\Python27\lib\urllib2.pyc in http_response(self, request, response)
    517         if not (200 <= code < 300):
    518             response = self.parent.error(
--> 519                 'http', request, response, code, msg, hdrs)
    520 
    521         return response

C:\Python27\lib\urllib2.pyc in error(self, proto, *args)
    436             http_err = 0
    437         args = (dict, proto, meth_name) + args
--> 438         result = self._call_chain(*args)
    439         if result:
    440             return result

C:\Python27\lib\urllib2.pyc in _call_chain(self, chain, kind, meth_name, *args)
    376             func = getattr(handler, meth_name)
    377 
--> 378             result = func(*args)
    379             if result is not None:
    380                 return result

C:\Python27\lib\urllib2.pyc in http_error_302(self, req, fp, code, msg, headers)
    623         fp.close()
    624 
--> 625         return self.parent.open(new, timeout=req.timeout)
    626 
    627     http_error_301 = http_error_303 = http_error_307 = http_error_302

C:\Python27\lib\urllib2.pyc in open(self, fullurl, data, timeout)
    404         for processor in self.process_response.get(protocol, []):
    405             meth = getattr(processor, meth_name)
--> 406             response = meth(req, response)
    407 
    408         return response

C:\Python27\lib\urllib2.pyc in http_response(self, request, response)
    517         if not (200 <= code < 300):
    518             response = self.parent.error(
--> 519                 'http', request, response, code, msg, hdrs)
    520 
    521         return response

C:\Python27\lib\urllib2.pyc in error(self, proto, *args)
    442         if http_err:
    443             args = (dict, 'default', 'http_error_default') + orig_args
--> 444             return self._call_chain(*args)
    445 
    446 # XXX probably also want an abstract factory that knows when it makes

C:\Python27\lib\urllib2.pyc in _call_chain(self, chain, kind, meth_name, *args)
    376             func = getattr(handler, meth_name)
    377 
--> 378             result = func(*args)
    379             if result is not None:
    380                 return result

C:\Python27\lib\urllib2.pyc in http_error_default(self, req, fp, code, msg, hdrs)
    525 class HTTPDefaultErrorHandler(BaseHandler):
    526     def http_error_default(self, req, fp, code, msg, hdrs):
--> 527         raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
    528 
    529 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 503: Service Unavailable

【问题讨论】:

这是 503 的含义:“503: Service Unavailable 服务器当前不可用(因为它超载或停机维护)。通常这是一个临时状态。” @iamnotmaynard...但我可以在浏览器中访问该网址...google.com/… @Chris,它可能是每个 IP 和/或用户代理的速率限制。无论如何,你应该处理这个错误(重试?)。 使用与浏览器完全相同的 User-Agent 字符串。例如Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0) @selbie,我如何确定? 【参考方案1】:

暗中猜测:

您是否查看了响应中是否有“Retry-After 标头”。 503 真的很有可能。

From RFC 2616:

14.37 之后重试

Retry-After response-header 字段可以与 503(服务 不可用)响应以指示服务预计将持续多长时间 对请求的客户端不可用。该字段也可以使用 使用任何 3xx(重定向)响应来指示最小时间 在发出重定向请求之前,要求用户代理等待。这 该字段的值可以是 HTTP 日期或整数 响应时间后的秒数(十进制)。 Retry-After = "Retry-After" ":" (HTTP-date | delta-seconds)

它的两个使用示例是 重试时间:1999 年 12 月 31 日星期五 23:59:59 GMT 重试后:120

在后一个示例中,延迟为 2 分钟。

【讨论】:

【参考方案2】:

很遗憾,Google 的 TOS 禁止自动查询。它几乎可以肯定地检测到你“没有做好事”。

来源:https://support.google.com/websearch/answer/86640?hl=en

【讨论】:

以上是关于尝试使用 python 访问 Google 专利时出现 503 错误的主要内容,如果未能解决你的问题,请参考以下文章

Google vs Oracle 专利侵权案始末

Google vs Oracle 专利侵权案始末

无需包装器或使用 API 访问 Google 趋势数据:Python

python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。

python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。

使用 google-cloud-python API 访问 Dataproc 时出现无效区域错误