Programming for trading

[Python] 삼성전자 PER, PBR 웹크롤링

quantoasis 2022. 12. 20. 10:05
반응형

 

 

이번 포스팅에서는 주식 종목의 PER, PBR을 웹에서 크롤링하는 법을 알아보겠습니다.

 

웹크롤링 주의사항

웹크롤링할때는 주의할 점이 몇 가지 있는데, 아래와 같습니다.

 

1. 반복문 적용시 Sleep을 걸어주어 웹서버에 부하가 걸리지 않도록 해야 함(block 방지)

2. 사전에 허락을 받은 것이 아니라면, 수집한 데이터를 상업용목적으로 쓰지 않아야 한다.

 

오늘 크롤링할 데이터가 있는 에프엔가이드(http://comp.fnguide.com/)에는 아래와 같은 경고문구가 있으니 참고하세요.

 

 

사이트의 웹크롤링 허용 범위를 보려면 홈페이지 url 맨 뒤에 /robots.txt 를 붙여보면 되는데요, 확인 결과 특정 페이지만 네거티브하게 Disallow를 하고 있네요. 자세한 설명은 유대표님이 쓰신 파이썬으로 배우는 웹스크래핑(https://wikidocs.net/book/4614) 참고하시면 되겠습니다.

 

 

 

삼성전자 재무지표 웹크롤링

 

데이터 크롤링에 자주 쓰이는 파이썬 패키지는 BeautifulSoup4입니다.  그리고 HTML언어를 처리하기 위해 lxml 패키지도 설치합니다.

 

# !pip install lxml
# !pip install BeautifulSoup4
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

 

 

크롤링할 페이지를 보면 URL에 종목코드가 있는 것을 알 수 있습니다. 이 종목코드만 변수로 만들어서 URL을 생성하게 될 텐데요. 이렇게 하면 반복문을 통해 여러 종목의 데이터를 한 번에 스크래핑할 수 있게 됩니다. 

 

파이썬에서는 {}와 format 함수를 통해 아래와 같이 표현 할 수 있습니다.

 

ticker = 'A005930'#삼성전자
URL = "http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode={}".format(ticker)
print(URL)

 

이제 삼성전자의 PER를 읽어올텐데요, HTML언어 해석을 통해 PER가 있는 태그를 가져와야 합니다. 웹에서 F12를 누르면 나오는 개발자 툴에서 확인하실 수 있습니다.

 

 

Chrome 기준, F12를 누르면 나오는 개발자 툴에서 왼쪽 위 마우스버튼을 클릭합니다. 그 후 웹페이지에서 가져오고 싶은 정보를 클릭하면 그 값을 가지고 있는 HTML 태그 주소가 나오게 됩니다. 

 

여러 방식으로 태그 값을 가져올 수 있지만 오늘은 Seletor를 이용해보겠습니다. 해당 값에 오른쪽 단추를 누른 후 Copy >> Copy selector를 누르면 아래와 같은 값이 복사되는 것을 알 수 있습니다.

 

 

복사 값 :  #corp_group2 > dl:nth-child(1) > dd

 

이제 BeautifulSoup을 통해 데이터를 가져올 텐데, 원활한 수집을 위해 위 selector에서 nth-child를 nth-of-type으로 변경해줍니다.

 

#nth-child 를  nth-of-type 로 변경해야함
req = urlopen(URL)
html = req.read()

soup = BeautifulSoup(html, 'lxml')
per = soup.select_one('#corp_group2 > dl:nth-of-type(1) > dd')
print(per.text)

 

위 코드를 실행하면 삼성전자의 per를 text형태로 가져올 수 있습니다.

 

per 외에 다른정보들도 같은 방식으로 가져오면 됩니다.

 

per12m = soup.select_one('#corp_group2 > dl:nth-of-type(2) > dd')
업종per = soup.select_one('#corp_group2 > dl:nth-of-type(3) > dd')
pbr = soup.select_one('#corp_group2 > dl:nth-of-type(4) > dd')
배당수익률 = soup.select_one('#corp_group2 > dl:nth-of-type(5) > dd')
print(ticker,' per:', per.text,'per12m:',per12m.text,'업종per:',업종per.text,'pbr:',pbr.text,'배당수익률:',배당수익률.text)

 

여러종목의 재무지표를 크롤링하여 export하기

 

마지막으로 반복문을 통해 원하는 종목을 모두 크롤링해 csv파일로 만드는 코드입니다.

 

이때 서두에 이야기한대로 Sleep을 통해 딜레이를 걸어주어야 합니다.

 

조금 복잡해 보일지 모르겠지만, ticker_list라는 변수에 list형태로 원하는 종목코드를 넣고 위에 있었던 작업을 반복하는 것입니다.

 

또한, 크롤링이 완료된 후에는 pandas를 통해 DataFrame을 만들어주고, to_csv기능으로 파일로 export 하면 됩니다.

#여러 종목의 데이터를 가져올때는 꼭 timesleep을 걸어줘야함 (block 당할 수 있음)

import time
ticker_list = ['A005930','A000370']

per=[]
pbr=[]


for ticker in ticker_list:
    URL = "http://comp.fnguide.com/SVO2/ASP/SVD_Finance.asp?pGB=1&gicode={}".format(ticker)

    req = urlopen(URL)
    html = req.read()

    soup = BeautifulSoup(html, 'lxml')
    cper = soup.select_one('#corp_group2 > dl:nth-of-type(1) > dd')
    cpbr = soup.select_one('#corp_group2 > dl:nth-of-type(4) > dd')
    per.append(cper.text)
    pbr.append(cpbr.text)
    
    time.sleep(5)
    print(ticker,'완료')
    
#리스트를 데이터프레임으로 변경
list_of_tuples = list(zip(ticker_list, per,pbr))
df = pd.DataFrame(list_of_tuples, columns = ['ticker','per', 'pbr'])

df.to_csv('재무지표.csv')

 

이번 포스팅에서는 재무지표 웹크롤링에 대해 알아봤습니다. 유의사항들을 꼭 숙지하시고 활용하시기 바랍니다.

 

감사합니다.

반응형