页面抓取从谷歌财务获取价格

时间:2011-04-12 14:32:43

标签: python screen-scraping urllib stockquotes google-finance

我试图通过抓取谷歌财经页面获取股票价格,我在python中使用urllib包然后使用正则表达式来获取价格数据。

当我让python脚本运行时,它最初工作一段时间(几分钟),然后开始抛出异常[HTTP错误503:服务不可用]

我猜这种情况正在发生,因为在Web服务器端,它会将频繁的页面更新检测为机器人并在一段时间后抛出此异常。

有没有解决方法,即删除一些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 个答案:

答案 0 :(得分:5)

问题已经很久了,但选定的答案已经无效了 该API已被弃用。

有一个开源项目可以从Google财经中抓取所有公司,并将其与http://scrape-google-finance.compunect.com/的当前价格进行匹配。 该项目解决了大多数问题,包括缓存,IP管理和工作稳定而不会被阻止 它使用内部财务公司匹配api来刮公司和图表api来获得价格。 然而它是PHP代码,而不是python。您仍然可以了解它如何解决任务并使其适应。

答案 1 :(得分:3)

要解决Google或维基百科或雅虎等大多数速率限制或机器人检测问题,请欺骗您的用户代理。

这将使您的脚本请求看起来来自最新版本的Google Chrome。

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()

答案 2 :(得分:3)

雅虎财经也是获取涵盖更多国家和股票的财务信息的好地方。

对于python 2,您可以使用ystockquote。对于python 3,您可以使用我从前一个重写的yfq

获取Google和英特尔的最新报价。

>>> import yfq
>>> yfq.get_price('GOOG+INTL')
{'GOOG': '600.25', 'INTL': '22.25'}

从2012年3月3日到2012年3月5日获取雅虎的历史报价。

>>> yfq.get_historical_prices('YHOO','20120301','20120303')
[['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'], ['2012-03-02', '14.89', '14.92', '14.66', '14.72', '9164900', '14.72'], ['2012-03-01', '14.89', '14.96', '14.79', '14.93', '12283300', '14.93']]

答案 3 :(得分:2)