반응형

퇴근하고 야구보면서 쉬고 있었다.

그러다 와우부터 할까, 블로그 포스팅부터 할까 싶다가

와우를 하면 맘편히 못할것 같아서 포스팅부터 하기러 마음 먹었다.

(Python 3.5 기준)


저번 포스팅에서 일련의 준비를 마쳤다. 

기본적으로 파이썬 설치는 되었다고 보고

PIP가 정상적으로 동작하는지 확인했고 Python 코드를 작성할 에디터도 정해서 설치했다.


이제는 장난감 프로젝트를 진행할 건데 

앞서 이야기 했듯이 DC INSIDE의 김소혜 갤러리를 크롤링 할 것이다.

그러기 위해서는 웹 서버와 일련의 커뮤니케이션 과정이 필요하다.



4. http 요청(Request)과 응답(Response)


우리가 크롬, 인터넷 익스플로러, 파이어 폭스, 사파리 등 웹 브라우저를 사용할 때에

웹 브라우저는 사용자가 입력하는 URL에 따라 해당하는 웹 서버에 웹 페이지를 요청한다.

웹 서버는 그 요청에 따라 URL에 맞는 웹 페이지를 웹 브라우저로 응답하는데 

물론 중간에 DNS를 거치며 실제 서버 주소를 찾고 라우터에 패킷을 던지고 등의 

몇 단계의 과정이 있지만 당장은 우리와 가장 잘 느낄수 있는 부분에 집중하자.




:http 요청과 응답


이때 웹 서버와 웹브라우저가 요청하고 응답받는 과정은 

http 프로토콜(protocol)이라는 일종의 약속 방식에 따라 진행하게 된다.

이런 과정을 거쳐 최종적으로 웹 브라우저는 웹 서버에서 웹 페이지를 응답받고 이를 렌더링하여 화면에 나타낸다.


그래서 크롤러를 만들기 위해서 가장 먼저해야 할 일은 

웹 서버에 웹 페이지를 요청하고 응답받을 수 있게 해야 하는 것이 아닌가 싶다.

이때 http 프로토콜에 따라 요청, 응답받기 위해 파이썬의 표준 모듈에 포함되어 있는 urllib 모듈을 사용할 것이다.


간단하게 웹서버에 http 요청을 하고 응답받은 결과를 살펴볼 수 있는 코드를 작성해보자.



:코드 1.1. http 요청과 응답


우선은 daum 메인 페이지를 http 프로토콜에 따라 요청하고 응답받았다. 

daum 서버로 부터 응답받은 데이터는 response.txt 파일에 저장해두었다. 

현재 파이썬 코드를 작성한 디렉토리에서 response.txt 파일을 확인해보도록 하자.



:response.txt 파일의 내용


우리는 실제로 http 프로토콜이 어떤 과정을 거쳐서 진행되는지 정확히 알지 못한다.

추상화되어 있는 인터페이스에 따라 우리가 반드시 입력해주어야 할 정보를 입력하고 

원하는 동작을 할 함수를 호출하면 urllib 모듈은 입력받은 매개변수에 따라 

내부적으로 적절한 설정과 과정을 통해 daum 웹 서버에 요청을 하게 되고 응답받은 내용을 반환한다.


코드에서 req는 urllib.request.Request형으로 (urllib.request는 이하 생략하고 작성) 

Request 클래스는 URL 요청과 관련한 정보를 담고 있는 추상화된 클래스이다.

http 통신을 하는데 있어서 헤더값을 설정함으로써(User-Agent 값 등) 

특정 브라우저 처럼 행세할 수도 있고 컨텐츠 타입에 따라 bytes 오브젝트를 담아서 사용할 수도 있다.


모질라 파이어 폭스 같은 경우에는 User-Agent를

"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11" 와 같이 나타내고 구분한다고 하니

우리도 header에 User-Agent 값을 동일하게 설정함으로써 웹 서버에는 파이어 폭스에서 접근하는 것처럼

보이게 할 수도 있다.


우리가 호출한 urlopen함수는 urllib.request 모듈에 정의되어 있다.

urlopen 함수는 url를 입력받거나 Request 객체를 입력받는다.

위의 코드에서는 Request 객체 req를 만들어 전달하고 있지만

Request 객체를 만들지 않고 url을 그대로 urlopen 함수에 전달할 수도 있다.


당장에는 간단한 코드로 요청과 응답을 받았지만

다음부터는 바로 http header 정보를 설정해 사용해보도록 하자.


반응형