-1

インデックスのコンポーネントのリストを取得するために、python で関数を書き留めようとしています。FTSE100 (^FTSE) を見たいとしましょう。そのすべてのコンポーネント (数百個) またはさらに多くの情報を取得したいと考えています。

フラグを追加するだけで、コンポーネントに関する詳細情報を取得できます (これを参照してください)。

ただし、インデックスを指定すると、最初の 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を使用するだけでなく、同じ問題が発生した場合。このアプローチは気に入らないかもしれませんが、別の方法はありません。

私の問題のほとんどに対する解決策

4

2 に答える 2

5

そのようにしている場合は、テーブルの上部に小さなリンクがありますlast-最後のページ番号が表示http://finance.yahoo.com/q/cp?s=%5EFTSE&c=2されます-(例から)それを分割して、range(number)ループオーバーしてリクエストする範囲を作成しますあなたが現在行っている方法に似たページ。

  1. 最初のページを開く
  2. lxml.html または BeautifulSoup 経由でリンクを抽出する
  3. 最後のページ番号を解析する
  4. それぞれを取得するページ数をループします

ちなみに、Yahoo! これのいくつかのための API が必要ですか?

于 2012-11-16T17:23:50.757 に答える
1

私はPythonが初めてで、自分の足を見つけています。

私は同じ問題の解決策を探していましたが、結局自分で書いてしまいました。私のコードは非効率的で、長くて醜いですが、動作します。めったに使用しません。もっと賢い人から学ぶことを楽しみにしています。

def getIndexComponents(シンボル):

# 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('FTSE')

于 2016-01-04T14:47:37.033 に答える