17

私はPythonでのプログラミングにまったく慣れていません。

グーグルファイナンスから株価を取得するアプリを作りたいです。一例として、CSCO (Cisco Sytems)があります。次に、そのデータを使用して、在庫が特定の値に達したときにユーザーに警告します。また、30秒ごとに更新する必要があります。

問題は、データを取得する方法がわからないことです。

誰かアイデアはありますか?

4

8 に答える 8

16

このモジュールは、Corey Goldbergの厚意により提供されています。

プログラム:

import urllib
import re

def get_quote(symbol):
    base_url = 'http://finance.google.com/finance?q='
    content = urllib.urlopen(base_url + symbol).read()
    m = re.search('id="ref_694653_l".*?>(.*?)<', content)
    if m:
        quote = m.group(1)
    else:
        quote = 'no quote available for: ' + symbol
    return quote

サンプル使用法:

import stockquote
print stockquote.get_quote('goog')

更新: Google Finance の最新の形式に合わせて正規表現を変更しました (2011 年 2 月 23 日現在)。これは、スクリーン スクレイピングに依存する場合の主な問題を示しています。

于 2011-02-22T17:45:03.483 に答える
2

HTMLParser を使用して、Google が HTML に配置するメタ タグの値を取得することをお勧めします。

<meta itemprop="name"
        content="Cerner Corporation" />
<meta itemprop="url"
        content="https://www.google.com/finance?cid=92421" />
<meta itemprop="imageUrl"
        content="https://www.google.com/finance/chart?cht=g&q=NASDAQ:CERN&tkr=1&p=1d&enddatetime=2014-04-09T12:47:31Z" />
<meta itemprop="tickerSymbol"
        content="CERN" />
<meta itemprop="exchange"
        content="NASDAQ" />
<meta itemprop="exchangeTimezone"
        content="America/New_York" />
<meta itemprop="price"
        content="54.66" />
<meta itemprop="priceChange"
        content="+0.36" />
<meta itemprop="priceChangePercent"
        content="0.66" />
<meta itemprop="quoteTime"
        content="2014-04-09T12:47:31Z" />
<meta itemprop="dataSource"
        content="NASDAQ real-time data" />
<meta itemprop="dataSourceDisclaimerUrl"
        content="//www.google.com/help/stock_disclaimer.html#realtime" />
<meta itemprop="priceCurrency"
        content="USD" />

次のようなコードで:

import urllib
try:
    from html.parser import HTMLParser
except:
    from HTMLParser import HTMLParser

class QuoteData:
    pass

class GoogleFinanceParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.quote = QuoteData()
        self.quote.price = -1

    def handle_starttag(self, tag, attrs):
        if tag == "meta":
            last_itemprop = ""
            for attr, value in attrs:
                if attr == "itemprop":
                    last_itemprop = value

                if attr == "content" and last_itemprop == "name":
                    self.quote.name = value
                if attr == "content" and last_itemprop == "price":
                    self.quote.price = value
                if attr == "content" and last_itemprop == "priceCurrency":
                    self.quote.priceCurrency = value
                if attr == "content" and last_itemprop == "priceChange":
                    self.quote.priceChange = value
                if attr == "content" and last_itemprop == "priceChangePercent":
                    self.quote.priceChangePercent = value
                if attr == "content" and last_itemprop == "quoteTime":
                    self.quote.quoteTime = value
                if attr == "content" and last_itemprop == "exchange":
                    self.quote.exchange = value
                if attr == "content" and last_itemprop == "exchangeTimezone":
                    self.quote.exchangeTimezone = value


def getquote(symbol):
    url = "http://finance.google.com/finance?q=%s" % symbol
    content = urllib.urlopen(url).read()

    gfp = GoogleFinanceParser()
    gfp.feed(content)
    return gfp.quote;


quote = getquote('CSCO')
print quote.name, quote.price
于 2014-04-09T17:40:53.303 に答える
2
import urllib
import re

def get_quote(symbol):
    base_url = 'http://finance.google.com/finance?q='
    content = urllib.urlopen(base_url + symbol).read()
    m = re.search('id="ref_(.*?)">(.*?)<', content)
    if m:
        quote = m.group(2)
    else:
        quote = 'no quote available for: ' + symbol
    return quote

ref_(.*?) を使用して m.group(2) を使用すると、参照 ID が在庫ごとに変化するため、より良い結果が得られることがわかりました。

于 2013-10-01T15:55:52.170 に答える
1

Yahoo からデータを取得したい場合に備えて... 簡単な関数を次に示します。これは、通常のページからデータをこすり落とすことはありません。コメントにこれを説明するページへのリンクがあると思っていましたが、今は表示されません。特定のフィールドを要求するために URL に追加されたマジック ストリングがあります。

import urllib as u
import string
symbols = 'amd ibm gm kft'.split()

def get_data():
    data = []
    url = 'http://finance.yahoo.com/d/quotes.csv?s='
    for s in symbols:
        url += s+"+"
    url = url[0:-1]
    url += "&f=sb3b2l1l"
    f = u.urlopen(url,proxies = {})
    rows = f.readlines()
    for r in rows:
        values = [x for x in r.split(',')]
        symbol = values[0][1:-1]
        bid = string.atof(values[1])
        ask = string.atof(values[2])
        last = string.atof(values[3])
        data.append([symbol,bid,ask,last,values[4]])
    return data

ここで、魔法の文字列を説明するリンクを見つけました: http://cliffngan.net/a/13

于 2011-02-23T16:11:28.077 に答える
0

任意の URL を取得するためのhttp://docs.python.org/library/urllib.html 。

それとは別に、JSON 形式でデータを提供する Web サービスをよく見てください。

それ以外の場合は、独自に解析などを実装する必要があります。

株式を取得するために yahoo.com のスクリーンスクレイピングを行うことは、成功への正しい道とは言えません。

于 2011-02-22T17:43:00.817 に答える
0

Python API やラッパーは見当たりませんが、 Google Finance APIを見ることから始めることができます。データに直接アクセスするための唯一のオプションは、Java と JavaScript のようです。cURLに慣れていて、システムで使用できる場合は、cURL を使用することもできます。

于 2011-02-22T17:45:17.163 に答える
0

開始するのに適したもう 1 つの場所は、Google Finance 独自API です。

于 2011-02-22T17:46:47.913 に答える