반응형
프갤에서 반응보고 점차 수정할 생각인데 시험삼아 올림.
------------

아아...시험삼아 작성해보느 파이썬 강좌.

어차피, 프갤에서 노는 훃들은 엔간하면 나보다 잘할테니
파이썬을 소개하는 것을 목표로 할께.
너무 자세한건 묻지 말아줘. (몰라)


----------------
목표 : 레이싱 모델 사진 모으기 -_-*
세부사항 : 레이싱 모델 갤러리의 임이의 두 게시물 사이의 게시물들에 첨부되어 있는 모델 사진 다운받기.
알고 있어야 하는 것들 : HTML, 정규식


진행은 인터프리터를 켜놓고 따라하면 될꺼야.

우선 게시물 기본 주소를 얻어오자!
( http://gall.dcinside.com/list.php?id=racinggirl&no= )
이건 뭐..프로그래밍으로 하는게 아니니 설명 패스!

그리고 까먹기 전에 아무 변수에나 넣어두자.
알다시피 파이썬은 아무때나 변수를 만들 수 있으니까 필요할때 만들면 돼~

>>> racingGirlUrl = 'http://gall.dcinside.com/list.php?id=racinggirl&no='


파이썬에서 문자열은 '나 "로 감싸면 되고 차이는 없어. 문자열이 여러줄일땐 '''나 """로 감싸면 되고. 뭐 그냥 그렇다구요~

저 주소를 어떻게 쓸꺼냐면, 주소 뒤에 게시물 번호만 바꿔서 for로 돌리는거야..

>>> for no in range(170710, 170720):
>>>     print racingGirlUrl + str(no)


웁스, 차근차근 설명하려 했는데 단번에 너무 많은게 나와버렸네.
 * for
 * range
 * 들여쓰기
이정도가 저거에서 볼만한 게 아닌가 싶네.

# 들여쓰기
우선 들여쓰기부터 보면, C나 자바는 함수나, for, if등 구역을 나눌 때 {}를 사용하잖아?
그런데 {}사용하면서도 사람들이 들여쓰기도 다 하잖아. 그래서 파이썬은 {}를 안쓰고 그냥 들여쓰기를
구역 구분으로 사용해.
{}가 컴퓨터를 위한거고 들여쓰기가 인간을 위한 것이었다면 파이썬은 그냥 들여쓰기만 사용해서 컴퓨터와 인간이 같은걸 보게 하는거지.

# for
파이썬에서 for문은 시퀀스 자료형 탐험용이라고 보면 될 것 같아.
그러니까...
for A in B: 라고하면 B는 시퀀스 자료형 오는거고 A는 우리가 하니씩 받을 변수가 되는거지.

아, 그리고 if, while, for등의 끝에는 :를 붙여줘.

# range
range는 주어진 숫자 사이의 리스트를 만드는 함순데.
range(10)하면 [0,1,2,3,4,5,6,7,8,9]가 되는거고
range(5, 10)하면 [5,6,7,8,9]가 되는거고, 막 이래.

# 기타
print는 화면 출력, str은 문자열로 변경.
문자열끼리 연결할때는 +로 연결해주면 되는거야~


자자. 이제 주소도 생성했으니 게시물 속 알맹이를 얻어와야지!
파이썬은 기본으로 제공되는 모듈이 참 많은데 그중에 urllib라는게 있어.
모듈을 불러오는건 두가지 방법이 있는데 그건 그냥 넘어가고.
모듈 불러오기!

>>> import urllib

모듈 불러오고 하는건 생긴게 자바랑 비슷하게 생겼더라고.
아무튼 저 모듈에 urllib.urlopen이란 함수가 있는데 url에 연결해서 파일 오브젝트를 넘겨줘..

우리가 필요한건 아까 그 for문에서 만든 주소니까 거기에 추가하면 되겠지.

>>> for no in range(170710, 170720):
>>>     url = racingGirlUrl + str(no)
>>>     f = urllib.urlopen(url)


파이썬이 스크립트 언어라서 좋은게, 모듈이나 클래스 등의 변수, 메소드 등이 뭐가 있나 모르겠으면
dir해보면 대충 알 수 있어. 이게 참 좋더라.

>>> dir(f) 해보면 대충
['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close','fileno', 'fp', 'geturl', 'headers', 'info', 'next', 'read','readline', 'readlines', 'url']


이런식으로 나올꺼야.
뭐..이름만 나오니까 메소든지 변순지는 알 수 없지만...대충 감은 오잖아?

>>> f.read()   를 하면 아까 읽어들인 페이지의 HTML이 좍~ 출력되겠지-_-
근데 이렇게 하면 for문이 끝나고 마지막에 남은 f의 내용만 본거니까 나머지도 다 보기위해 이것도 for문으로 넣자.

>>> for no in range(170710, 170720):
>>>     url = racingGirlUrl + str(no)
>>>     f = urllib.urlopen(url)
>>>     html = f.read()

아무튼 게시물의 html도 읽어왔으니 이제 사진 주소를 찾아야지!

이것도 코딩으론 모르겠고. 손으로 직접-_-;
대충 html을 보니까.. http://image.dcinside.com/download.php로 시작하는걸 받으면 되겠네.

이제 정규식을 쓰자고.
파이썬 정규식 모듈은 re야.
(모듈 이름 쓰기가 얼마나 귀찮았으면 두자로 했을까. 게으른 사람들 같으니-_-;)

>>> import re


뭐..정규식 모듈이 해주는게 이것저것 있지만 우리가 필요한건 문자열에서 원하는 문자열만 뽑아내는거니 그것만 보자구.
(아까 말했듯, dir(re)를 해보면 re 모듈에 들어있는 클래스, 함수 등을 볼 수 있다오~)

우리가 찾는 함수는 이것! re.findall

아 근데 이 함수 인자가 어떻게돼더라...잘 모르겠을 땐
>>> help(re.findall)  해보면 대충 설명이 나오지.

내가 사용할 정규식은 http://image.dcinside.com/download.php[^']+ 이거야.
(정규식에 대한 설명은 패스.)

합쳐서 아까 그 for문에 넣어주면

>>> for no in range(170710, 170720):
>>>     url = racingGirlUrl + str(no)
>>>     f = urllib.urlopen(url)
>>>     html = f.read()
>>>     imageUrlList = re.findall("http://image.dcinside.com/download.php[^']+", html)


이렇게 되겠다. 하하 이제 사진 주소들도 얻어왔으니 다운받아서 저장하는 것만 남았군.

파이썬 기본 자료형에 리스트라는게 있는데, 뭐 이름에서도 알 수 있듯 시퀀스 자료형이야.
리스트의 문법은 []로 감싸는거고,
[]는 빈거 [1]는 1이 있는 리스트, [1, 'bob'] 이런 1이랑 'bob'이 있는 리스트. [1, 'bob', ['gopa']] 이건 리스트 안에 리스트가 있는거.

이 얘길 갑자기 왜하냐면 방금 findall하면 넘어오는게 찾은 주소들의 리스트거든.
우리가 하려는건 받은 리스트를 순서대로 돌면서 그 주소의 사진을 urlopen으로 열어서 내 컴퓨터에 저장하는 것.
여태까지 했던거의 반복이니까 설명 없이 바로 작성할께.

>>> fileNo = 0
>>> for no in range(170710, 170720):
>>>     url = racingGirlUrl + str(no)
>>>     f = urllib.urlopen(url)
>>>     html = f.read()
>>>     imageUrlList = re.findall("http://image.dcinside.com/download.php[^']+", html)
>>>     for url in imageUrlList:
>>>         contents = urllib.urlopen(url).read()
>>>         file(str(fileNo)+'.jpg', 'w').write(contents)
>>>         fileNo = fileNo + 1


이정도쯤 되겠네.

쓰면서 for문 안에껄 함수로 빼낼껄. 하는 후회를 하긴 했는데, 뒤늦게 생각난거라 고치기가 귀찮네.

완성 소스
-----------------------
import re
import urllib
fileNo = 0
racingGirlUrl = 'http://gall.dcinside.com/list.php?id=racinggirl&no='
for no in range(170710, 170720):
        url = racingGirlUrl + str(no)
        f = urllib.urlopen(url)
        html = f.read()
        imageUrlList = re.findall("http://image.dcinside.com/download.php[^']+", html)
        print imageUrlList
        for url in imageUrlList:
                print fileNo
                contents = urllib.urlopen(url).read()
                file(str(fileNo)+'.jpg', 'w').write(contents)
                fileNo = fileNo + 1


-----------------
아~ 레모들 이쁘네~

간단한 것 몇가지 추가하자면,
파이썬에서 주석은 #로 시작하면 되고,
html 파싱해서 뭐 찾고 그러는거면 파이썬엔 beautifulSoap이란걸 많이 쓰더라. 편해.


----
이랬음 좋겠다 저랬음 좋겠다 글올려줘~

출처: DC프벨
반응형

'Python' 카테고리의 다른 글

python 연습  (0) 2007.08.02
py2exe  (0) 2007.07.09
IRonPython 1.0 릴리즈  (0) 2007.06.16
Posted by Real_G