뉴비에욤

0x5 Python Tutorials - Web Requests 본문

primalsecurity.net/Python Tutorials

0x5 Python Tutorials - Web Requests

초보에욤 2015. 9. 8. 15:33

이번 포스팅에서는 파이썬을 이용하여 웹 요청을 생성하는 것을 보여줄 것이다. 파이썬에는 웹 요청과 응답을 쉽게 생성하고 파싱하는

모듈이 존재한다. (httplib, Mechanize, Beautiful Soup, and urllib/urllib2) 좌측의 모듈을 설치하고 각 모듈의 기능을 한번 테스트해보길 바란다.

 

 

웹 요청 생성

 

아래 사진은 로컬에서는 파이썬을 통해 돌아가는 "SimpleHTTPServer" 서버에 대하여 요청을 생성하는 예제 코드이다.

 

* 좌측 커맨드 창 : 웹 요청 생성 및 응답 출력

* 우측 커맨드 창 : Python - SimpleHTTPServer 실행 

 

 

 

HTML 파싱

 

이제 웹 요청을 생성할 수 있게 되었으니 응답되어 오는 HTML을 파싱하는 모듈을 알아보도록 한다. "BeautifulSoup" 모듈은 HTML 태그를 기반으로 하여 HTML 파싱 작업 시 큰 도움이 되는 모듈이다. 아래 사진은 몇몇의 HTML 파싱을 수행하는 예제 코드이다.

 

* title = "Directory Listing For"

* body = request에 대한 response 내의 body

* iframe = 페이지에서 iframe 태그 사용하지 않음

* parsed = request에 대한 response 전체 내용

 

* paragraph = parsed.find_all('p') 결과 = 페이지에서 p 태그 사용하지 않음

* paragraph = parsed.find_all('h2') 결과 = "[<h2>Directory listing for /</h2>]"

 

 

 

실제 웹 서버 대상

 

코딩을 하다 보면 꽤 많은 요청을 보내야 하는 웹 페이지를 볼 수 있다. 이런 경우에 파이썬 스크립트를 하여 요청을 자동화 할 수 있다.

내가 찾은 웹 페이지 중 하나는 "iplist.net" 이라는 페이지인데, 해당 페이지는 주어진 IP 주소에 대한 도메인을 보여준다.

 

파이썬 스크립트를 실행하기 전에는 2가지를 고려해야 한다.

1. 요청하고자 하는 URL 주소의 구조

2. 요청에 대한 응답에서 어떤 부분을 파싱해야 하는지

-  파싱을 위해 HTML 태그를 사용할 수도 있지만, 정규식을 사용해야 할 수도 있음

 

 

"iplist.net" 주소의 구조는 http://iplist.net/<ip>와 같이 매우 심플한 형태이다. 따라서 대상으로 하는 IP 주소를 입력받거나 파일로부터 읽은 뒤 반복문을 통해 위 주소와 합쳐 요청을 수행할 수 있다. 이제 요청을 생성한 다음 소스 코드내에서 어떤 부분을 파싱해야 하는지 봐야 한다. 아래 사진의 예제에서는 "<h2>domain_name</h2>" HTML 태그를 파싱할 것이다. 응답되는 페이지 내에서 원하느 부분을 파싱하기 위해 "BeautifulSoup" 모듈을 사용할 것이다. 아래 코드에서는 응답 페이지에서 도메인을 추출한 뒤 바로 STDOUT(표준 출력)으로 출력할 것이다.

 

 

참고로 "Firebug" 라는 툴이 있는데, 해당 툴은 웹 애플리케이션의 코드를 분석할 때  꽤 도움이 되는 툴이다. 어찌되었든 아래 사진을 보면 파란 타원형 박스 안에 "linkd-in.com"을 볼 수 있는다 해당 부분이 바로 위 코드에서 파싱한 결과의 일부인 "<h2>linkd-in.com</h2>" 이다.

 

 

 

 

 

이런 작업을 통해 웹 페이지 요청에 대한 응답을 파싱할 수 있다. 응답되는 내용을 살펴보고 어떤 부분을 STDOUT(표준 출력)에 출력할 것 인지 결정하면 파싱 작업을 수행하면 된다.  아래의 링크는 "Primal Security"에서 작성한 "iplist.net" 도메인에서 좀 더 많은 정보를 파싱하는 스크립트이다.

https://github.com/primalsecn/python_code/blob/master/iplist.py

Comments