尝试使用 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 错误的主要内容,如果未能解决你的问题,请参考以下文章
无需包装器或使用 API 访问 Google 趋势数据:Python
python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。