从谷歌财经抓取页面以获取价格
我正在尝试通过抓取谷歌财经页面来获取股票价格,我用的是Python,使用了urllib这个包,然后用正则表达式来提取价格数据。
当我让我的Python脚本一直运行时,最开始能正常工作一段时间(几分钟),然后就开始出现异常 [HTTP Error 503: Service Unavailable]。
我猜这是因为在网页服务器那边,它检测到频繁的页面更新像是机器人操作,所以过一段时间就抛出这个异常。
有没有什么办法可以解决这个问题,比如删除某些cookie或者创建一些cookie等等?
更好的是,如果谷歌能提供一些API接口就好了,我想用Python来做这个,因为整个应用都是用Python写的,但如果Python没有合适的工具,我也可以考虑其他方案。这是我在循环中用来获取数据的Python方法(我在循环中每隔几秒调用这个方法)。
def getPriceFromGOOGLE(self, symbol):
"""
gets last traded price from google for given security
"""
toReturn = 0.0
try:
base_url = 'http://google.com/finance?q='
req = urllib2.Request(base_url + symbol)
content = urllib2.urlopen(req).read()
namestr = 'name:\"' + symbol + '\",cp:(.*),p:(.*),cid(.*)}'
m = re.search(namestr, content)
if m:
data = str(m.group(2).strip().strip('"'))
price = data.replace(',','')
toReturn = float(price)
else:
print 'ERROR ' + str(symbol) + ' --- ' + str(content)
except Exception, exc:
print 'Exc: ' + str(exc)
finally:
return toReturn
4 个回答
为了绕过大多数网站对请求频率的限制或者对机器人的检测,比如谷歌、维基百科或雅虎,你可以伪装你的用户代理。
这样做会让你写的程序发出的请求看起来像是来自最新版本的谷歌浏览器。
headers = {'User-Agent' : "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.16 Safari/534.24"}
req = urllib2.Request(url,None,headers)
content = urllib2.urlopen(req).read()
这个问题虽然有点老,但选中的答案现在已经不再有效了。
因为这个API已经被弃用了。
现在有一个开源项目,可以从谷歌财经抓取所有公司的信息,并把它们和当前的价格匹配起来,网址是http://scrape-google-finance.compunect.com/
这个项目解决了大部分问题,包括缓存、IP管理,并且运行稳定,不容易被封锁。
它使用了内部的财经公司匹配API来抓取公司信息,还用图表API来获取价格。
不过这个项目是用PHP写的,不是Python。你仍然可以学习它是怎么解决这些问题的,然后进行适当的调整。
有一个谷歌财经的API:
http://code.google.com/apis/finance/docs/2.0/developers_guide_protocol.html
还有一个专门为它提供的Python客户端库: