2017-02-14 95 views
-2

我正在寻找使用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上市。我不确定如何检索这些数据,我们将非常感谢您向正确的方向推进!

+2

你尝试过什么?您是否尝试过[BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/)? – 9000

+0

我使用的是lxml,你会推荐BeautifulSoup吗? –

+0

雅虎有没有API?使用API​​比刮取更可靠,因为API是自动系统使用的,而网站通常不是。你可以建立一个伟大的刮板,并找到你被雅虎阻止。 – halfer

回答

2

雅虎在下面的脚本中为其某些数据获取请求。如果您查看开发人员工具的网络选项卡并刷新NOA股票的页面,则应该看到'NOA?formatt ...'。点击这个,然后查看响应对象以查看一些数据。您需要以下脚本的请求模块才能工作: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 
+0

谢谢!这正是我期待的! –

+0

我能弄清楚CSV,但我很好奇你如何知道如何格式化获得推荐评级的链接。我正在寻找将更多信息添加到列表中,并试图找出如何修改这些网址以获得正确的信息。谢谢! –

+0

您不需要修改网址。只需pprint从r.json()返回的对象来查看还有什么可用的。然后按键/索引到你想要的值。 – Jay