>

여러분 중 일부는 아마 야후! Finance는 주식 시장 데이터에 대한 API를 중단했습니다. 나는 fix-yahoo-finance 의 존재를 알고있는 동안  솔루션에서 Yahoo의 기록 데이터를 직접 스크랩하여 코드에 대해보다 안정적인 솔루션을 구현하려고했습니다.

지금 여기에 내가 가진 것이 있습니다 :

import requests
from bs4 import BeautifulSoup
page = requests.get("https://finance.yahoo.com/quote/AAPL/history?period1=345423600&period2=1495922400&interval=1d&filter=history&frequency=1d")
soup = BeautifulSoup(page.content, 'html.parser')
soup
print(soup.prettify())

Yahoo 테이블에서 데이터를 가져 오려면 다음을 수행하십시오.

c=soup.find_all('tbody')
print(c)

제 질문은 "c"를 더 좋은 데이터 프레임으로 바꾸는 방법입니다. 감사합니다!

  • 답변 # 1

    다운로드 csv 링크에서 YF의 히스토리 데이터를 직접 얻기 위해 이것을 썼습니다. 쿠키와 빵 부스러기를 얻고 다른 하나는 데이터를 얻기 위해 두 가지 요청을해야합니다. 팬더 데이터 프레임을 반환합니다.

    import re
    from io import StringIO
    from datetime import datetime, timedelta
    import requests
    import pandas as pd
    
    class YahooFinanceHistory:
        timeout = 2
        crumb_link = 'https://finance.yahoo.com/quote/{0}/history?p={0}'
        crumble_regex = r'CrumbStore":{"crumb":"(.*?)"}'
        quote_link = 'https://query1.finance.yahoo.com/v7/finance/download/{quote}?period1={dfrom}&period2={dto}&interval=1d&events=history&crumb={crumb}'
        def __init__(self, symbol, days_back=7):
            self.symbol = symbol
            self.session = requests.Session()
            self.dt = timedelta(days=days_back)
        def get_crumb(self):
            response = self.session.get(self.crumb_link.format(self.symbol), timeout=self.timeout)
            response.raise_for_status()
            match = re.search(self.crumble_regex, response.text)
            if not match:
                raise ValueError('Could not get crumb from Yahoo Finance')
            else:
                self.crumb = match.group(1)
        def get_quote(self):
            if not hasattr(self, 'crumb') or len(self.session.cookies) == 0:
                self.get_crumb()
            now = datetime.utcnow()
            dateto = int(now.timestamp())
            datefrom = int((now - self.dt).timestamp())
            url = self.quote_link.format(quote=self.symbol, dfrom=datefrom, dto=dateto, crumb=self.crumb)
            response = self.session.get(url)
            response.raise_for_status()
            return pd.read_csv(StringIO(response.text), parse_dates=['Date'])
    
    

    다음과 같이 사용할 수 있습니다 :

    df = YahooFinanceHistory('AAPL', days_back=30).get_quote()
    
    

  • 이전 c++ - 친구 클래스에서 생성자가 private 인 클래스를 인스턴스화 할 수없는 이유는 무엇입니까?
  • 다음 rsync를 사용할 때 다른 ssh 포트를 지정할 수 있습니까?