[시계열 데이터수집] 크롤링 다음페이지 넘기기

2022. 12. 27. 21:47·데이터분석/시계열분석

예전에 프로젝트를 하다가 전염병 관련 데이터를 모았던 일이 있습니다.

 

url 이 변하지 않아 selenium을 써야 했고 직접 한페이지 한페이지 넘기면서 데이터를 가져왔어야 했습니다.

다음페이지 버튼을 클릭해가며 끝까지 크롤링하는 부분이 생각보다 쉽지 않아 정리해보려 합니다.

 

가져왔던 페이지는 국가가축방역통합시스템이고 가축전염병이 발생했던 날짜와 장소를 나타낸 데이터입니다.

 

https://home.kahis.go.kr/home/lkntscrinfo/selectLkntsOccrrncList.do

 

국가가축방역통합시스템

> 가축전염병 발생정보 > 국내현황 > 법정가축전염병 발생현황 법정가축전염병 발생현황

home.kahis.go.kr

크롤링을 하기 위해 셀레늄 드라이버를 부르고

 

import pandas as pd
import numpy as np
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

import time

options = webdriver.ChromeOptions()
# options.add_argument("headless")
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(options = options, service=Service(ChromeDriverManager().install()))
driver.set_window_size(1500, 3000)
driver = webdriver.Chrome()

 

드라이버에 홈페이지 주소를 넣어주고 원하는 날짜, 전염병이름을 골라줍니다.

저는 1990년도부터 2021년까지 조류인플루엔자를 골랐습니다.

 

url = 'https://home.kahis.go.kr/home/lkntscrinfo/selectLkntsOccrrncList.do'
driver.get(url)

# 시작날짜 클릭
start_box = driver.find_element(By.CSS_SELECTOR,'#occrFromDtId')
# 시작날짜입력칸 클릭
start_box.click()
 # 시작날짜입력
start_box.send_keys('19900101')
# 마지막 날짜 클릭
end_box = driver.find_element(By.CSS_SELECTOR,'#occrToDtId')
end_box.click()
# 마지막 날짜 입력
end_box.send_keys('20211231')

# 질병명 : '구제역' 고르기
elem = driver.find_element(By.CSS_SELECTOR,'#dissCl > option:nth-child(4)').click()
time.sleep(0.5)

# 조회 클릭

elem = driver.find_element(By.CSS_SELECTOR,'#btnSearch').click()

 

이 상태에서 현재페이지(1페이지) 정보를 가져오고 page_number들이 모인 리스트를

page_bar로 받아 크롤링을 진행해주면 

 

page_bar = driver.find_elements(By.CSS_SELECTOR,'#homeLkntscrinfoVO > table:nth-child(7) > tbody > \
    tr:nth-child(2) > td > table > tbody > tr > td > a')
page = 10
df = pd.DataFrame()
for p in range(1,page+1):
    for button in page_bar:
        if button.text == str(p):
            button.click()
            break
    html = driver.page_source
    df = pd.concat([df,pd.read_html(html)[8]])
    if p % 10 == 0:
        driver.find_elements(By.CSS_SELECTOR,'#homeLkntscrinfoVO > table:nth-child(7) > tbody > \
        tr:nth-child(2) > td > table > tbody > tr > td > a')[11].click()
df

 

2페이지가 넘어가면서 오류가 나는 것을 볼 수 있습니다. 오류를 보니 클릭할 객체가 없어서 나는 오류입니다.

확인해보면 button.click()을 하고 다시 클릭을 했을때 오류가 나는 걸 알 수 있습니다.

 

 

이런 이유는 페이지가 넘어갈 때 마다 page_bar에 해당하는 정보가 달라지기 때문입니다.

그래서 button.click() 을 하기 전에 page_bar를 다시 지정해 주어야 이 문제를 해결할 수 있습니다.

밖에 있던 page_bar 지정 부분을 for문 안쪽으로 넣어주면 해결됩니다.

 

page = 10
df = pd.DataFrame()
for p in range(1,page+1): # 원하는 페이지까지 반복문
    
    # for문 안에 page_bar를 넣어주어 매번 지정
    page_bar = driver.find_elements(By.CSS_SELECTOR,'#homeLkntscrinfoVO > table:nth-child(7) > tbody > \
        tr:nth-child(2) > td > table > tbody > tr > td > a')

    for button in page_bar:
        if button.text == str(p):
            button.click()
            break
    html = driver.page_source 
    df = pd.concat([df,pd.read_html(html)[8]])
    if p % 10 == 0:  # 10의 배수일때 다음10페이지 버튼 클릭
        driver.find_elements(By.CSS_SELECTOR,'#homeLkntscrinfoVO > table:nth-child(7) > tbody > \
        tr:nth-child(2) > td > table > tbody > tr > td > a')[11].click()
df

 

 

오류가 안나고 크롤링이 잘 되는 걸 볼 수 있습니다! 

도움이 되셨으면 좋겠습니다~ 감사합니다

'데이터분석 > 시계열분석' 카테고리의 다른 글

[시계열분석] 시계열 분해(1) - 시계열 성분과 분해방법  (0) 2023.01.14
[시계열 분석] 정상성이란?  (2) 2023.01.03
시계열 평가지표(Forecasting Metrics) 정리  (0) 2022.12.31
[시계열 데이터수집] darts 모듈 데이터셋 살펴보기  (0) 2022.12.26
'데이터분석/시계열분석' 카테고리의 다른 글
  • [시계열분석] 시계열 분해(1) - 시계열 성분과 분해방법
  • [시계열 분석] 정상성이란?
  • 시계열 평가지표(Forecasting Metrics) 정리
  • [시계열 데이터수집] darts 모듈 데이터셋 살펴보기
데이터분석과 개발
데이터분석과 개발
데이터분석 뿐 아니라 데이터엔지니어링까지 다하고 싶은 데이터분석가입니다 :)
  • 데이터분석과 개발
    먼지뭉치 Data Analysis
    데이터분석과 개발
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 데이터분석 (23)
        • 데이터분석 (4)
        • 시계열분석 (6)
        • 데이터 전처리 (9)
        • 데이터시각화 (3)
        • 환경세팅 (1)
        • 논문 (0)
      • AI agent (1)
      • SQL (6)
      • 개발&분석 경험 (3)
      • 알고리즘 (3)
      • OS (1)
      • 수학 (4)
        • 선형대수 (2)
        • 확률&통계 (2)
      • 맛집 (2)
        • 이수&사당 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    stl
    빈 데이터프레임 #pandas #데이터전처리
    데이터분석
    loess
    SQL
    시계열데이터셋
    np.split
    응용이 보이는 선형대수
    짧은 시계열 # 금융시계열
    크롤링자동화
    리눅스개념
    플로틀리
    pandas # 월말 날짜 # 마지막 주 # 날짜계산 # 시계열 # 마지막 주 금요일
    파이프라인전처리
    시계열분해
    시계열모듈
    시계열 #reindex #인덱스 확장 #datetime index #index extention # 데이터전처리
    timeseries decomposition
    이수역 양식집
    Python
    시간형식변환
    음수값 #전처리 #선형보간 #pandas #데이터 #데이터분석
    오제이튜브
    adf_test
    확률
    시계열
    시간형식
    시계열시각화
    pandas
    seaborn # kdeplot # 데이터분석
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데이터분석과 개발
[시계열 데이터수집] 크롤링 다음페이지 넘기기
상단으로

티스토리툴바