본문 바로가기

Kitri_NCS3기 보안과정/Pyhthon

170321 urllib, urllib2 활용 (pokedex100 data 활용하기)

urllib2는 URL을 가져오는 모듈.

urlopen 함수의 형태로 제공된다. 


import urllib2

response = urllib2.urlopen('http://www.naver.com/')

html = response.read() 


이런 간단한 방법으로 사용이 가능하다.

('http:'뿐 아니라 'ftp:', 'file' 등으로 시작하는 URL에도 사용이 가능하다) 

urllib2는 사용자가 만든 http 요청을 대표하는 request 객체를 흉내낸다.

(가져오고싶은 url을 나타내는 요청 객체를 만드는것이 가장 단순한 형태.) 


* 'urlopen'요청 → 응답객체(file종류) 반환 - 이 응답에 대하여 .read()를 호출 할 수 있다는 뜻



req = urllib2.Request('ftp://example.com/') 

urllib2는 request인터페이스를 이용하여 url체계를 처리함. ftp요청도 위와 같은 방식으로 가능하다.


HTTP의 경우 request로 할 수있는 일이 두가지더 있다. (이 정보는 http 헤더로 전송됨.)

- 데이터를 서버에 보낼 수 있다.

- 데이터나 요청 그 자체에 관하여 서버에 추가 정보를 보낼수 있다.


참고> http://m.blog.daum.net/kimuks/7539016?categoryId=753222

헤더 

기본적으로 urllib2는 User-Agent가 'Python-urllib/x.y' 인데 웹사이트에서 데이터를 제공하고 싶지않을 경우에는 이 정보를 막아버리는 경우가 있다. 하지만 브라우져에게는 제공하기 때문에 이 부분을 이용하여 User-Agent 헤더를 수정하면 파이썬으로 식별되지않고 브라우져로 인식하기 때문에 데이터를 활용할 수 있다.

Request 객체를 만들면 거기에 헤더사전을 건낼수 있다.



헤더의 정보를 headers 변수에 넣고 Request할 때 함께 보낸다



Pokedex100의 데이터를 받아보기위해 헤더를 변경하고 브라우저에 제공하는 데이터를 가져온다.

(다시말하면 브라우저인척 요청객체를 만들어 보내고 데이터를 받아오는것이다. ㅎㅎㅎㅎ)


이제부터 우리가 하려는것은. 원하는 포켓의 이름을 넣고 잠재능력이 높은 포켓몬을 추적하는 코드를 짜는것이다.

먼저 pokedex.com에 들어가면 이런 화면이 있다.


포켓몬의 이름과 잠재능력 , 좌표, 남은시간등이 표시 된다. 이 데이터를 활용하기 위해 소스에 잇는 데이터 파일의 주소를 찾고 Request에 헤더를 변경해서 요청객체를 만들었다.


변경한 헤더로 요청을 보내니 데이터가 돌아왔다.


<pokedex100.com/abcde/data에서 추출한 데이터>


url에서 데이터를 뽑아내는것에 성공했다. 이제 이 데이터를 정제하여 우리의 사용목적에 맞게 만들어 보자.


뽑아낸 데이터들은 json 형식의 문자열 들이다. 


이를 디코드 해서 활용하자.


2017/03/21 - [NCS보안/Pyhthon] - 170321 Json



result에 담겨있는 데이터를 디코드 한다.


데이터를 분석해보니 'a'와 'o' 는 좌표를 나타내고 'n'은 포켓몬의 이름, 'th'는 남은 시간을 의미한다.


이 데이터를 정제해서 '텔레그램' 어플로 보내기로 하자.


텔레그램에서는 봇을 제공한다.


이 봇을 활용해서 정제한 데이터를 출력하는 곳으로 활용했다.


먼저 텔레그램의 botfather 에게로부터 /newbot 으로 나만의 봇을 생성하고 


API(bot id)를 제공받는다.


그리고 bot과 대화방을 생성해 id를 찾아보자.



api.telegram.org/+bot id+/getupdates 를 치고 체팅을 쓰면 아래처럼 로그가 뜬다.

로그 상의 id가 채팅방의 아이디 이다.


pokedex100의 데이타를 메세지로 보내고싶으면 먼저 메세지를보내는 방법을 알아야 한다.


파이썬으로 메세지를 어떻게 보낼까?



urllid2.urlopen()을 사용해서 url을 지정하고 urllib.urlencode()로 메세지의 내용을 작성해서 보낼 수 있다.

bot_id는 우리가 생성한 봇의 API를 따오면 되고, cid는 위의 getupdates페이지에서 확인했던 id 이다.



입력한 hello!가 전송된 것을 확인했다.


이제 모든 리스트를 검사하고 해당하는 내용만 출력하는 반복문을 사용해서 원하는 포켓몬의 데이터를 받아보자


반복문과 조건문안에서 텔레그램으로 메세지를 전송하도록 만들었다.

데이터를 리스트 형태로 만들고 리스트를 모두 검사해 iv>50 로 설정하고 포켓몬의 이름(Snorlax:잠만보)을 입력받아 찾고자 하는 포켓몬만 찾을 수 있도록 만들었다.


다른값들은 모두 그대로 자료형만 맞춰서 사용하면 되지만 'th'에 있는 시간값은 수식이 좀 필요하다.

import time


time.time() 

위의 모듈을 사용해서 th값이 무엇을 나타내는가.(아마 브라우저에 떠있던 남은 시간을 나타내는 것 같다.)


'th'값을 출력해 보니 1490084418000 등으로 13자리 였고

time.time() 을 출력해보니 1490089403.~~~ 소수점 위 10자리로 1000을 곱해 주어야 자리수가 맞는다.


그렇다면 'th'-(time.time()*1000)을 하고 /1000 나누고 /60 으로 나누면 남은 분(min)을 확인 할 수 있을것이다.


 str(((int(data[i]['th']-ct)/1000/60))  

결국 (남은시간 - 현재시간)/1000/60 을 한것이다.




결과 화면이다.

좌표가 뜨지않는다. 아마 주요 포켓몬은 확인할 수 없게 해둔것일까 ? 부엉이포켓몬이나 꼬렛은 좌표가 뜨던데...

어차피 포켓몬고를 하지않기 때문에 아마 쓰지않을듯하다.

이미지의 코드와 결과화면에는 시간이 추가가 안되어있다... (사진바꾸기 귀찮아서 업데이트안함)

'Kitri_NCS3기 보안과정 > Pyhthon' 카테고리의 다른 글

170321 Json  (0) 2017.03.21
170320 파일  (0) 2017.03.20
170320 함수  (0) 2017.03.20
170320 알고리즘 연습문제  (0) 2017.03.20
170317 제어문 (if, while, for)  (0) 2017.03.19