Post List

2017년 7월 23일 일요일

[Python 2.7] 파이썬으로 url 접속하기 (python2.7 버전)

c 언어를 이용해 웹 접근을 하려면 소켓 프로그래밍부터 공부해야한다. 소켓이란 프로그램이 네트워크를 통해 데이터를 주고받는 도구라고 볼 수 있다. 이 소켓을 이용해 HTTP 프로토콜을 구현하고 html 문서를 받는 코드까지 모두 짜려면 머리가 아플 것이다.

그래서 웹기반 모듈(c 언어에선 라이브러리와 같은 의미)이 잘 형성 되어 있는 파이썬을 이용하는 것이 효율적이다. 파이썬은 쉬운 언어에 속하므로 c언어나 다른 언어를 할 줄 알면 금방 습득할 수 있으니 웹 접근을 하고 싶으면 파이썬을 적극 추천한다.

먼저 https://www.python.org/downloads/ 이 링크를 타고 python-2.7.13을 받아봅시다.
받은 뒤 시작메뉴/python2.7/IDLE (Python GUI)을 실행시키자.


그 뒤에 File/New File 을 눌러 파이썬 코드를 작성하는 파일을 만든다.

한번 원하는 페이지의 html 파일을 받는 코드를 붙여 넣어 봅시다.
1
2
3
4
5
6
7
import urllib2
url = 'https://www.google.co.kr/'
request = urllib2.Request(url)
data = urllib2.urlopen(request).read()
print data
cs
위를 실행하면(키보드의 F5를 누르면 됩니다) GUI 창에서 코드가 실행되고 해당 html문이 짜르륵 출력된다.
아무리 봐도 코드가 정말 간단하다.

하나씩 봅시다.
1. urllib2란 url을 다루는 함수들을 모아둔 모듈이다. 이 모듈을 사용하려면 위와 같이 
import urllib2라고 작성하면된다.
2. url 변수에 원하는 사이트의 url 문자열을 입력 후
3. urllib2 모듈 내에 정의된 Request함수를 실행. 이때 반환 값을 request에 저장!
4. 여기서 urllib2의 urlopen 함수를 사용하면 해당 url에 접속하여 서버에서 제공하는 데이터를 받을 수 있다. 이 데이터를 읽으려면 read 함수가 필요함
6. data를 출력!!!


그러나 출력문이 매우길고 가독성이 힘들다...
따라서 파일로 저장 후 웹브라우저로 보는 것이 좋으므로 파일 저장 코드를 추가해보자.

1
2
3
= open("response.html","w")
f.write(str(data))
f.close()
cs

1. 파이썬에 내장된 open 함수를 통해 respone.html 파일을 write 모드로 연다.(파일이 없으면 자동 생성됨)
2. f에다 받아온 html문이 저장된 data를 write 함수를 통해 적는다.
3. 다 적었으면 write 모드를 끝낸다.


간단한 코드로 web에 접근 하는 방법을 봤다. 다음엔 이를 좀 더 활용해 크롤러를 만들어 봅시다!!

2017년 7월 12일 수요일

포트포워딩 설정

공유기를 이용해 인터넷을 사용하는 경우
고정 IP가 아닌 공유기가 할당해주는 IP를 쓴다.
그로 인해 서버를 운영하고 싶은 경우 포트포워딩을 설정해줘야한다.

예를 들어 111.11.11.11의 IP주소를 공유기가 가지고 있으면(이게 외부 IP)
공유기에 연결된 pc는 192.0.0.1이라는 IP주소를 공유기에게 할당받게 된다. 이를 내부 IP라고 한다.

이 경우에!! 111.11.11.11의 주소로 client가 접속하게 되면 공유기에 연결이 되지, 공유기에 연결된 pc의 서버에 연결이 되지 않다 ㅠㅠㅠㅠ

포트포워딩이란 외부 IP의 특정 포트로 클라이언트가 접속시 공유기가 특정 내부IP를 가진 pc의 서버로 연결해준다.
예를 들어 111.11.11.11:80(외부IP) <=> 192.0.0.1:80(내부IP) 이런식으로 포트포워딩을 할 수 있는데 만약 외부IP의 80번 포트로 데이터가 들어오면 공유기는 바로 192.0.0.1이라는 IP를 가진 pc의 80번 포트로 데이터를 보내준다는 것이다.



본론으로 들어가 포트포워딩을 하려면 공유기 IP를 주소창에 입력해주면 설정 창이 뜬다. 거기서 설정에 들어가 입력해주면 되는데 이건 구글링하면 엄청 많이 나오므로 생략한다. 문제는 이렇게 했음에도 불구하고 핸드폰으로 111.11.11.11:80을 들어가도 내 pc의 서버에 접속이 되지 않는 경우가 발생했다...

열심히 찾아본 결과!!! 공유기에서 특정포트로 데이터를 보내준다 해도 내 pc의 방화벽이 그 포트로의 데이터 출입을 막고있는 것이었다. 즉 pc의 방화벽도 설정을 바꿔줘야 한다.
이는 구글에 방화벽 인바운드 설정을 검색하면 상세히 설명되있다.
링크 : http://m.blog.naver.com/zeboll/20132849369

