데이터 분석

주식정보 크롤링하기

temporubato108 2024. 9. 9. 21:48
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 페이지 완료

sise.csv
0.14MB

 

 

 

참고 영상: 주식정보 크롤링하기(나도코딩)