Selenium을 이용하여 Dart페이지에 접속하고 원하는 정보를 크롤링 하는 예시입니다.¶
Library import¶
In [1]:
from urllib.request import urlopen
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pandas as pd
import time
In [2]:
# chrome 시작
driver = webdriver.Chrome(r'C:\Users\dcsun\Downloads\000_Study\010_bbb_scrolling\chromedriver_win32\chromedriver.exe') # 윈도우
# driver = webdriver.PhantomJS('/usr/local/Cellar/phantomjs/2.1.1/bin/phantomjs') # (참고)맥
Dart 홈페이지 이동¶
In [3]:
# Dart 홈페이지 이동
driver.get('http://dart.fss.or.kr')
xpath를 활용하여 기업 검색¶
In [4]:
# 검색창 활성화
element = driver.find_element_by_xpath("//*[@id='textCrpNm']")
# 검색창 초기화
length = len(element.get_attribute('value'))
element.send_keys(length * Keys.BACKSPACE)
# 검색 기업 입력
element.send_keys("삼성전자")
In [5]:
# 원하는 공시 지정 - ex 정기공시 - 반기/분기보고서
## 정기공시 클릭
driver.find_element_by_xpath("//*[@id='publicTypeButton_01']").click()
time.sleep(1) # 클릭 후 반응을 고려하여 1초 쉬기
## 반기 보고서 클릭
driver.find_element_by_xpath("//*[@id='publicType2']").click ()
time.sleep(1) # 클릭 후 반응을 고려하여 1초 쉬기
## 분기 보고서 클릭
driver.find_element_by_xpath("//*[@id='publicType3']").click ()
기간 설정¶
In [6]:
## start day
# start day text input 창 선택
element = driver.find_element_by_xpath("//*[@id='startDate']")
# start day text input 창 선택 초기화
length = len(element.get_attribute('value'))
element.send_keys(length * Keys.BACKSPACE)
# start day text input 값 insert
element.send_keys("20190925")
## end day
# end day text input 창 선택
element = driver.find_element_by_xpath("//*[@id='endDate']")
# end day text input 창 선택 초기화
length = len(element.get_attribute('value'))
element.send_keys(length * Keys.BACKSPACE)
# end day text input 값 insert
element.send_keys("20200925")
검색 버튼 클릭 / 반기보고서 클릭¶
In [7]:
# 검색
driver.find_element_by_xpath("//*[@id='searchForm']/fieldset/p[4]/input").click ()
반기보고서 xpath를 통해 url 가지고 오기¶
In [8]:
# 반기보고서 xpath를 통해 반기보고서 url 가지고 오기
elm = driver.find_element_by_xpath("//*[@id='r_20200814001766']")
href = elm.get_attribute('href')
print(href) # debug
In [9]:
# input url
html = urlopen(href) # 반기보고서 url
# 반기보고서 url로 반기보고서 html 호출
bsobjt = BeautifulSoup(html,"html.parser")
# main url을 통해 html 호출하여 파싱
body = str(bsobjt.find('head'))
body = body.split('요약재무정보",')[1] # input2
body = body.split('cnt++')[0]
body = body.split('viewDoc(')[1]
body = body.split(')')[0]
body = body.split(', ')
body = [body[i][1:-1] for i in range(len(body))]
# 요약재무정보 url 생성
url_final = 'http://dart.fss.or.kr/report/viewer.do?rcpNo=' + body[0] + '&dcmNo=' + body[1] + '&eleId=' + body[2] + '&offset=' + body[3] +'&length=' + body[4] + '&dtd=dart3.xsd'
# 요약재무정보 html 가지고 오기
html_final = urlopen(url_final)
bsobjt_final = BeautifulSoup(html_final,"html.parser")
# html 파싱을 통해 표 생성
ls_bf = bsobjt_final.findAll('tr')
_df_rlt = pd.DataFrame(columns = ['gubun','year_1','year_2','year_3'])
for i in ls_bf:
_ls = []
for j in i.findAll('td'):
str_j = str(j)
str_j = str_j.replace('[', '')
str_j = str_j.replace(']', '')
str_j = str_j.replace('\xa0ㆍ', '')
if str_j.split('<')==3:
_ls = _ls + ''
else:
_ls = _ls + [str_j.split('<')[1].split('>')[1]]
if len(_ls) !=4:
pass
else :
_df_rlt = _df_rlt.append(pd.DataFrame(data = [_ls] , columns = ['gubun','year_1','year_2','year_3']))
_df_rlt.reset_index(drop=True,inplace=True)
결과¶
In [10]:
_df_rlt.head(10)
Out[10]:
'개발이야기 > Python' 카테고리의 다른 글
[Python/install]Anaconda 개발 환경 설정 및 Package 설치 (0) | 2022.03.24 |
---|---|
[python] Off-line 환경을 위한 wheel file생성 (0) | 2020.09.27 |
주소를 위경도로 변환 naver cloud platform 활용 (0) | 2020.09.20 |
[python] jupyter notebook 코드를 tistory에 올리는 법. (0) | 2020.09.20 |