雅虎财经 - 不完整的检索组件

时间:2012-11-16 17:19:38

标签: python api yahoo-finance

我试图在python中写下一个函数来检索索引的组件列表。 所以我想说看看FTSE100(^ FTSE),我想得到它的所有组件(100个)或更多信息。

只需添加标记即可获得有关组件的更多信息(请参阅this)。

但是,根据索引,我只能检索前51个组件(第一页:http://finance.yahoo.com/q/cp?s=%5EFTSE&c=0)。

我的功能是:

at = '%40'
def getListComponents(symbol):
    url = 'http://finance.yahoo.com/d/quotes.csv?s=%s%s&c=1&f=s' % (at, symbol)
    return urllib.urlopen(url).read().strip().strip('"')

Output example: 
'AAL.L"\r\n"ABF.L"\r\n"ADM.L"\r\n"ADN.L"\r\n"AGK.L"\r\n"AMEC.L"\r\n"ANTO.L"\r\n"ARM.L"\r\n"AV.L"\r\n"AZN.L"\r\n"BA.L"\r\n"BAB.L"\r\n"BARC.L"\r\n"BATS.L"\r\n"BG.L"\r\n"BLND.L"\r\n"BLT.L"\r\n"BNZL.L"\r\n"BP.L"\r\n"BRBY.L"\r\n"BSY.L"\r\n"BT-A.L"\r\n"CCL.L"\r\n"CNA.L"\r\n"CPG.L"\r\n"CPI.L"\r\n"CRDA.L"\r\n"CRH.L"\r\n"CSCG.L"\r\n"DGE.L"\r\n"ENRC.L"\r\n"EVR.L"\r\n"EXPN.L"\r\n"FRES.L"\r\n"GFS.L"\r\n"GKN.L"\r\n"GLEN.L"\r\n"GSK.L"\r\n"HL.L"\r\n"HMSO.L"\r\n"HSBA.L"\r\n"IAG.L"\r\n"IHG.L"\r\n"IMI.L"\r\n"IMT.L"\r\n"ITRK.L"\r\n"ITV.L"\r\n"JMAT.L"\r\n"KAZ.L"\r\n"KGF.L"\r\n"LAND.L'

这样解析组件标题非常容易。

如何获得49个重组组件? 请注意,在我查看FTSE250或更高版本的情况下,未检索到的组件可能会更多。

没有答案:

所以我做了一些研究,尝试了许多旗帜组合,找到并阅读了这个评论帖:code.google.com/p/yahoo-finance-managed/wiki/csvQuotesDownload;我得出结论,不可能将索引的所有组件下载为CSV。

如果您遇到同样的问题而不仅仅是使用BeautifulSoup。你可能不喜欢这种方法,但没有其他办法。

Solution to most of my problems

2 个答案:

答案 0 :(得分:5)

如果您这样做,表格顶部会显示last的一个小链接 - 它会为您提供最后一页编号 - http://finance.yahoo.com/q/cp?s=%5EFTSE&c=2(来自您的示例)然后将其拆分以创建范围range(number)以循环并请求类似于您当前正在执行的操作的页面。

  1. 打开初始页
  2. 通过lxml.html或BeautifulSoup
  3. 提取链接
  4. 解析最后一页编号
  5. 循环检索每个
  6. 的页数

    另一方面,我非常肯定雅虎!必须有一些API吗?

答案 1 :(得分:1)

我是Python新手并找到了我的脚。

我一直在寻找解决同样问题的方法,但最终还是写了自己的问题。我的代码是低效,冗长和丑陋的 - 但是它很有用,如果很少,我会使用它。我期待着向更聪明的人学习。

def getIndexComponents(symbol):

# function to retrieve the component list of equity index
# from Yahoo Finance, if available

import requests
p = 0

while p < 12:

    if p == 0:

        url = 'http://finance.yahoo.com/q/cp?s=%5E' + symbol
        text = requests.get(url).content
                                                                              # </a></b></td><td
        componentSubset = [text[n-10:n] for n in xrange(len(text)) if text.find('</a></b></td><td', n) == n]

        for comp in range(len(componentSubset)):

            componentSubset[comp] = componentSubset[comp][(1+componentSubset[comp].index('>')):]

        components = componentSubset

    else:

        url = 'http://finance.yahoo.com/q/cp?s=%5E' + symbol + '&c=' + str(p)
        text = requests.get(url).content

        componentSubset = [text[n-10:n] for n in xrange(len(text)) if text.find('</a></b></td><td', n) == n]

        for comp in range(len(componentSubset)):

            componentSubset[comp] = componentSubset[comp][(1+componentSubset[comp].index('>')):]

        components.extend(componentSubset)

    p = p + 1

components = set(components)

return components

似乎有用

getIndexComponents( '富')