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)
배당내역전체검색 | SEIBro
page:1
0 1 2 3 ... 7 8 9 10
0 2023/04/18 2023/04/28 203810 ... 하나은행 보통주 0 NaN
1 2023/04/18 203810 ... 하나은행 보통주 0 NaN
2 2023/04/18 203810 ... 하나은행 보통주 0 NaN
3 2023/03/31 105560 ... 국민은행 보통주 0 NaN
4 2023/03/31 017670 ... 국민은행 보통주 0 NaN
5 2023/03/31 008870 ... 하나은행 보통주 0 NaN
6 2023/03/31 2023/05/17 005930 ... 한국예탁결제원 보통주 361 NaN
7 2023/03/31 2023/05/17 005935 ... 한국예탁결제원 우선주 361 NaN
8 2023/03/31 225190 ... 한국예탁결제원 보통주 0 NaN
9 2023/03/31 055550 ... 한국예탁결제원 보통주 0 NaN
10 2023/03/31 05555K ... 한국예탁결제원 13우선주 0 NaN
11 2023/03/31 003410 ... 한국예탁결제원 보통주 0 NaN
12 2023/03/31 097950 ... 한국예탁결제원 보통주 0 NaN
13 2023/03/31 097955 ... 한국예탁결제원 우선주 0 NaN
14 2023/03/31 096530 ... 하나은행 보통주 0 NaN
[15 rows x 11 columns]
..................................