2017년 7월 10일 월요일

http 통신을 감독할 수 있는 Fiddler (트래픽 캡쳐 프로그램)

Fiddler 다운 링크 :
https://fiddler.kr.uptodown.com/windows

Fiddler

피들러는 http 통신이 pc내에서 오고가는 것을 모두 그대로 보여주는 프로그램이다. 단순히 통신이 오고가는 것(트래픽)을 보는 용도로 쓸 수 있지만 아래와 같은 용도로도 사용할 수 있다.

1. http traffic 캡처기능을 통해 프로토콜의 형식을 알아볼 수 있다.

 예전에 c++의 소켓 프로그래밍으로 직접 http 통신을 하려 했었다. 프로토콜의 방식과 원리를 알려주는 블로그나 싸이트들은 많았지만 정확한 프로토콜의 형식, 어떤 데이터를 어떤 문법에 맞춰 보내야하는지 자세히 나온 글을 찾아보기가 매우 힘들었다. Fiddler는 웹사이트의 서버로 제출되는 http의 데이터를 직접적으로 보여주기 때문에 소켓 프로그래밍을 작성하는데 많은 도움이 됐다.

 데이터 보는 방법 :


 1. 먼저 F12 를 눌러 capture traffic 동작을 시작한다. 동작이 진행되면 위 그림 처럼 Capturing 이라고 왼쪽 아래에 텍스트가 뜬다.
 2. 그 후 오른쪽 화면에 Log, Filters, Timeline, Statistics, Inspectors 등등 여러 탭이 있는데 거기서 Inspectors 탭에 들어간다.
 3. 탭에 들어가게 되면 바로 아래에 또 Headers, TextView, SyntaxView 등 여러 탭이 생기는데 거기서 Raw 탭에 들어긴다.
 4. 바로 아래 연한 파란색 화면에 뜬 것이 프로토콜의 데이터이다.

위를 통해 프로토콜에 대해서 공부할 수도 있으며 웹 크롤러를 만들 때 필요한 쿠키 정보나 여러 http의 헤더정보를 위 프로그램을 통해 손쉽게 얻을 수 있어 편리하다.

2. breaking point를 통해 request 요청전 데이터 값을 변조할 수 있다.

이 부분에서는 굳이 Fiddler로 변조를 하지 않고 파이썬의 urllib 모듈을 통해 직접 http의 데를 변경해 요청할 수 있다. 그치만 코드를 작성해야 한다는 번거로운 점이 있어 즉흥적으로 사용할 때 매우 유용한 기능이라 볼 수 있다.

 breaking point 잡는 2가지 방법 :

 1. 상단 메뉴중에 Rules(규칙) 메뉴를 클릭하고 하위 메뉴에서 Automatic Breakpoints클릭, Before Requests 를 선택한다.

 2. F11을 누른다. ( breakpoints를 해체 하려면 shift + F11을 누르면 된다.)


breakpoints를 잡으면 위 그림처럼 좌측 하단에 이상한 빨간 아이콘이 뜨게 되니 참고한다.

 데이터 값을 변조하는 방법 :
 breakpoints를 잡고 나면 모든 트래픽(http 형식으로 서버에 데이터를 요청 하는 것)들이 피들러에 의해 중단된다.
 그러면 사용자가 1.에서 설명한 Inspectors/Raw 탭에 들어가 데이터 값들을 수정할 수 있다.
 수정이 다 끝난 후 화면 중간에 Run to complete이라는 초록색 버튼을 누르면 트래픽이 정상적으로 서버로 보내진다.

[Python 2.7] 파이썬으로 웹의 이미지 가져오기

import urllib2

url = 'url입력'
cookie = 'cookie입력'

request = urllib2.Request(url, None, {'Host': 'Host 주소 입력', 'Cookie': cookie})
data = urllib2.urlopen(request).read()

f = open("img.jpg","wb")
f.write(str(data))
f.close()

---------------------------------------------------------------

여기서 image 파일을 오픈할 때 "w"가 아닌 binary write 형식인 "wb"를 써야한다!!

[Python 2.7] 파이썬에 cv 추가하기

1. opencv 추가하기


지정한 경로\opencv\build\python\2.7\x86폴더에서 cv2.pyd파일을 복사해서 자신의 파이썬 설치경로\Lib\site-packages(보통 C:\Python27\Lib\site-packages)에 붙여 넣는다.
(64비트를 위한 x64폴더가 있지만 Numpy가 32비트라서 문제가 된다. 그러므로 x86을 쓴다)

2. Numpy 설치하기


Numpy 선택 후 아래 파일 다운로드!
numpy-1.10.2-win32-superpack-python2.7.exe

출처: http://speark.tistory.com/9 [많이해라]


소스코드 실행 :


import cv2
import numpy as np

image = cv2.imread("a.png", cv2.IMREAD_COLOR)
cv2.imshow("image",image)
cv2.waitKey(0)

cv2.destroyAllWindows()