본문 바로가기

just-coding-it

파이썬으로 네이버 웹툰을 다운로드 받아보자

오늘은 네이버 웹툰을 다운로드 해볼 예정이다. 네이버 웹툰은 처음 응답받는 HTML에 모든 이미지 src가 들어있기 때문에 굉장히 쉽게 다운로드 받을 수 있다.

 

시험대에 오를 작품은 호랑이형님 1화이다. 우선 브라우저의 개발자도구로 이미지가 위치한 태그를 찾아보았다.

CSS선택자로는 #comic_view_area > .wt_viewer > img 가 이미지 목록임을 쉽게 얻어낼 수 있었다. 그렇다면 작업계획은 아래와 같이 세울 수 있을것이다.

1. 이미지 목록 얻어내기

2. 각 src에 해당하는 URL로 요청을 보내기

3. 응답받은 데이터를 파일로 저장하기

 

여기에 추가적으로 이미지파일에 요청을 보낼 때, header 설정이 필요하다. 반드시 아래와 같을 필요는 없고 브라우저에서 요청을 보낸 것 처럼 User-Agent값을 전달해줄 필요가 있다.

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36'

 

직접 코드로 작성해보면 아래와 같다.

import requests
from bs4 import BeautifulSoup as bs

def get_html(url):
    response = requests.get(url)
    return response.text

def get_img_urls(html):
    soup = bs(html, 'html.parser')
    imgs = soup.select('#comic_view_area > .wt_viewer > img')
    for img in imgs:
        yield img['src']

def download_img(url, path):
    headers={
      'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    content = response.content
    with open(path, 'wb') as f:
        f.write(content)

if __name__ == '__main__':
    url = 'https://comic.naver.com/webtoon/detail?titleId=650305&no=1&weekday=sat'
    html = get_html(url)
    img_urls = get_img_urls(html)
    for i, img_url in enumerate(img_urls, start=1):
        download_img(img_url, f'./test/{i}.jpg')
        print(f'--complete-- {i}')

각 이미지마다 하나씩 요청을 보내기 때문에 속도가 느릴수밖에 없다. 이는 비동기 요청을 통해 개선할 수 있을 것이다. 오늘은 "다운로드를 한다" 라는 요구사항은 만족했기 때문에 여기서 마치도록 한다.