이전 포스팅을 통해 가상환경 설치와 간단한 크롤링 하는 코드를 작성했음.
또한 해당 포스팅은 나도 코딩님의 강의를 통해 학습한 내용을 포스팅 함.
본격적인 크롤링을 위해 가상환경에 pandas, selenium, lxml 설치하기
pip install pandas selenium lxml
우선 각각의 라이브러리가 어떤 것인지에 대한 간단한 설명으로 아래와 같다.
Pandas
- 데이터 조작과 분석을 위한 파이썬 라이브러리
- 주로 표 형식의 데이터를 다루는 데 사용되며, 데이터를 읽고 쓰는 기능을 포함
Selenium
- 웹 애플리케이션을 테스트하기 위한 도구로 시작되어
- 웹 브라우저 자동화를 위한 강력한 라이브러리로 널리 사용됨.
- 웹 페이지를 제어하고 데이터를 스크래핑하는 데 사용됨.
Xml
- XML과 HTML 처리를 위한 라이브러리
- 주로 웹 스크래핑, 데이터 추출 등에 사용됨
만약 위 코드 실행시 에러가 발생한다면 pandas, selenium, lxml 하나씩 설치 해보고
그래도 안된다면 pip를 업데이트 하기 위해 아래의 코드를 실행해보기!
pip install
이후 설치가 잘 되어 있는지 확인을 위해 아래의 코드를 실행
pip list
이제 Selenium을 사용하기 위해 크롬 드라이버 설치하기
이전 방식이라면 크롬 브라우저의 버전에 따라 수동으로 다운로드 후 PATH에 추가했지만
이제는 아래의 코드로 설치 후 사용할 수 있음.
pip install webdriver_manager
아래 코드는 해당 크롤링 과정에 대한 파이썬 코드로 설명 또한 함께 작성했음.
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. 페이지 이동
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 = {"영업이익", "자산총계", "매출액"}
items_to_select = {"시가", "고가", "저가"}
for checkbox in checkboxes: # 부모인 td 태그의 자식인 label의 innertext찾기
parent = checkbox.find_element(By.XPATH, "..") # 부모 element 찾기 -> 즉 td 태그 지정
label = parent.find_element(By.TAG_NAME, "label")
if label.text in items_to_select:
checkbox.click() # 선택항목 클릭
# 4. 적용하기 클릭
# //를 붙여주는건 전체 html에서 찾겠다는 의미이며 전체 a태그에서 @href 속성을 찾겠다는 것
btn_apply = browser.find_element(By.XPATH, "//a[@href='javascript:fieldSubmit()']")
btn_apply.click()
idx = 1
while True:
# 사전 작업: 페이지 이동
browser.get(url+str(idx))
# 5. 데이터 추출
df = pd.read_html(StringIO(browser.page_source))[1] # data frame
# axis=index는 행 기준으로 제거하겠다는 뜻. 그리고 how에 all이면 모두 NaN이면 지우기, any는 하나라도 있으면 지우기,
# 그리고 inplace True를 하면 해당 요청을 그대로 df에 반영
df.dropna(axis="index",how="all", inplace=True)
df.dropna(axis="columns",how="all", inplace=True)
# df.head(10) # 해당 프레임의 데이터를 10개만 가져오겠다라는 뜻.
# 데이터 체크
if len(df) == 0: break
# 6. 파일 저장
f_name = "sise.csv"
if os.path.exists(f_name): # 파일이 존재한다면? 헤더 제외, mode의 a는 append
df.to_csv(f_name, encoding="utf-8-sig", index=False, mode='a', header=False)
else: # 파일이 없다면? 헤더를 포함, 기본 mode는 쓰기
df.to_csv(f_name, encoding='utf-8-sig', index=False)
print("%d 페이지 완료"%idx)
idx += 1
print("모든 작업 완료")
browser.quit()
소감
- 위 작업을 통해 크롤링 작업에 대한 시퀀스를 알게 되었고
- 다른 작업을 좀 더 해보면서 유용하게 사용할 수 있는 방법에 대해 알아보면 좋을 것 같다.
- 그리고 pandas, selenium, lxml 라이브러리 사용법에 대해선
- 계속 공부해보면서 포스팅하겠습니다.