使用PYTHON获取Yahoo Finance数据

2 投票
2 回答
15250 浏览
提问于 2025-04-18 09:52

我正在使用一个程序,从雅虎财经提取数据,并把这些数据保存到我电脑上的一个文本文件里。这个程序确实能成功地把数据从雅虎财经拉取到我的电脑里的txt文件中。

但是,为什么代码会出现19个“错误”,然后又成功拉取数据呢?

如果我想把数据保存到数据库服务器,我应该怎么做呢?

import urllib.request
import time

stockstoPull = 'AMD', 'BAC', 'MSFT', 'TXN', 'GOOG'

def pullData(stock):
    fileLine = stock + '.txt'
    urltovisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=1y/csv'
with urllib.request.urlopen(urltovisit) as f:
    sourceCode = f.read(100000).decode('utf-8')
splitSource = sourceCode.split('\n')

for eachLine in splitSource:
    splitLine = eachLine.split('.')
    if len(splitLine) == 5:
        if 'values' not in eachLine:
            saveFile = open(fileLine,'a')
            linetoWrite = eachLine+'\n'
            saveFile.write(linetoWrite)
    else:
        print('Error')

print('Pulled', stock)
print('...')
time.sleep(.5)

for eachStock in stockstoPull:     
    pullData(eachStock)

2 个回答

-2

你可以找到一个关于如何使用pandas获取“雅虎财经数据”的教程

Pandas是一个用于数据分析的Python库,它有自己的方法可以直接获取雅虎财经的数据,并把这些数据放到一个叫做数据框(dataframe)的结构里。

补充说明:请注意页面顶部的警告。你需要额外安装一个库,叫做“pandas_datareader”。查询的结果会以pandas的数据框形式返回。

2

这段代码是对的,我只改了两个地方。错误发生在splitLine的长度小于6的时候。你可以用sqlite作为数据库。

import urllib.request
import time

stockstoPull = 'AMD', 'BAC', 'MSFT', 'TXN', 'GOOG'

def pullData(stock):
    fileLine = stock + '.txt'
    urltovisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/'+stock+'/chartdata;type=quote;range=1y/csv'
    with urllib.request.urlopen(urltovisit) as f:
        sourceCode = f.read().decode('utf-8')
    splitSource = sourceCode.split('\n')

    for eachLine in splitSource:
        splitLine = eachLine.split(',') # <---(here ',' instead of '.')
        if len(splitLine) == 6: # <----( here, 6 instead of 5 )
            if 'values' not in eachLine:
                saveFile = open(fileLine,'a')
                linetoWrite = eachLine+'\n'
                saveFile.write(linetoWrite)

    print('Pulled', stock)
    print('...')
    time.sleep(.5)

if __name__=="__main__":
    for eachStock in stockstoPull:     
        pullData(eachStock)

撰写回答