언어/python

웹툰 이미지 크롤링하기

STUFIT 2020. 11. 25. 13:47
반응형

다음 두가지를 이용하여 네이버에 있는 웹툰의 이미지를 크롤링해보자

  • requests
  • BeautifulSoup
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
import requests
import os
from bs4 import BeautifulSoup
 
#&no=15는 15화를 의미함
 
main_url = 'https://comic.naver.com/webtoon/detail.nhn?titleId=389848&no=1&weekday=wed'
 
res = requests.get(main_url)
print(res.status_code)
 
if res.ok:
    html = res.text
    soup = BeautifulSoup(html,'html.parser')
    #jpg 파일 몇개인지 확인
#     print(len(soup.select("img[src$='jpg']")))
    
    img_url_list =[]
#     $표시는 ~jpg로 끝나는 걸 의미
    for img_url in soup.select("img[src$='.jpg']"):
#         print(img_url)
        img_url_list.append(img_url['src'])
img_url_list
 
 
cs

 if res.ok: 구문을 두어 res가 문제가 없으면 main_url의 주소에서 이미지를 가져온다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# img 디렉토리를 생성
# img 디렉토리가 없으면 생성하라는 명령
if not os.path.isdir('navercomic'):
    os.mkdir('navercomic')
 
# img_url_list에 있는 url을 요청해서 image를 다운로드
 
for idx,img_url in enumerate(img_url_list,1):
    print(f'--->다운로드 번호{idx}')
    req_header={
        'referer': main_url
    }
    res = requests.get(img_url, headers = req_header)
#     print(res.ok)
    if res.ok:
        img_data = res.content
        file_name = os.path.basename(img_url)
        with open('navercomic/'+file_name,'wb')as file:
            print(f'파일명 : {file_name} ({len(img_data)})bytes')
            file.write(img_data)
            
cs

위에서 가져온 이미지들을 if not os.path.isdir("만들고싶은 폴더명")에 넣어주도록 한다.

for 구문에서는 가져오는 이미지들에 인덱스를 두어 1번,2번,3번 이미지... 으로 파일 이름을 주어 다운로드를 받는다.

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
36
37
38
39
40
41
42
43
def comicbook(만화제목,회차):
#     for no in range(1,15):
    #no=no
    
    main_url = f'https://comic.naver.com/webtoon/detail.nhn?titleId=389848&no={회차}&weekday=wed'
#     print(main_url)
    res = requests.get(main_url)
#     print(res.status_code)
    if res.ok:
        html = res.text
        soup = BeautifulSoup(html,'html.parser')
 
        print(len(soup.select("img[src$='jpg']")))
    
        img_url_list =[]
 
        for img_url in soup.select("img[src$='jpg']"):
            print(img_url['src'])
            img_url_list.append(img_url['src'])
            
   
    if not os.path.isdir(f'{만화제목}{회차}'):
        os.mkdir(f'{만화제목}{회차}')
 
# img_url_list에 있는 url을 요청해서 image를 다운로드
 
    for idx,img_url in enumerate(img_url_list,1):
        print(f'--->다운로드 번호{idx}')
        req_header={
            'referer': main_url
        }
        res = requests.get(img_url, headers = req_header)
#     print(res.ok)
        if res.ok:
            img_data = res.content
            file_name = os.path.basename(img_url)
            with open(f'{만화제목}{회차}/'+file_name,'wb')as file:
                print(f'파일명 : {file_name} ({len(img_data)})bytes')
                file.write(img_data)
for a in range(1,5):
    print(a)
    comicbook('헬퍼',a)
            
cs

위에서 사용했던 2개의 코딩을 함수(def)로 묶어서 내가 원하는 만화 사이트를 1화부터 원하는 회차까지 한 폴더에 넣을 수 있도록 한다.

 

 

반응형