CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·MaClien ·일본산당 ·방탄소년당 ·개발한당 ·자전거당 ·안드로메당 ·이륜차당 ·소셜게임한당 ·육아당 ·나스당 ·AI당 ·디아블로당 ·소시당 ·가상화폐당 ·골프당 ·야구당 ·걸그룹당 ·젬워한당 ·클다방 ·리눅서당 ·IoT당 ·패셔니앙 ·맛있겠당 ·키보드당 ·사과시계당 ·PC튜닝한당 ·캠핑간당 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·배드민턴당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·콘솔한당 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·갖고다닌당 ·이브한당 ·물고기당 ·도시어부당 ·FM한당 ·포뮬러당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·꼬들한당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·영화본당 ·MTG한당 ·소리당 ·노키앙 ·적는당 ·방송한당 ·바다건너당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·패스오브엑자일당 ·라즈베리파이당 ·품앱이당 ·리듬탄당 ·노젓는당 ·달린당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·축구당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·퐁당퐁당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·여행을떠난당 ·터치패드당 ·트윗당 ·창업한당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당 ·윈폰이당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

팁과강좌

PC/모바일 파이썬 강좌? 네이버 웹툰 저장하기 #3 14

2
2012-12-18 08:22:13 190.♡.18.90
케이준감자튀김

주의 사항!


사실 고민을 많이 했습니다. 저작권이 걸린 매체를 가지고 물의를 일으키지는 않을까 해서요.

분명히 밝힙니다. 본 문서는 파이썬 학습에 조금이나마 도움을 주기 위한 목적으로만 작성되었습니다. 수집한 각 웹툰은 저작권이 허용하는 범위 안에서만 이용하십시오. 웹툰의 감상은 웹사이트를 통해 하시기 바랍니다. 이 문서를 보시는 분들의 상식을 믿겠습니다.

 

 

1. HTML 분석하기

다시 한 번 강조합니다. 저는 이 문서를 그저 학습용으로만 제작하였을 뿐이고, 단순히 만화 이미지가 로컬 PC에 저장되는 것 자체만으로는 각 만화에 대한 저작권에 대한 침해가 아니라고 알고 있기에 본 문서를 공개하는 것입니다. 절대 저작권의 범위를 벗어나는 행동은 하지 마시기 바랍니다.

그럼 실제 웹툰 하나를 골라서 HTML을 분석해보도록 하겠습니다. 인기 연재중인 '마음의 소리'를 예로 들도록 하지요. 웹브라우저에 접속해서 주소를 살펴보면,'마음의 소리'의 titleId는 20853인 것을 알 수 있습니다. 그리고 weekday=tue 변수/값 쌍이 추가로 웹브라우저 주소란에 있는 것을 확인할 수 있습니다. 그러나 weekday 변수와 값은 삭제해도 문제가 없습니다.

이제 만화의 각 회차에 접속해 보세요. 그러면 주소에 새로운 변수 쌍인 no=XXX가 생긴 것이 보일 것입니다. 그러므로 네이버 웹툰은 titleId 변수로 각 작품을 구분하고 no 변수로 각 회차를 구분하고 있는 것입니다.

그럼 각 만화의 이미지 태그가 어디에 위치하는지를 알아야 하겠죠? 웹브라우저의 소스 보기 등으로 네이버 웹툰의 소스를 직접 분석해 보아야 합니다. Firefox의 '문서 검사' 기능 등을 통해 HTML 문서의 구조를 보다 손쉽게 파악할 수도 있습니다. 사실 웹툰 이미지에 대해 저작권 보호를 위해 보호 장치를 걸어 쉽사리 웹툰을 퍼갈 수 없도록 제한할 수도 있습니다. 그런 조치를 취할 수도 있지만 굳이 하지 않음을 참 다행으로 생각합니다.

이전 장에서 우리가 만든 프로그램을 통해 웹페이지의 HTML 소스를 다운로드 받아 보기로 하지요.
마음의 소리 691화의 페이지 소스를 다운로드 받는다고 하면,

python gethtml.py "http://comic.naver.com/webtoon/detail.nhn?titleId=20853&no=691" "마음의소리_691.html"

