호쌤
호쌤 Just For Fun

[Python 데이터 수집] 이젠 아카데미 클럽 게시글 수집

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] 이젠 아카데미 클럽 게시글 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 수집] 이젠 아카데미 클럽 게시글 수집

로그인을 해야만 접근 할 수 있는 페이지나, 동적으로 화면이 변하는 웹 페이지로부터 컨텐츠를 수집하기 위해 사용되는 Selenium에 대해 알아 봅니다.

Selenium 소개

Selenium은 주로 웹앱을 테스트하는 웹 프레임워크로서 크롬이나 파이어폭스같은 각 브라우저의 각 브라우저마다 제공되는 Webdriver API를 활용하여 크롬이나 파이어폭스 같은 웹 브라우저를 Java나 C#, Python 같은 프로그래밍 언어를 통해 제어합니다.

웹 브라우저를 직접 제어하기 때문에 자바스크립트에 의해 동적으로 생성되는 사이트의 데이터를 크롤링할 때 매우 유용하게 사용되는 스크래핑 도구입니다.

1) Selenium 동작 방식

Selenium은 아래와 같은 과정을 거쳐 크롬 브라우저를 제어합니다.

Python 소스코드 –> Selenium 패키지 –> ChromeDriver(WebDriver) –> Google Chrome

키보드 입력값을 전달한다거나 스크롤을 이동시키는 등의 제어가 가능하고 웹 브라우저의 개발자도구에서 확인 가능한 Element 내용을 수집하기 때문에 웹 페이지 로딩 후 동적인 결과를 가져오는 웹 페이지의 컨텐츠를 수집할 수 있습니다. requests 패키지를 통해 URL을 수집하는 경우 동적 결과는 가져오지 못하는 경우 Selenium을 활용하면 컨텐츠 수집이 가능합니다.

2) ChromeDriver 내려받기

https://chromedriver.chromium.org/downloads에서 사용중인 운영체제와 Google Chrome 브라우저의 버전에 맞는 ChromeDriver를 내려받습니다.

크롬의 버전 정보는 도움말 메뉴에서 확인할 수 있습니다.

3) selenium 설치하기

1
pip install --upgrade selenium

01. 필요한 모듈 참조

1
2
3
4
5
6
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from pandas import DataFrame
import urllib
import time

#02. 크롬브라우저 객체 생성

1
2
3
4
# 맥이나 리눅스의 경우 파일 확장자가 없다. 윈도우의 경우 exe 확장자까지 명시해야 한다.
driver = webdriver.Chrome('./chromedriver.exe')
# 모든 동작마다 크롬브라우저가 준비될 때 까지 최대 5초씩 대기
driver.implicitly_wait(5)

#03. 이젠아카데미 사이트 로그인

1) 로그인 페이지로 이동하기

1
2
3
4
driver.get("https://ezenac.co.kr/ezen/member/member_login.asp")

# 페이지의 이동이 완료될 동안 프로그램이 진행하면 안되므로 약 3초간 파이썬 프로그램 대기
time.sleep(3)

2) 로그인하기

아이디 입력 요소 찾기

아래의 코드 형식은 지정된 선택자가 검색될 때 까지 최대 3초를 대기한다. 해당 요소를 찾지 못하면 에러가 발생한다.

1
변수 = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("CSS선택자"))

입력요소에 id속성이 없는 경우 name 속성으로 접근한다.

1
id_input = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("input[name='user_id']"))

아이디 입력 요소에 키 입력 보내기

1
id_input.send_keys("사이트회원아이디")

비밀번호 입력 요소를 찾아서 입력하기

1
2
pw_input = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("input[name='user_pw']"))
pw_input.send_keys("비밀번호")

로그인 버튼을 찾아서 클릭하기

1
2
3
login_button = WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector(".inputSub > input[type='submit']"))
login_button.click()
time.sleep(1)

로그인 후 메인페이지의 로딩이 완료될 때 까지 대기

메인 페이지의 특정 요소(여기서는 로고 이미지) 를 브라우저가 식별할 수 있을 때 까지 최대 3초간 대기한다. (시간은 상황에 맞게 지정할 수 있다.)

1
WebDriverWait(driver, 3).until(lambda x: x.find_element_by_css_selector("#header-logo"))
▶ 출력결과
1
<selenium.webdriver.remote.webelement.WebElement (session="4ed3d00332d929b4f5917c72a50a487a", element="f8fda666-1b06-43c4-9497-11b378ec71a7")>

#04. 이젠 클럽 게시판 접근

1) 접근할 페이지 URL 정의

