Python 3.6使用请求模块从finance.yahoo.com下载.csv文件

时间:2018-01-31 16:05:55

标签: python-3.x csv python-requests

我试图从此url下载.csv文件以获取股票的历史记录。这是我的代码:

const transformedProfilesData = profilesData.reduce((array, object) => {
  const profile = {...object.profile}
  const photos = object.photo_details.photos.map(photo => photo)
  profile.photos = photos
  array.push(profile)
  return array
}, [])

但是当我打开文件history_of_stock.csv时,我就找到了这个:

    import requests
    r = requests.get("https://query1.finance.yahoo.com/v7/finance/download/CHOLAFIN.BO?period1=1514562437&period2=1517240837&interval=1d&events=history&crumb=JaCfCutLNr7")
    file = open(r"history_of_stock.csv", 'w')
    file.write(r.text)
    file.close()
我找不到任何可以解决我问题的东西。我发现这个帖子中有人有同样的问题,除了它在C#中:C# Download price data csv file from https instead of http

2 个答案:

答案 0 :(得分:1)

确实有这样的服务,但它是discontinued

现在你可以做你想做的事,但首先你需要得到一个Cookie。 On this post有一个如何做的例子。 基本上,首先你需要做一个无用的请求来获取Cookie,之后,有了这个Cookie,你可以查询你真正需要的任何其他内容。

还有一篇关于another service的帖子可能会让您的生活更轻松。

还有一个Python module可以解决这个不便和代码,以显示没有它的方法。

答案 1 :(得分:0)

为补充先前的答案并提供具体的完整代码,我编写了一个脚本,该脚本可完成获取Yahoo Finance中历史股价的任务。试图尽可能简单地编写它。概括一下:在使用请求获取URL时,在许多情况下,您无需担心碎屑或cookie。但是,使用Yahoo Finance,您需要获取面包屑和cookie。一旦获得饼干,就可以了!确保在requests.get呼叫上设置超时。

import re
import requests
import sys
from pdb import set_trace as pb

symbol = sys.argv[-1]
start_date = '1442203200' # start date timestamp
end_date   = '1531800000' # end date timestamp

crumble_link = 'https://finance.yahoo.com/quote/{0}/history?p={0}'
crumble_regex = r'CrumbStore":{"crumb":"(.*?)"}'
cookie_regex = r'set-cookie: (.*?);'
quote_link = 'https://query1.finance.yahoo.com/v7/finance/download/{}?period1={}&period2={}&interval=1d&events=history&crumb={}'

link = crumble_link.format(symbol)
session = requests.Session()
response = session.get(link)

# get crumbs

text = str(response.content)
match = re.search(crumble_regex, text)
crumbs = match.group(1)

# get cookie

cookie = session.cookies.get_dict()

url = "https://query1.finance.yahoo.com/v7/finance/download/%s?period1=%s&period2=%s&interval=1d&events=history&crumb=%s" % (symbol, start_date, end_date, crumbs)

r = requests.get(url,cookies=session.cookies.get_dict(),timeout=5, stream=True)

out = r.text

filename = '{}.csv'.format(symbol)

with open(filename,'w') as f:
    f.write(out)