처럼 쓸 수 있겠네요. 문서를 열어 div class=“wt_viewer” 부분을 찾아 봅니다. div 아래에 img 태그가 있을 것입니다. 각 img 태그가 웹브라우저에 그림을 보여주는 역할을 합니다. img의 src 속성을 복사해서 웹브라우저의 주소창에 붙여넣기해 만화의 이미지가 맞는지 확인해 봅니다. 속성은 대략 http://imgcomic.naver.com/webtoon/20853/691/XXXXXXXXX.jpg 가 될 겁니다. 고맙게도 별 제재 없이 만화 이미지를 보여 주는 것을 확인할 수 있습니다. 만일, 이렇게 해서 만화 이미지가 보이지 않는다면 이 문서는 아무 쓸모가 없어집니다.

 

 

2. HTML에서 이미지만! 정규식을 사용하자

앞서 각 회차의 만화는 단순히 img 태그만을 이용해서 보여지는 것을 확인했습니다. 그러면 img 태그 중에서 만화를 보여주는 img 태그만 골라내서 src 부분의 주소를 추출해낼 수 있다면 각 이미지 파일에 대해 손쉽게 접근 가능하게 될 것입니다.

이렇게 하려면 원래 웹브라우저가 하는 것처럼 이 복잡한 HTML 태그를 모두 파싱(parsing)해야 합니다. 그러나 여기서는 정규식을 이용한 문자열 검색만으로도 원하는 결과를 손쉽게 얻어낼 수 있습니다.

정규식(regular expression)에 대해 본 문서에서 모든 것을 설명하기는 어렵습니다. 인터넷에 자료가 많으므로 쉽게 찾아볼 수 있습니다. 여기서는 사용된 구문에 한해 설명을 하도록 하겠습니다. 결론적으로 img의 src 속성을 추출하기 위한 정규식 구문은

<img.+?src="(http://imgcomic\.naver\.com/webtoon/[0-9]+/[0-9]+/(.+?\.(jpg|png|gif)))".*?>

입니다. 처음 보시는 분은 마치 암호와 같아 보일 것입니다. 천천히 설명하도록 하겠습니다.

    - <img 는 당연히 문서에서 'img' 태그가 시작되는 부분을 뜻합니다.


    - .+? 세 문자는 다음과 같은 의미를 지닙니다.
       +  img 다음의 점(.)은 '아무 문자'를 의미합니다. 숫자, 영문자, 한글, 공백 어떤 것이든 딱 '한 글자'를 의미합니다.
      + 점 다음의 더하기 기호(+)는 '1회 이상의 반복'을 의미합니다. 그리하여 .+는 어떤 글자든 한 번 이상 반복되는 것을 의미합니다.
      +  더하기 기호 다음의 물음표(?)는 이러한 문자 매칭이 최소한만으로 이뤄지도록 조정하기 위함입니다.
        앞서 .+가 어떤 문자든 나와도 좋다는 의미라고 하였습니다. 그렇다면 HTML의 <img 이후는 .+가 통째로 삼켜버릴 수 있는 부작용이 있습니다. 그런 건 우리가 원하는 결과 아닙니다. .+?는 단지 img 태그명과 src라는 속성 사이에 붙을 수 있는 공백, 혹은 우리의 목적과 관계 없는 속성 부분만을 걸러내기 위한 장치입니다.


    -  괄호 부분은 캡쳐라고 하는데, 나오는 순서대로 정규식 내부에서 매칭되는 부분의 문자열을 얻어내기 위한 수단으로 사용되거나 괄호 안의 부분을 우선적으로 적용할 것을 의미합니다. 괄호는 세 번에 걸쳐 있습니다. http:// 가 나오는 부분과 /(.+?\.(jpg|png|gif))) 가 그것입니다. 첫번째(바깥쪽) 괄호는 src 속성의 값을 모두 추출하기 위한 것이고, 두번째(중간) 괄호는 파일 이름만을 추출하기 위한 것입니다. 세번째(가장 안쪽) 괄호는 여러 확장자를 융통성 있게 받아들이기를 위해 사용되었습니다.


    - '\.' 처럼 쓴 것은 점이 어떤 문자든 상관 없다는 뜻이 아니라, 정말 '점'으로 사용되기를 원한다는 뜻입니다.


    - [0-9]는 0에서 9사이 어떤 한 숫자를 의미합니다. [0-9] 바로 뒤에 '+' 기호가 붙어 숫자가 1회이상 반복됨을 의미합니다.


    - \.(jpg|png|gif)는 .jpg거나 .png거나 .gif중 어느 하나이면 된다는 뜻입니다.


    - 마지막으로 '.*?>' 부분은 img 태그가 끝나기 전까지 어떤 문자가 있어어도 되고, 없어도 상관이 없다는 말입니다. 다음 태그를 건드리지 않기 위해 ?를 덧붙였습니다.