1
2
3
4
5
6
7
8
9
base_url = "https://ezenac.co.kr/ezen/club/board_list.asp"

base_param = {"ci": 222, "mi": 9, "pg": 1, "ps": 30, "sf": 0, "sw": ""}

# URLEncoding
query = urllib.parse.urlencode(base_param)

# 접속할 주소 확정
content_url = base_url + "?" + query

2) 해당 페이지로 이동

1
2
driver.get(content_url)
time.sleep(1)

3) 크롬브라우저에 나타나고 있는 화면에 대한 HTML 코드를 추출

requests 모듈 사용시의 r.text에 해당하는 값

1
2
html = driver.page_source
html
▶ 출력결과
1
2
'<html lang="ko-KR"><head>\n\t<meta charset="euc-kr">\n\t<meta http-equiv="X-UA-Compatible" content="IE=edge">\n\t<meta name="viewport" content="width=1300">\n\t<meta name="naver-site-verification" content="babfe5569a552c6f5587e9e12491a77016ba3e78"><meta name="google-site-verification" content="cd3gfoGY57Szmn8l8weox2DE1cg7hg7Ixvz949pIaBY">\n\t<title>자바,파이썬기반&nbsp;머신러닝&nbsp;빅데이터&nbsp;활용 클럽 - 이젠아카데미컴퓨터학원</title>\n\t<link rel="stylesheet" href="/common/css/site/style_font.css">
... 생략 ...'

4) Chrome 브라우저 닫기

HTML 코드를 추출 한 후 크롬 브라우저의 역할은 끝났으므로 열려 있는 웹 브라우저를 닫는다.

1
driver.quit()

5) 수집한 코드를 BeautilfulSoup으로 변환

1
soup = BeautifulSoup(html, 'html.parser')

6) 게시글 목록에 해당하는 부분 수집하기

글 목록에서 한 줄에 해당하는 부분 추출

1
row = soup.select(".cNTable > tbody > tr")

행 단위로 반복하면서 제목, 작성자, 작성일 추출

1
2
3
4
5
6
7
8
9
10
11
12
data_list = []

for item in row:
    cols = item.select("td")
    
    item_dic = {
        "제목": cols[0].text.strip(), 
        "작성자": cols[1].text.strip(), 
        "작성일": cols[2].text.strip()
    }
    
    data_list.append(item_dic)

7) 수집 결과를 DataFrame으로 변환

1
2
df = DataFrame(data_list)
df
▶ 출력결과
제목 작성자 작성일
0 0520 연습문제 박수인 2020.05.21
1 5/20 연습문제 엄태우 2020.05.20
2 0520 연습문제 제출 노지형 2020.05.20
3 쇼핑장바구니 과제입니다. 장혁준 2020.05.20
4 2020-05-19 쇼핑몰 목록수집 김수경 2020.05.20
5 2020-05-20 예제쇼핑몰내역 문제 김수경 2020.05.20
6 5.20 과제 제출 임유빈 2020.05.20
7 쇼핑몰_수집_과제02 이민희 2020.05.20
8 0520python 과제제출 송우석 2020.05.20
9 20.05.20 쇼핑몰 장바구니 연습문제 김영광 2020.05.20
10 최재웅 0520 연습문제_수정 최재웅 2020.05.20
11 2020.05.20 연습문제 제출 김태선 2020.05.20
12 연습문제 제출합니다 박경훈 2020.05.20
13 20200520 장바구니 연습문제 전지혜 2020.05.20
14 연습문제 20200520 조은조 2020.05.20
15 0520 문제 김동우 2020.05.20
16 5월 20일 연습문제 김혜조 2020.05.20
17 200520 연습문제 박통영 2020.05.20
18 05/20 쇼핑몰 장바구니 오우진 2020.05.20
19 [20.05.20] 장바구니 이상희 2020.05.20
20 20.05.20 쇼핑몰 장바구니 문제 이유경 2020.05.20
21 예제문제 이원일 2020.05.20
22 0520 연습문제 정은지 2020.05.20
23 0520 연습문제입니다 천승민 2020.05.20
24 0520 연습문제 제출합니다. 송다미 2020.05.20
25 장바구니 데이터 수집 연습문제 제출합니다 오혜진 2020.05.20
26 200519 연습문제 박통영 2020.05.20
27 --------- 쇼핑몰 상품 데이터 수집 예제 마감 --------- 이광호 2020.05.20
28 쇼핑몰 연습문제 (20200519) 조은조 2020.05.20
29 20200519 쇼핑몰 연습문제 전지혜 2020.05.20
Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 수집] 이젠 아카데미 클럽 게시글 수집≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus