반응형

포스팅하기에 앞서..

6월부터 조금조금씩 쓰기 시작해서 벌써 11월이다.

나의 게으름에 이마를 탁친다.. 

이제 여덟번째 포스팅... 

조금만 더 부지런 떨어도 일주일에 1개, 한달에 4개, 두달이면 다될 것을 5개월이 넘게 쓰고 앉아 있다니...

다시 한번 마음을 잡고 무소의 뿔처럼.


14-2. 게시물 페이지에서 이미지를 다운받기. 그리고 저장하기.

이전 포스팅 말미에서 설명했지만 웹 브라우저가 이미지를 표시하는 것은 

http 프로토콜 통신 이용해 클라이언트가 서버에 요청하고 서버가 클라이언트에 응답하는 과정이다.

어떤 이미지가 어디에 있는지(어떤 URL을 갖는지)는 

서버의 응답 내용 중에 포함되어 있었다. 


이 말은 우리가 만드는 웹 크롤러도 서버와의 통신을 통해 응답받은 내용중에서 

이미지를 포함한 여러 리소스의 위치, URL를 알수 있다는 뜻이며 

당연히 클라이언트 프로그램에서 리소스를 다운받을 수도 있다는 뜻이다.


응답한 페이지의 내용 중에서 이미지의 URL을 찾아내보자.


소혜갤러리의 630655번호의 게시물에서 

(http://gall.dcinside.com/board/view/?id=kimsohye&no=630655&page=1)

에서 짤방의 URL 을 찾아내보자.


텍스트 에디터 툴을 이용해서도 찾을려면 찾을 수 있겠지만 

일부러 사서 고생할 필요는 없으니 웹브라우저에 기본적으로 탑재되어 있는 기능을 이용해서 

편하게 찾아보자. 


요즘 느끼는 것이 툴의 중요성. 

툴에서 제공하는 편의성이나 기능의 전문성이 

S/W 개발자의 개발 근무 환경의 만족도, 생산성 향상에 크나큰 영향을 끼친다는 것을 

몸소 느끼고 있다.


어쨌든.

개발자 도구 기능을 실행한 모습.


:편의상 A). 


아래 빨간 박스가 짤방 URL 까지의 html 태그 트리구조를 나타낸다.

이건 나중에 쓸때가 있으니. 참고.


현재 게시물 페이지에서 이미지를 다운받을 수 있는 URL를 찾는 방법은 두가지가 있는데 

위의 그림처럼 게시물에 직접적으로 표시되는 짤방의 URL를 따거나

아래 그림처럼 별도로 원본 첨부 파일 리스트를 보여주는 곳에서 짤방 URL를 따는 것이다.


:편의상 B)


서버에서 응답받은 html 문서 내용중에서 짤방 URL를 찾아가기는 아래(B)가 쉽다.

html문서를 파싱하고 크롤링한다는 것은 결국 html 문서를 이루고 있는 태그를 파싱해서 원하는 태그의 정보를 취하는 과정이다.

A)의 경우 아주 일반적인 태그, 그러니까 흔하게 쓰이고 문서 전체에 많이 등장하는 정보덩어리다. 

이러면 우리가 원하는 정보인지 판별하는 과정은 더 깊어질 수 밖에 없다.


하지만 B)는 어떨까.

B는 단순하게 class 속성이 icon_pic 인 li 태그만 찾으면 땡이다.


이제 코드로 짜서 찾아보자.



이 URL를 이용해서 짤방을 다운로드 받을 것이다.

하지만 당장은 저 URL을 웹브라우저의 주소창에 복사해 요청을 해도 아무런 반응이 없다.

이유는 글쎄..

그건 뭐.. 디씨인사이드 서버에서 어떤 로직이 도는 거겠지.


웹브라우저에서는 해당 URL이 걸린 링크를 클릭해서 

이미지 다운로드를 하는데 URL을 주소창에 직접 입력해서 요청하면 안된다? 

그렇다면 우회하면 되지~!!


거창하게 우회하는 방법이라고 하기는 좀 그렇지만...

지금까지 확인해본 내용을 살짝 정리해보면


- A)에서 찾은 URL를 주소창에 복사해서 서버에 요청 해보면 잘 저장된다.

- B)에서 찾은 URL은 짤방 저장이 안되는 것 같다.

- A)와 B)를 보면 각각 viewimage.php와 download.php로 각각 다르다.

php를 잘 모른다면 그냥 적당히 서버에서 돌고 있는 각각의 다른 프로그램쯤으로 생각하자.

- 어차피 둘다 이미지를 클라이언트에 알려주는 것이니 매개 변수만 갖다면 같은 이미지를 얻을 수 있을 것이다.

B)의 URL에서 매개변수로 전달되는 id, no 값을 알아뒀다가 A)의 viewimage.php에 매개변수로 전달하도록 하자.



짤방을 다운로드하기 위해 A)에서 찾은 URL과 B)에서 찾은 URL 모두를 이용하자.


line 15: 게시물 페이지에서 li 태그를 모두 찾는다.

line 17: li 태그를 저장하고 있는 리스트를 순회하면서 

line 18~19: class 속성이 있는지, 있다면 그 값이 문자열 'icon_pic'과 동일한지 판별한다.

동일하다면 그건 짤방 URL을 갖고 있는 것이다. (그림의 B) 경우)

line 20: li 태그에 둘러 싸인 a 태그를 찾고 a태그의 href 속성을 읽어 온다. href 속성은 base_url 변수에 저장되어 있다.

line 21~23: download.php 로는 서버가 짤방을 응답하지 않으니 viewimage.php를 이용한다.

그렇게 하기 위해서 문자열 base_url 에서 

"http://image.dcinside.com/download.php"를 "http://dcimg2.dcinside.com/viewimage.php"로 교체(replace)한다.

line 25~28: a태그는 하이퍼 텍스트로 만들 텍스트를 둘러싸고 있으니 그 텍스트를 다운받을 파일이름으로 정했다.

urllib 모듈과 파싱한 URL을 바탕으로 다운로드 한다.


그 결과로 짜잔!


어떻게 어떻게 파일 저장까지 왔다.

이런 방법으로 게시물에 있는 복수의 짤방도 저장할 수 있을 것이다.


방법론적으로는 크롬이나 기타 웹브라우저에 있는 개발자 도구 툴을 이용해서 쉽게 이미지 URL을 찾아낼 수 있다.

중요한 것은 어떠한 리소스라도 http 프로토콜을 통해 서버와 통신하고 

그 결과로 응답받은 내용을 사용자가 인지할 수 있도록 배치(?)한다는 점을 이해하였으면 좋겠다.


반응형