다운로드 받은 파일에서 정규식이 정말 만화 이미지만 추출하는지 확인해 보도록 하겠습니다.

extractimgs.py

    # -*- coding: cp949 -*-
     
    # 정규식을 사용하기 위한 모듈입니다.
    import re, sys
     
    # html에서 만화 이미지 주소를 얻기 위한 함수
    def extractimgs(html):
        exp = re.compile(r'<img.+?src="(http://imgcomic\.naver\.com/webtoon/[0-9]+/[0-9]+/(.+?\.(jpg|png|gif)))".*?>')
        imgs = exp.findall(html)
        return imgs
     
    # 메인함수
    def main(argv):
        if len(argv) != 2:
            print 'Usage: extractimgs.py <filename>'
            return 1
     
        f = open(argv[1], 'r')
        html = f.read()
        f.close()
     
        imgs = extractimgs(html)
        if len(imgs) == 0:
            print >> sys.stderr, "No images!"
            return 1
     
        for img in imgs:
            print img[0] # full link
            print img[1] # file name
            print img[2] # extension
     
        return 0
     
    # 파이썬은 스크립트 언어이므로 C/C++와 같이 main함수를 먼저 실행하지 않습니다.
    # 본 파일을 실행했을 때 main() 함수가 실행되기 위한 처리를 직접 해야 합니다.
    if __name__ == '__main__':
        sys.exit(main(sys.argv))

정확한 정규식의 표현을 적는 것은 꽤 까다로운 일이지만, 정규식을 코드에 사용하는 것은 어렵지 않습니다.

regexp = re.compile(r'<정규표현식>')   # 정규표현식 선언, 객체로 만듬
imgs = regexp.findall(html)           # html 문자열에서 정규표현식에 부합하는 모든 부분을 img로 리턴



3. 만화 이미지만 저장하기

코드가 올바르게 동작해서 html 문서에서 원하는 만화 이미지의 주소만 얻어낼 수 있었습니다. 이제 각 이미지들을 우리 PC에 저장하는 코드를 작성해야 합니다. 이것은 여러분들에게 숙제로 남겨 두겠습니다. 기존의 urllib2 모듈을 이용해서 각 이미지의 주소에 접속해, 응답 내용을 바로 파일에 쓰기만 하면 됩니다. 이 때 open 함수의 두번째 인자는 'wb'로 바이너리 쓰기를 하게 됨을 잊지 마세요.

 

 

4. 끝마치며

파이썬에 흥미를 느끼신, 프로그램에 갓 입문하신 분들에게 좋은 실습거리일 것 같아 본 문서를 공개하였습니다. '웹툰'이라는 매체는 엄연히 저작권이 있는 매체입니다. 이를 이용한 본 실습은 자칫 흥미는 있을지 모르나 웹툰 작가님들과 여러 관계자분들께 누를 끼치는 행위가 되지 않을까 많이 염려하였습니다.

 

여러 번 밝혔듯 저는 파이썬 학습을 위해 이 문서를 공개하였습니다. 프로그래밍에 대한 순수한 흥미와 호기심만으로 실습을 진행해 주십시오. 이 문서가 전달한 것들은 정말 얕디 얕은 지식에 불과합니다. 이러한 얕은 지식으로 다수에게 누를 끼치는 행위는 삼가하길 간곡히 부탁드립니다.
 

