Hun's Blog

[Python] 웹 크롤링 4 - 네이버 웹툰 썸네일 가져오기 본문

Language/Python

[Python] 웹 크롤링 4 - 네이버 웹툰 썸네일 가져오기

jhk-im 2020. 4. 6. 00:52

참고

파이썬 레시피 - 웹 활용 입문편을 공부하면서 정리한 내용

https://wikidocs.net/36472

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

*urllib 모듈을 활용하여 네이버 웹툰의 썸네일을 찾아서 지정된 폴더에 다운로드한다.

 

urllib ?

URL 작업을 위한 여러 모듈을 모은 패키지이다.

urllib.request -> URL 을 열고 읽는다

   -> urlretrieve() : address 와 저장될 이름을 인자값으로 받아서 해당 url의 이미지 파일을 다운로드하여 저장한다. 

urllib.parse -> URL 구문 분석

urllib.robotparser -> robots.txt 파일 구문 분석을 위함 

 

re?

파이썬의 정규표현식을 지원하는 모듈이다. (Regular Expression)

정규 표현식은 특정한 규칙을 가진 문자열의 패턴을 표현한다. 

가장 단순한 것은 특정 문자열을 사용하요 해당 문자열을 검사하는 것이다. 

ex) 로그 파일에서 특정 에러메시지가 들어간 라인을 찾을 때 정규표현식을 사용하면 쉽게 구현할 수 있다. 

 

os?

운영체제에서 제공되는 기본적인 기능들을 제공하는 모듈이다. 

우분투로 예를들자면 os.makedirs  메소드를 활용하여 디렉토리를 생성할 수 있다. 

 

 

1. 스크립트 작성 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from bs4 import BeautifulSoup
from pprint import pprint
import requests, re, os
from urllib.request import urlretrieve
 
try:
    if not(os.path.isdir('webtoon_image')):
        os.makedirs(os.path.join('webtoon_image'))
except OSError as e:
    if e.errno != errno.EEXIST:
        print("폴더 생성 실패")
        exit()
 
soup = BeautifulSoup(html.text, 'html.parser')
html.close()
 
data_list=soup.findAll('div',{'class':'col_inner'})
# pprint(data1_list)
 
li_list = []
for data in data_list:
#pprint(li_list)
 
for li in li_list:
    img = li.find('img')
    title = img['title']
    img_src = img['src']
 
    title = re.sub('[^0-9a-zA-Zㄱ-힗]','',title)
 
    urlretrieve( img_src, './webtoon_image/'+title+'.jpg')
    print(title,img_src)
 
 
 

 --

1-1 

try:

    if not(os.path.isdir('webtoon_image')):
        os.makedirs(os.path.join('webtoon_image'))
except OSError as e:
    if e.errno != errno.EEXIST:
        print("폴더 생성 실패")
        exit()

 

-> os.path.isdir('디렉토리명') 메소드로 입력된 디렉토리명의 디렉토리가 있는지 판별하여 true/false를 반환한다.

-> if not 이기 때문에 false 일경우 즉, 디렉토리가 없을때 os.makedirs () 메소드로 디렉토리를 생성한다. 

-> os.path.join() 메소드에 경로를 입력하면 해당 경로에 폴더가 생성된다. 

-> 폴더 생성과 같은 작업 시 try:except 으로 예외처리를 해준다.

 

디렉토리 생성

--

1-2

html = requests.get("http://comic.naver.com/webtoon/weekday.nhn")
soup = BeautifulSoup(html.text, 'html.parser')
html.close()

-> 웹 페이지를 열고 html 소스코드를 읽어오는 작업 


data_list=soup.findAll('div',{'class':'col_inner'})

-> col_inner 클래스인 div 태그영역 전부 가져오기 

li_list = []
for data in data_list:  
    li_list.extend(data.findAll('li'))
    ->  제목 + 썸네일 을 담고있는 li 태그 영역을 전부 가져온다. 
->전체 웹툰 리스트에서 제목 + 썸네일 영역을 추출하여 담는다. 

 

 제목 + 썸네일 을 담고있는 li 태그 영역 출력

--

1-3

for li in li_list:

    -> 각각의 li 태그가 담겨있는 리스트를 for문으로 돌면서
    img = li.find('img')

    -> li 태그영역 안에 img 태그영역을 찾는다. 
    title = img['title']

    -> img 영역안에 title 을 찾는다. 
    img_src = img['src']

    -> img 영역안에 src 를 찾는다. 

    title = re.sub('[^0-9a-zA-Zㄱ-힗]','',title)
    -> 이미지 다운로드시 에러해결 
    -> 추출한 제목에서 특수문자가 있을 경우 에러가 발생한다. 
    -> 따라서 추출한 제목에서 특수문자를 다른문자로 변경하거나 삭제하도록 한다. 
    -> re.sub() 메소드를 사용하여 정규표현식을 구현한다. 

        # param1 -> 기준값 
        # param2 -> 치환값 
        # param3 -> 변경할 값 
    -> 변경할 값이 기준값에 속한 값이 아니라면 param2 값으로 치환한다. 



    urlretrieve( img_src, './webtoon_image/'+title+'.jpg')
    -> urllib.request 모듈의 urlretrieve () 메소드를 사용한다. 

    # param1 -> img_src = 이미지의 url

    # param2 ->  './webtoon_image/'+title+'.jpg' -> 확장자가 포함된 파일명 

      -> webtoon_image 폴더안에 있으므로 ./webtoon_image로 시작하여 for문에서 저장한 title 값과 .jpg 확장자를 더해 파일명을 완성시킨다. 

 

이미지 다운로드 디렉토리