import os
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from io import StringIO
browser = webdriver.Chrome()
browser.maximize_window()
# 1. 페이지 이동
url='https://finance.naver.com/sise/sise_market_sum.naver?&page='
browser.get(url)
# 2. 조회 항목 초기화(체크항목 해제)
checkboxes = browser.find_elements(By.NAME,'fieldIds')
for checkbox in checkboxes:
if checkbox.is_selected():
checkbox.click()
# 3. 조회 항목 설정(조회하고자 하는 항목 체크)
items_to_select = ['영업이익', '자산총계', '매출액']
for checkbox in checkboxes:
parent = checkbox.find_element(By.XPATH, '..') #부모 element 찾기
label = parent.find_element(By.TAG_NAME, 'label')
if label.text in items_to_select: #선택항목과 일치한다면
checkbox.click() #체크
# 4. 적용하기 버튼 클릭
btn_apply = browser.find_element(By.XPATH,'//a[@href="javascript:fieldSubmit()"]') # XPATH 정의하기, 전체 html문서에서 찾기(//), a태그의 href속성값 찾기(a[@href=''])
btn_apply.click()
# 6. 페이지 이동을 위한 반복문
for idx in range(1,40): # 1 이상 40 미만 페이지 반복
# 페이지 이동을 위한 사전 작업
browser.get(url + str(idx))
# 5. 데이터 추출과 전처리
html_io = StringIO(browser.page_source)
df = pd.read_html(html_io)[1] # 3개의 테이블 중 필요한 테이블 고르기
df.dropna(axis='index', how='all', inplace=True) # 전부 NaN인 행 삭제
df.dropna(axis='columns', how='all', inplace=True) ## 전부 NaN인 열 삭제
if len(df) == 0: # 더 이상 페이지에서 가져올 데이터가 없으면 break
break
# 6. 파일 저장
f_name = 'sise.csv' # 파일 이름 설정
if os.path.exists(f_name): # 파일이 이미 있다면 헤더 제외
df.to_csv(f_name, encoding='utf-8-sig', index=False, mode='a', header=False) # 파일이름, 한글표기, 인덱스 제거, append 설정, 헤더 제거
else: # 파일이 없다면 헤더 포함
df.to_csv(f_name, encoding='utf-8-sig', index=False) # 파일이름, 한글표기, 인덱스 제거, write 모드(기본설정), 헤더 포함(기본설정)
print(f'{idx} 페이지 완료')
browser.quit() # 브라우저 종료
1 페이지 완료
2 페이지 완료
3 페이지 완료
4 페이지 완료
5 페이지 완료
...
35 페이지 완료
36 페이지 완료
37 페이지 완료
38 페이지 완료
39 페이지 완료
참고 영상: 주식정보 크롤링하기(나도코딩)
'데이터 분석' 카테고리의 다른 글
wine 데이터셋을 활용한 혼동행렬 시각화 (0) | 2024.09.14 |
---|---|
객체지향 프로그래밍 (3) | 2024.09.10 |
StringIO객체 (1) | 2024.09.09 |
연속형, 이산형, 범주형 데이터 (0) | 2024.09.07 |
matplotlib에서 fig, ax = plt.subplots()를 사용하는 이유 (2) | 2024.09.06 |