2017-02-14 9 views
-2

파이썬 스크립트 (예 : https://finance.yahoo.com/quote/NOA?ltr=1)를 사용하여 특정 Yahoo 주식 페이지를 구문 분석하고 "권장 등급"을 파일에 인쇄하려고합니다. 추천 등급은 페이지의 오른쪽에서 약 절반 정도 아래에 있습니다.야후의 스톡에서 파싱 주식 추천 등급

이 지금까지

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

Yahoo는 일부 데이터에 대해 아래 스크립트에서 URL을 요청합니다. 개발자 도구의 네트워크 탭을보고 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를 알아낼 수 있었지만 권장되는 등급을 얻는 링크의 형식을 지정하는 방법을 알고 있는지 궁금합니다. 나는 목록에 더 많은 정보를 추가하려고하고 있는데, 올바른 정보를 얻기 위해 이러한 URL을 수정하는 방법을 알아 내려고하고 있습니다. 감사! –

+0

URL을 수정할 필요가 없습니다. r.json()에서 반환 된 객체를 pprinting하여 사용할 수있는 것이 무엇인지 확인하십시오. 그런 다음 원하는 값으로 키/인덱스를 따라 가십시오. – Jay

0

yahoo 금융 정보에 액세스하기위한 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/

+0

이 API로 가져올 수있는 정보 목록을 찾을 수 없습니다. 링크가 있습니까? 감사! –