使用python和urllib从Yahoo FInance获取数据

时间:2014-04-16 04:04:22

标签: python urllib stock

我在python中使用urllib从雅虎财务中获取股票价格。到目前为止,这是我的代码:

import urllib
import re

name = raw_input(">")

htmlfile = urllib.urlopen("http://finance.yahoo.com/q?s=%s" % name)

htmltext = htmlfile.read()

# The problemed area 
regex = '<span id="yfs_l84_%s">(.+?)</span>' % name

pattern = re.compile(regex)

price = re.findall(pattern, htmltext)

print price

所以我输入一个值,股票价格就出来了。但到目前为止,我可以让它显示价格,只是一个空白[]。我已经评论了我认为问题所在。有什么建议?谢谢。

4 个答案:

答案 0 :(得分:4)

你还没有逃过正则表达式中的正斜杠。改变你的正则表达式:

<span id="yfs_l84_%s">(.+?)</span>

<span id="yfs_l84_goog">(.+?)<\/span>

如果您输入公司的列表代码作为代码的输入,这将解决您的问题。防爆; google for google。

也就是说,正则表达式对于你想要做的事情来说是一个糟糕的选择。正如其他人所建议的那样,探索BeautifulSoup这是一个用于从HTML中提取数据的Python库。使用BeautifulSoup,您的代码可以像以下一样简单:

from bs4 import BeautifulSoup
import requests

name = raw_input('>')
url = 'http://finance.yahoo.com/q?s={}'.format(name)
r = requests.get(url)
soup = BeautifulSoup(r.text)
data = soup.find('span', attrs={'id':'yfs_l84_'.format(name)})
print data.text

答案 1 :(得分:1)

你有什么理由不能使用熊猫?它对财务数据抓取和时间序列分析有很好的支持。

http://pandas.pydata.org/pandas-docs/stable/remote_data.html

以下是文档中的雅虎示例:

In [1]: import pandas.io.data as web
In [2]: import datetime
In [3]: start = datetime.datetime(2010, 1, 1)
In [4]: end = datetime.datetime(2013, 01, 27)
In [5]: f=web.DataReader("F", 'yahoo', start, end)
In [6]: f.ix['2010-01-04']
Out[6]: 
OnOpen               10.17
High               10.28
Low                10.05
Close              10.28
Volume       60855800.00
Adj Close           9.75
Name: 2010-01-04 00:00:00, dtype: float64

答案 2 :(得分:0)

This guide将向您展示如何构建将返回csvs的Yahoo财务查询。然后,您可以使用csv库轻松解析它们。

如果您真的想尝试黑客攻击HTML,请使用BeautifulSoup。使用正则表达式无法轻松解析HTML。

答案 3 :(得分:0)

使用python2或python3从Yahoo Finance获取数据的最佳方法是使用POST方法 你可以使用像Postman这样的Rest服务轻松测试这个。

打开邮递员并使用方法POST并使用它 然后你会看到数据。只需在python中重新创建它

import requests
url="https://query1.finance.yahoo.com/v7/finance/download/GOOG? period1=1519938930&period2=1522354530&interval=1d&events=history&crumb=.tLvYBkGDu3"

response = requests.post(url)
print response.text

我曾经使用urllib2获取数据,但现在它给出了授权错误 他们可能通过像GET和POST

这样的Rest方法过滤所有内容