기술문서 14. 03. 06. 작성 파이썬을활용한웹크롤러제작 소속 : 인천대학교 OneScore 작성자 : 최창원 메일 : qwefgh90@naver.com 1. 소개 p.2 2. 라이브러리소개 p.2 3. 샘플예제 p.3 가. 로그인예제 p.3 나. 쿠키활용예제 p.3 다. headless browser(phantomjs) p.3 4. 활용방안 p.8 5. 참조 p.9
1. 소개 가. 웹크롤러란? 1) 웹크롤러란월드와이드웹을탐색하여원하는정보를얻어내거나기억시킨동작을하는컴퓨터프로그램이다. 주로웹페이지크롤링통해직접접근해서정보를빠르게수집하거나자동이메일수집, 웹유지관리를위해사용되기도한다. 검색엔진에서는크롤링을통해정보를찾은후색인과정을통해데이터를수집한다. 나. 웹크롤러제작을위한준비물 1) 웹크롤러를제작하기위해선 HTTP 프로토콜에대한지식이조금필요하다. 제작언어로는어떤언어든상관없지만본문서에서는파이썬 1) 언어를활용하여제작할것이다. 2) 파이썬라이브러리인 BeautifulSoup, requests, selenium등을사용하면웹크롤링을쉽게할수있다. 3) 웹표준을따르는 headless Webkit 2) 이다. 자바스크립트를사용할수있으며 DOM, CSS, JSON, SVG등을컨트롤할수있다. 2. 라이브러리소개 가. requests 3) 1) HTTP 프로토콜조작을유연하게할수있고사용이쉬운파이썬라이브러리이다. urllib2, urllib등여러개로나눠진모듈보다프로토콜조작을쉽고간단하게할수있다. 나. BeautifulSoup 4) 1) HTML이나 XML같은 Markup language 에서 Node의속성이나값들을쉽게가져오거나수정할수있는파이썬라이브러리이다. 다. selenium 5) 1) 브라우저와드라이버로연결되어브라우저에서하는작업들을자동화시킬수있다. selenium은웹인터페이스로동작하며많은브라우저가 selenium과호환이되고 PhantomJS와도호환이된다.
3. 샘플예제 가. 로그인예제 (POST 요청 ) 1) 사전조사 http://hi-bogo.net 로그인후 WireShark에서로그인에요청할 URL과필요한필드를확인. 요청방식 : POST 요청할페이지 : http://hi-bogo.net/cdsb/login_process.php 로그인에필요한정보 : mode=login&kinds=outlogin&user_id= 아이디 &passwd= 비밀번호 2) 샘플소스 (afterlogin.html 에서로그인성공여부를확인할수있다 )
# coding: utf-8 import requests as rq hibogo_url="http://hi-bogo.net/" #LOGIN URL h_login_url="http://www.hi-bogo.net/cdsb/login_process.php" h_id = "yourid" h_passwd = "yourpwd" #hibogo_login function (POST) (mode=login&kinds=outlogin&user_id=qwefgh90&passwd=qwefgh90) def hibogo_login(): post_bd = {'mode':'login','kinds':'outlogin','user_id':h_id,'passwd':h_passwd} rs = rq.post(h_login_url,data = post_bd) h =rs.headers c = rs.content a=open('afterlogin.html','wb');a.write('<!doctype html><head><meta charset=\"utf-8\"></head>');a.write(c);a.close() return True if name ==' main ': hibogo_login() pass 나. 쿠키활용예제 1) 사전조사 Wireshark 를통해 HTTP Request, Response 필드에쿠키값존재여부확인대상도메인 : http://www.kitribob.kr 요청방식 : POST 요청할페이지 : http://www.kitribob.kr/member_k/login_check.jsp 로그인에필요한정보 : callback=dologin_end&loginid=yourid&passwd=yourpassword
2) 샘플소스 # coding: utf-8 # by chang import os,sys,re import requests as rq import string url = 'http://www.kitribob.kr/member_k/login_check.jsp' value = {'callback':'dologin_end','loginid':'onescore','passwd':'11223344'} response = rq.post(url,data=value) h= response.headers bd = response.content cookie = h['set-cookie'] #cookie 값을확인할수있다. print cookie headers= {'cookie':cookie} #cookie를사용하여로그인세션유지가능 #headers 방법 ( 이게더편리함 ) Chrome, IE에서톰캣웹서버에접속할경우클라이언트측에서로그인하기전미리세션 ( 쿠키 ) 6) 을할당받기때문에로그인후서버로부터오는 Response header에는 set-cookie 필드 7) 에서세션값이따로포함되어오진않는다. 파이썬에서로그인을바로요청할경우서버측에서세션값을생성하여준다. 즉 JSESSIONID 를보내지않을경우서버 "set-cookie" 필드를통해쿠키값을전해주게된다.
다. headless browser(phantomjs) 를활용한 Daum 로그인 & 쿠키값핸들링 1) 샘플코드 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0 daum_url="http://www.daum.net" d_id = "" d_passwd = "" def daum_login(): driver = webdriver.phantomjs() driver.get(daum_url) driver.set_window_size(1024,768) idinput = driver.find_element_by_id("id") idinput.send_keys(d_id) # 아이디입력 driver.find_element_by_id("inputpwd").send_keys(d_passwd) # 비밀번호입력 driver.save_screenshot('daum_before_login.png') login_button = driver.find_element_by_id("loginsubmit") login_button.click() # 버튼클릭 idinput.submit() # 요소에서 Submit 호출 driver.get(daum_url) driver.save_screenshot('daum_login.png') driver.get("http://mail2.daum.net/hanmailex/top.daum?") driver.save_screenshot('daum_mail.png') click(), submit() 중하나의함수만시도해보았지만로그인에계속실패하였다. click() 함수는버튼노드를클릭하는행동을하는함수이고 submit() 함수는 form태그에둘러쌓인노드에서호출할수있다. 그후 form태그를찾고 submit을호출하는행동을한다. click(),submit() 의기능상차이는없는것같지만둘중하나가동작하지않을경우두개의함수를같이호출해서해결할수있는것같다.
<Daum 로그인전폼데이터스크린샷 > <Daum 로그인후스크린샷 >
<Daum 메일접속스크린샷 > 2) 샘플코드2 ( 쿠키값핸들링 ) def getkitriphantom(): driver = webdriver.phantomjs() driver.get(testurl3) cookies = {'name':'jsessionid','value':'70ec4b2594509c4703257525a7de6dfa'} driver.add_cookie(cookies) # 쿠키추가 driver.get(testurl2)... for cookie in driver.get_cookies(): # 쿠키정보확인 print "%s -> %s" % (cookie['name'], cookie['value'])... driver.delete_cookie(' utma') # utma 키값삭제 위와같은형태로팬텀 JS 에쿠키값을변경할수있다. 4. 활용방안 많은포탈에선웹 API를제공해준다. 오히려크롤링을위해파이썬을배우는것보다웹 API로다양한동작들을구현하는것이시간이절약될수도있다. 필자는푸쉬알림기능을같이사용하여웹툰업데이트푸시알림, 영화티켓예매, 공지사항크롤링이나해볼생각이다.
5. 참조 https://docs.python-requests.org/en/latest/# (Requests) http://docs.seleniumhq.org/docs/03_webdriver.jsp#selenium-webdriver http://www.crummy.com/software/beautifulsoup/bs4/doc/#beautiful-soup-documentation Web Crawling Lecture with PhantomJS of BoB https://developers.google.com/webmasters/control-crawl-index/docs/getting_started?hl=ko 1) 파이썬은스크립트기반언어로적은량의코드로많은작업을할수있어서생산성이매우높은언어이다. 2) headless Webkit 이란기본브라우저와같은기능을하면서더빠르게작업을처리할수있으며 GUI 를포함하지않은브라우저이다. 3) http://docs.python-requests.org/en/latest, http://01073144993.tistory.com/153 에자세한정보 4) http://www.crummy.com/software/beautifulsoup/bs4/doc/#beautiful-soup-documentation, http://01073144993.tistory.com/154 에자세한정보 5) http://docs.seleniumhq.org/docs/03_webdriver.jsp#selenium-webdriver,http://01073144993.tistory.com/155 에자세한정보 6) http://lng1982.tistory.com/143 7) http://en.wikipedia.org/wiki/http_cookie