주의사항 본 자료는 교육용도로만 제작되었음을 알려드립니다. 악용으로 인한 불이익은 절대 책임지지 않습니다.
Python을 이용해서 이벤트를 자동응모해보자.
사용한 프로그램은 다음과 같다.
- Python 3.7 Ver.
- Google Chromedriver.exe 74.0 Ver.
1. 환경구축
먼저 Python 3.7.x 버전을 설치하고, 설치된 Chrome의 버전에 맞춰 Chromedriver를 설치한다.
- 파이썬 설치링크 https://www.python.org/
- Chromedriver 설치링크 http://chromedriver.chromium.org/downloads
파이썬에서 사용하는 모듈로는 Selenium과 BeautifulSoup를 사용하기 때문에 해당 모듈들을 pip로 설치한다.
pip install selenium
pip install bs4
모듈 설치의 자세한 방법은 https://docs.python.org/ko/3/installing/index.html를 참조.
2. 사이트 크롤링
위 사이트의 주소는 https://quiz.sktinsight-supernovaevent.com/TA/Quiz이다.
해당 사이트의 소스를 BeautifulSoup로 크롤링 해보자.
위의 코드에서 실질적인 사이트 소스 크롤링은 다음 부분이다.
이렇게 BeautifulSoup를 이용하여 짧은 코드로 크롤링이 가능하다.
크롤링된 소스들을 통해 해당 사이트의 인자들을 알아낼 수 있는데 주된 동작방식은 다음과 같다.
1. 체크박스의 정답을 체크한다.
2. 정답제출
3. 정답이 맞으면 응모사이트로 이동
4. 정답이 틀리면 오답입니다. 라는 Alert를 띄움.
그래서 Python을 통해 체크박스의 정답을 체크하고 정답제출을 하기위해서 Selenium을 이용한다.
assert "SKT 5GX" in driver.title
#정답선택 spnovaq 숫자변경, label 숫자변경
driver.find_element_by_id("spnovaq2").get_attribute('checked')
driver.find_element_by_xpath('//*[@id="form1"]/div/div[2]/div/div/label[2]/span').click()
driver.find_element_by_id('btnApply').click()
앞서 살펴본 소스를 통해 체크박스는 radio 타입의 spnovaq+숫자라는 id를 가지고 있는 것을 확인했다.
그리고 해당 체크박스 아래에 span 태그의 값이 ::after로 바뀌어야 해당 체크박스의 체크가 정상적으로 이루어지는 것을 확인하였다.
체크를 완료했다면 정답제출을 하기위해 btnApply라는 id의 값을 가진 버튼을 클릭해주면 정상적으로 정답이 제출된 것을 볼 수 있다.
3. 전체 코드
#-*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import requests
path = "Chromedriver.exe의 절대경로"
driver = webdriver.Chrome(path)
site="https://quiz.sktinsight-supernovaevent.com/TA/Quiz"
name="본인의이름"
phone="전화번호"
email="이메일주소"
birth="생년월일 8자리"
req = requests.get(site)
source = req.text
driver.get(site)
soup = BeautifulSoup(source, 'html.parser')
assert "SKT 5GX" in driver.title
#첫 번째 페이지
#정답선택 spnovaq 숫자변경, label 숫자변경
driver.find_element_by_id("spnovaq4").get_attribute('checked')
driver.find_element_by_xpath('//*[@id="form1"]/div/div[2]/div/div/label[4]/span').click()
driver.find_element_by_id('btnApply').click()
#정답제출 후 페이지
driver.find_element_by_id("termAct1").click()
driver.find_element_by_id("termAct2").click()
elem = driver.find_element_by_id("Name")
elem.send_keys(name)
elem = driver.find_element_by_id("Phone")
elem.send_keys(phone)
elem = driver.find_element_by_id("Email")
elem.send_keys(email)
elem = driver.find_element_by_id("BirthDay")
elem.send_keys(birth)
driver.find_element_by_id('btnSave').click()
페이지가 넘어가게되면 개인정보활용 동의 체크박스 2가지와 본인의 개인정보 입력 폼이 나오는데,
정답제출 페이지와 마찬가지로 정답제출 후에 나오는 페이지의 각각의 id 값으로 계산하여 앞서 선언한 본인의 개인정보를 제출한다.