728x90
야후 파이낸스 프랑스(https://fr.finance.yahoo.com/) 주가 데이터를 크롤링하는 것은 조금 다르다. 왜냐하면 주가 데이터를 조회 후 스크롤하면 데이터가 자동으로 계속 보이는 방식이기 때문이다. 원하는 데이터 기간을 조회 후 스크롤하지 않으면 모든 데이터가 나오지 않는다. 이 문제를 해결하기 위해서는 selenium 라이브러리를 사용해야 한다.
pip install selenium
그리고 크롬 드라이브를 다운로드 한다.
Downloads - ChromeDriver - WebDriver for Chrome
WebDriver for Chrome
sites.google.com
자신의 크롬에 맞는 버전을 다운받으면 된다. 크롬에서 도움말 – Chrome 정보에 버전이 나와있다.
크롤링 대상이 되는 url은 다음과 같다.
period부분을 보면 숫자로 되어있다. 날짜를 시간형식으로 바꿔야함을 의미한다.
이제 우리가 잘 아는 루이비통 브랜드의 회사인 LVMH의 주가 데이터를 크롤링 해보자.
from bs4 import BeautifulSoup
import requests
import math
import pandas as pd
import numpy as np
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
def get_stock_data_from_yahoo_france(code, date_range):
daily_price = []
col_name = ['날짜', '시가', '고가', '저가', '종가', '조정가', '거래량']
# 날짜를 시간으로 변환
p1 = int((datetime(int(date_range[0].split('-')[0]), int(date_range[0].split('-')[1]), int(date_range[0].split('-')[2]))
- datetime.utcfromtimestamp(0)).total_seconds())
p2 = int((datetime(int(date_range[1].split('-')[0]), int(date_range[1].split('-')[1]), int(date_range[1].split('-')[2]))
- datetime.utcfromtimestamp(0)).total_seconds())
fullUrl = 'https://fr.finance.yahoo.com/quote/%s/history?period1=%s&period2=%s&interval=1d&filter=history&frequency=1d' % (code, p1, p2)
chrome_options = Options()
# 이 설정을 하지 않으면 실제로 크롬이 화면에 떠서 자동으로 움직임
chrome_options.add_argument("--headless")
driver = webdriver.Chrome('./driver/chromedriver.exe', chrome_options=chrome_options)
driver.get(fullUrl)
time.sleep(1)
while True:
try:
# 실행시 동의 버튼이 나와 자동으로 agree버튼을 눌러줌
driver.find_element_by_xpath('//*[@name="agree"]').click()
break
except:
pass
# <body> 요소를 가져옴
body = driver.find_element_by_tag_name("body")
save_len = 0
while True:
for i in range(10):
# body 요소에서 page down 키를 10번 누름
body.send_keys(Keys.PAGE_DOWN)
time.sleep(0.3)
html = driver.page_source
# 페이지가 갱신되었다면 전체 길이가 달라져서 계속 page down을 함
if save_len != len(html):
save_len = len(html)
else:
break
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# 주가 데이터가 있는 테이블을 가져옴
soup = soup.find('table', {'data-test': 'historical-prices'})
sise = soup.find_all('tr')[1:]
for r in sise:
d = []
data = r.find_all('span')
# 아래 메시지도 같이 크롤링되어서 제외
if len(data) <= 2 or data[0].text == '*Cours de clôture ajusté en fonction des fractionnements.':
continue
# 날짜 변환
dt = data[0].text
if 'janv.' in dt:
dt = dt.replace('janv.', 'Jan.')
elif 'févr.' in dt:
dt = dt.replace('févr.', 'Feb.')
elif 'mars' in dt:
dt = dt.replace('mars', 'Mar.')
elif 'avr.' in dt:
dt = dt.replace('avr.', 'Apr.')
elif 'mai' in dt:
dt = dt.replace('mai', 'May.')
elif 'juin' in dt:
dt = dt.replace('juin', 'Jun.')
elif 'juil.' in dt:
dt = dt.replace('juil.', 'Jul.')
elif 'août' in dt:
dt = dt.replace('août', 'Aug.')
elif 'sept.' in dt:
dt = dt.replace('sept.', 'Sep.')
elif 'oct.' in dt:
dt = dt.replace('oct.', 'Oct.')
elif 'nov.' in dt:
dt = dt.replace('nov.', 'Nov.')
elif 'déc.' in dt:
dt = dt.replace('déc.', 'Dec.')
dt = datetime.strptime(dt, '%d %b. %Y').strftime('%Y-%m-%d')
d.append(dt)
d.append(data[1].text.replace('\u202f', '').replace(',', '.'))
d.append(data[2].text.replace('\u202f', '').replace(',', '.'))
d.append(data[3].text.replace('\u202f', '').replace(',', '.'))
d.append(data[4].text.replace('\u202f', '').replace(',', '.'))
d.append(data[5].text.replace('\u202f', '').replace(',', '.'))
try:
d.append(data[6].text.replace('\u202f', ''))
except:
d.append(0)
daily_price.append(d)
df = pd.DataFrame(daily_price, columns=col_name)
df = df[(df['날짜'] >= date_range[0]) & (df['날짜'] <= date_range[1])]
driver.close()
return df
if __name__ == '__main__':
stock = get_stock_data_from_yahoo_france('MC.PA', ['2019-01-01', '2020-01-10'])
print(stock)
결과 값
날짜 시가 고가 저가 종가 조정가 거래량
0 2020-01-10 425.20 426.30 422.65 423.65 423.65 268887
1 2020-01-09 422.00 424.50 421.35 424.50 424.50 378062
2 2020-01-08 414.70 418.80 413.55 418.80 418.80 360741
3 2020-01-07 417.60 421.55 415.40 416.00 416.00 363885
4 2020-01-06 415.00 416.20 408.60 415.15 415.15 363953
.. ... ... ... ... ... ... ...
258 2019-01-08 251.50 262.50 250.10 258.55 254.18 742574
259 2019-01-07 252.65 253.50 249.30 250.70 246.47 550835
260 2019-01-04 246.45 251.95 244.10 251.15 246.91 886586
261 2019-01-03 248.00 248.85 243.65 243.65 239.54 785119
262 2019-01-02 254.05 256.05 249.80 253.30 249.02 561858
728x90
'Data Science > Data Collection' 카테고리의 다른 글
[03. API] 001. Pandas Datareader (0) | 2020.02.12 |
---|---|
[02. 웹크롤링] 004. 38커뮤니케이션 – IPO 데이터 (0) | 2020.01.12 |
[02. 웹크롤링] 002. 야후 파이낸스 일본 – 주가 데이터 (0) | 2020.01.11 |
[02. 웹크롤링] 001. 네이버 – 주가 데이터 (0) | 2020.01.05 |
[01. 데이터] 001. 데이터 수집 (0) | 2020.01.03 |