케이준감자튀김 님의 게시글 댓글
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [14]
weever
IP 61.♡.24.158
12-18 2012-12-18 08:45:29 / 수정일: 2017-04-30 08:16:24
·
파이썬 공부하는 중이였는데.. 감사합니다~~
시간 날때 차근히 따라해봐야겠습니다!!
궁금한건 쪽지로 물어도 되겠지요^^?
케이준감자튀김
IP 190.♡.2.13
12-18 2012-12-18 08:47:59 / 수정일: 2017-04-30 08:16:24
·
이메일로 부탁드리겠습니다! cs.chwnam [_at_] gmail.com으로 메일 주세요.
byelife
IP 39.♡.46.17
01-09 2016-01-09 22:40:37 / 수정일: 2017-04-30 22:25:48
·
크샤나님// 앗 저도 궁금한거 물어봐도 될까요??
알약
IP 164.♡.208.28
12-18 2012-12-18 08:56:24 / 수정일: 2017-04-30 08:16:24
·
파이썬 공부해봐야겠네요~ 근질근질 *
무지개우산
IP 211.♡.223.119
12-18 2012-12-18 11:33:00 / 수정일: 2017-04-30 08:16:24
·
감사합니다.. ㅎㅎㅎ
저도 장고로 무엇 좀 만들고 있는데 재미나네요..
newtype
IP 164.♡.106.147
12-18 2012-12-18 14:30:33 / 수정일: 2017-04-30 08:16:24
·
좋은 강좌 정말 감사합니다.
라이크유
IP 223.♡.164.132
12-18 2012-12-18 14:44:27 / 수정일: 2017-04-30 08:16:24
·
아 대학교때 공부하던 파이썬.. 이제 12년이 지났네요. 세월이 빠릅니다.. 좋은 연재 감사합니다. *
메롱
IP 122.♡.136.174
12-18 2012-12-18 20:11:51 / 수정일: 2017-04-30 08:16:24
·
재밌네요.. 잘 따라해 봤습니다.
감사합니다^_^
프플러
IP 180.♡.101.161
12-18 2012-12-18 22:03:08 / 수정일: 2017-04-30 08:16:24
·
고맙습니다. 저도 메일로 궁금한 사항 여쭙겠습니다..
유레카-
IP 210.♡.119.193
12-20 2012-12-20 08:55:49 / 수정일: 2017-04-30 08:16:24
·
상세한 설명 감사드립니다^^
마마마
IP 175.♡.215.202
12-22 2012-12-22 02:29:10 / 수정일: 2017-04-30 08:16:24
·
이건 저작권에 문제가 되는 내용입니다 왜 이런글이 아직도 남아 있는지 이해를 못하겠네요
케이준감자튀김
IP 190.♡.24.66
01-28 2013-01-28 23:47:07 / 수정일: 2017-04-30 10:59:58
·
마마마님//
저작권에 문제가 된다고 말씀하셨는데, 어떤 부분이 문제가 되는지 근거를 들어 정확히 알려주시면 안되겠습니까?

본 강좌가 전달하는 의도는 웹브라우저가 어떻게 HTML 소스를 이해하고 처리하는지에 대해 알려 주는 것이지, 네이버 웹툰을 퍼날라 어딘가로 공유하는 법을 퍼뜨리기 위함이 아닙니다.

더욱이 본 방식은 웹브라우저가 원래 HTML을 처리하는 방법 그대로를 사람이 따라 하는 것입니다. 본 문서가 기록한 방법 자체가 잘못이라고 말씀하신다면 세상의 왠만한 웹브라우저들 모두가 뭔가를 잘못하고 있는 것입니다.

물론 저작권 있는 매체를 함부로 이용하는 것은 잘못입니다. 저는 누차 제 입장을 밝혔습니다. 식칼로 요리를 하든, 범죄에 이용하든 그것은 쓰는 사람의 문제이지 칼의 문제가 아닙니다. 저는 칼의 사용 방법을 조금 흥미 있는 소재에 활용하였을 뿐입니다. 방법을 알고 있어도 그것이 올바른 활용이 아니라면 하지 말아야 하는 것은 당연한 일이고 그것은 쓰는 사람의 문제입니다.

혹 방법 자체가 문제인 경우라면, 어째서 이 문서가 문제인지를 알려주십시오. 조치하도록 하겠습니다
퓨리에
IP 125.♡.210.135
07-15 2013-07-15 14:18:32 / 수정일: 2017-04-30 11:00:11
·
뒤늦게 강좌 잘봤습니다..한가지 사소한 오류는..이 덧글을 다는 시점에서는 웹툰주소의 url이 http://imgcomic.naver.net/webtoon/~~ 이런식으로 .com->.net 으로 바뀐듯 합니다.
계속 No Images 라고 나와서 한참을 헤메다가 html 소스를 열어보고 알게됐네요.
쿠룩쿨룩
IP 211.♡.39.2
06-11 2014-06-11 14:37:55 / 수정일: 2017-04-30 13:01:51
·
강좌 잘보고있습니다. 한가지 질문이 http://imgcomic... 으로 시작되는 웹툰주소에서 urllib2를 이용해 이미지를 다운받을경우 HTTP 403: Access Denied 에러가 나오는데 어떻게 우회하셨는지요? 일반적으로 403은 네이버쪽 서버에서 data scraping등 bot에 의한 파일 다운을 차단하였을경우 나타나는 엘러 코드로 알고있습니다. 여러가지 header문구를 사용해봤지만 403을 우회할수 없네요..
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.