import pandas as pd
import time
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
class Seibro():
def __init__(self):
super().__init__()
def launchBrowser(self):
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
return driver
# 태그를 제거 하기 위한 함수
def remove_tag(self, content):
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, '', content)
return cleantext
def getdata_dividend(self, driver):
# for debugging 윈도우 타이틀 확인하기
print(driver.title)
isMore = True
page = 1
while isMore:
time.sleep(5) # 조회가 완료 될 때 까지 시간을 좀 기다려 줘야 한다.
print('page:' + str(page))
# 페이지 이동을 추가로 해야 된다.
try:
page_move_id = "cntsPaging01_page_" + str(page)
driver.find_element(By.ID, page_move_id).click()
time.sleep(1)
# 데이터 가져오기
req = driver.page_source
soup = BeautifulSoup(req, 'html.parser')
# 원하는 결과가 있는 쪽 결과만 가져온다.
tbody = soup.find(id="grid1_body_tbody")
trs = tbody.find_all("tr")
# 가져온 종목 개수 확인 (한 페이지에 15개 나옴)
dic_key = (page - 1) * 15
result_df = pd.DataFrame(columns=range(11))
for tr_data in trs:
tds = tr_data.find_all("nobr")
tds[0] = self.remove_tag(str(tds[0]))
tds[1] = self.remove_tag(str(tds[1]))
tds[2] = self.remove_tag(str(tds[2]))
tds[3] = self.remove_tag(str(tds[3]))
tds[4] = self.remove_tag(str(tds[4]))
tds[5] = self.remove_tag(str(tds[5]))
tds[6] = self.remove_tag(str(tds[6]))
tds[7] = self.remove_tag(str(tds[7]))
tds[8] = self.remove_tag(str(tds[8]))
tds[9] = self.remove_tag(str(tds[9]))
df = pd.DataFrame(columns=range(10))
df.loc[dic_key] = [tds[0], tds[1], tds[2], tds[3], tds[4], tds[5], tds[6], tds[7], tds[8], tds[9]]
dic_key = dic_key + 1
# 최종 결과에 저장한다. 여기는 Key 값이 들어가서 11개의 column 이 된다.
result_df = result_df.append(df)
print(result_df)
except Exception as e:
# 더이상 페이지가 없을 경우 에러 발생
isMore = False
# 페이지를 올린다.
page += 1
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
selbro = Seibro()
driver = selbro.launchBrowser()
driver.implicitly_wait(10)
# 원하는 홈페이지 주소 (배당금 순위를 연도별로 조회할 수 있는 곳으로 이동한다.)
driver.get('https://seibro.or.kr/websquare/control.jsp?w2xPath=/IPORTAL/user/company/BIP_CNTS01041V.xml&menuNo=285')
selbro.getdata_dividend(driver)