【问题标题】:Parsing stock recommended rating from Yahoo stock site从雅虎股票网站解析股票推荐评级
【发布时间】:2017-02-14 21:38:41
【问题描述】:

我希望使用 Python 脚本(以 https://finance.yahoo.com/quote/NOA?ltr=1 为例)解析特定的雅虎股票页面并将“推荐评级”打印到文件中。推荐的评分可以在页面右侧大约一半的位置找到。

这是我目前所拥有的

  try:
    import urllib.request as urllib2
except ImportError:
    import urllib2
from bs4 import BeautifulSoup
quote_page = 'https://finance.yahoo.com/quote/NOA?ltr=1'
page = urllib2.urlopen(quote_page)
soup = BeautifulSoup(page, "html.parser")
name_box = soup.find(attrs={'div': 'rating-text Arrow South Fw(b) Bgc($strongBuy) Bdtc($strongBuy)'})
name = name_box.text.strip()
print(name)

棘手的部分是我认为推荐的评级仅在页面上列为 InnerHTML。我不确定我将如何检索这些数据,我们将不胜感激朝着正确的方向前进!

【问题讨论】:

  • 你试过什么?你有没有特别尝试BeautifulSoup
  • 我用的是lxml,你会推荐BeautifulSoup吗?
  • 雅虎没有 API 吗?使用 API 比抓取要可靠得多,因为 API 旨在供自动化系统使用,而网站通常不是。你可以构建一个很棒的爬虫,却发现自己被雅虎屏蔽了。
  • @t_wimms:真正的 HTML 是混乱的,BeautifulSoup 可以更好地处理这种混乱,而 lxml 需要格式良好的 XML。
  • @halfer 根据我刚刚阅读的内容,他们没有可用的金融 API。

标签: python html parsing web-scraping stocks


【解决方案1】:

Yahoo 向下面脚本中的 url 发出获取请求以获取他们的一些数据。如果您查看开发人员工具的网络选项卡并刷新 NOA 股票页面,您应该会看到“NOA?formatt...”。单击此然后查看响应对象以查看一些数据。您需要 requests 模块才能运行以下脚本:pip install requests

# get_mean_recs.py
import csv
from datetime import datetime
import requests
import sys

get_date = lambda : datetime.utcnow().strftime('%d-%m-%Y')

lhs_url = 'https://query2.finance.yahoo.com/v10/finance/quoteSummary/'
rhs_url = '?formatted=true&crumb=swg7qs5y9UP&lang=en-US&region=US&' \
          'modules=upgradeDowngradeHistory,recommendationTrend,' \
          'financialData,earningsHistory,earningsTrend,industryTrend&' \
          'corsDomain=finance.yahoo.com'

def get_mean_rec(ticker):
    url =  lhs_url + ticker + rhs_url
    r = requests.get(url)
    if not r.ok:
        return -1
    result = r.json()['quoteSummary']['result'][0]
    return result['financialData']['recommendationMean']['fmt']

def read_from_csv(fn):
    with open(fn, 'r') as f:
        reader = csv.reader(f)
        for line in reader:
            for ticker in line:
                yield ticker

def write_to_csv(fn, data):
    with open(fn, 'a') as f:
        fieldnames = data[0].keys()
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        for item in data:
            writer.writerow(item)

def assemble_dict(ticker):
    return {
        'ticker': ticker,
        'mean_rec': get_mean_rec(ticker),
        'utc_date': get_date()
    }

def main():
    in_fn = sys.argv[1]
    out_fn = sys.argv[2]
    data = [assemble_dict(ticker) for ticker in read_from_csv(in_fn)]
    write_to_csv(out_fn, data)

if __name__ == '__main__':
    main()

用法:

python get_mean_recs.py input.csv output.csv

【讨论】:

  • 谢谢!这正是我想要的!
  • 我能够找出 CSV,但我很好奇您如何知道如何格式化获得推荐评级的链接。我希望将更多信息添加到列表中,并试图弄清楚如何修改这些 url 以获得正确的信息。谢谢!
  • 不需要修改url。只需 pprint 从 r.json() 返回的对象,看看还有什么可用的。然后按照您想要的值的键/索引。
【解决方案2】:

有一个用于访问雅虎财经信息的API,例如

http://finance.yahoo.com/d/quotes.csv?s=NOA&f=snd1l1yr

我认为您最好使用它来获取所需的信息。可以在此处找到有关参数的更多信息: http://wern-ancheta.com/blog/2015/04/05/getting-started-with-the-yahoo-finance-api/

【讨论】:

  • 我找不到可以使用此 API 提取的可用信息列表,您是否碰巧有链接?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多