selenium을 이용한 crawler – 로또 당첨 판매점 정보
Selenium Web Driver를 이용해서, Session을 유지한 상태에서 정보를 수집하는 Crawler 를 만든다.
https://www.dhlottery.co.kr/store.do?method=topStore&pageGubun=L645 페이지에 들어가면 회차별 1등 배출점을 조회할 수 있다. 회차를 선택하기 위해서는 Select Box에서 확인하고자 하는 회차를 선택하면 되는데, url을 통해서 접근할 수는 없다.
이 때문에 특정 회차의 당첨 판매점을 조회하기 위해서는 최초 페이지에 접속한 뒤 해당 Session을 유지한 채로 회차를 선택해나가는 수밖에 없고 Selenium의 Web Driver를 이용하면 된다.
설치
Selenium
pip install selenium
명령으로 selenium 패키지를 설치한다.
Web Driver
WebDriver를 제공하는 브라우저 사이트에서 사용하고자 하는 Web Driver를 다운로드 받는다.
- Chrome
- 크롤링하는 과정을 Chrome 화면에서 볼 수 있다. 디버깅 하기에 좋은데 GUI 환경이 필요하다.
- http://chromedriver.chromium.org/downloads
- Phantomjs
- GUI 를 사용하지 않고 백그라운드에서 세션을 생성하고 html을 받아오는 만큼 가볍다.
- Selenium 에서는 더이상 지원하지 않는 것 같다. Deprecated
- http://phantomjs.org/download.html
Sample
아래의 프로그램은 동행복권 당첨 판매점 페이지에 접속한 뒤, 262~839 회차를 순서대로 선택하여 1등 배출점 정보를 저장한다.
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Chrome('./chromedriver.exe')
#driver = webdriver.PhantomJS('./phantomjs-2.1.1-windows/bin/phantomjs.exe')
driver.implicitly_wait(3)
driver.get('https://www.dhlottery.co.kr/store.do?method=topStore&pageGubun=L645')
result = []
for i in range(262,840):
path = '//*[@id="drwNo"]/option[text()="' + str(i) + '"]'
driver.find_element_by_xpath(path).click()
driver.find_element_by_xpath('//*[@id="searchBtn"]').click()
html = driver.page_source
soup = BeautifulSoup(html,'html.parser')
locs = soup.find('table',{'class':'tbl_data tbl_data_col'}).findAll('tr')
temp = []
if len(locs) > 2 :
for j in range(1,len(locs)):
loc = locs[j].findAll('td')
shop = loc[1].text.strip()
mode = loc[2].text.strip()
addr = loc[3].text.strip()
temp.append({'shop name':shop,'mode':mode,'location':addr})
#print(temp)
result.append({'round':i,'shops':temp})
import json
print(json.dumps(result,indent=2))
import pickle
with open('lotto_loc.bin','wb') as f:
pickle.dump(result,f)
f.close()