ClientForm
말 그대로 html 상에 있는 form 을 처리할수 있는 분이다. 아래의 코드를 잠시 보자. 얼마나 간단한가? 이 코드가 할수 있는 일은 정말 막강하다.
ClientForm 을 다운 받은후 “파이썬 루트/Lib\site-packages/ ” 에 ClientForm.py 복사 하시라…
#!/usr/bin/python # -*- coding: cp949 -*- from urllib2 import urlopen from ClientForm import ParseResponse import sys if len(sys.argv) is 1 : print >> sys.stderr , '분석할 URL 을 넣어주세요.' exit(1) response = urlopen(sys.argv[1]) forms = ParseResponse(response) form = forms[0] print form
수행 시켜보면 안다.
수행 예 )) >python form.py http://www.naver.com/
결과 ))
<GET http://search.naver.com/search.naver application/x-www-form-urlencoded
<SelectControl(where=[*nexearch, web, site, webkr, kin, doc, cafeblog, post, article, dic, 100, endic, krdic, jpdic, hanja, image, video, music, news, local,book, shop, mypc])>
<TextControl(query=)>
<ImageControl(<None>=)>
<HiddenControl(frm=t1) (readonly)>
<HiddenControl(sm=top_hty) (readonly)>>
폼의 내용이 분석되어 지는것이 보이는지?? Get 이던 Post 이던 폼이 분석되는 것이다.
우선 뜯어 볼것은 특정 시스템에 로그인 하는것이다. 우선 id 와 패스워드를 입력하면 로그인 되도록 고쳐 보자.
그리고 그 결과를 찍어 보자 ^^
#!/usr/bin/python # -*- coding: cp949 -*- from urllib2 import urlopen from ClientForm import ParseResponse import sys import urllib2 if len(sys.argv) is 1 : print >> sys.stderr , '분석할 URL 을 넣어주세요.' exit(1) response = urlopen(sys.argv[1]) forms = ParseResponse(response) response.close() form = forms[0] form['user_id'] = 'xxxxxxx' form['password'] = 'xxxxxx' request2 = form.click() try: response2 = urllib2.urlopen(request2) except urllib2.HTTPError , response2: pass print response2.geturl() print response2.info() # 헤더정보 print response2.read() # body response2.close()
이 결과를 받아보면 헤더에 cookie 가 있어 이를 가지고 로그인을 한다는 것을 알수 있다.
그럼 쿠키 정보를 어떻게 처리해야 할까 ? ( HTTP 요청을 보낼때 마다 헤더와 함꼐 보내야 한다.. )
이것을 자동으로 처리해주는 모듈이 있으니 ClientCookie 가 되겠다.
헤더에서 주고 받는 쿠키가 자동으로 처리된다. 단지 urllib2.urlopen 대신에 ClientCookie.urlopen 으로 바꾸어
주기만 하면…..
#!/usr/bin/python # -*- coding: cp949 -*- from urllib2 import urlopen from ClientForm import ParseResponse import sysimport urllib2 import ClientCookie if len(sys.argv) is 1 : print >> sys.stderr , '분석할 URL 을 넣어주세요.' exit(1) request = urllib2.Request(sys.argv[1]) response = urlopen(request) print response.info() # 헤더정보 forms = ParseResponse(response) response.close() form = forms[0] form['user_id'] = 'xxxxxx' form['password'] = 'xxxxxx' request2 = form.click() try: response2 = ClientCookie.urlopen(request2) except urllib2.HTTPError , response2: pass print response2.geturl() print response2.info() # 헤더정보 print response2.read() # body response2.close() request3 = ClientCookie.Request(sys.argv[1]) response3 = ClientCookie.urlopen(request3) print response3.info() # 헤더정보 print response3.read() response.close()
로그인 시점에 ClientCookie.Request 나 ClientCookie.urlopen 을 쓰면 ….
나도 모르게 자연스럽게 쿠키를 주고 받아서…. 로그인 이후의 접속 정보가 유지 되면서
많을 것들을 할수 있다.