오늘은 네이버 웹툰을 다운로드 해볼 예정이다. 네이버 웹툰은 처음 응답받는 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}')
각 이미지마다 하나씩 요청을 보내기 때문에 속도가 느릴수밖에 없다. 이는 비동기 요청을 통해 개선할 수 있을 것이다. 오늘은 "다운로드를 한다" 라는 요구사항은 만족했기 때문에 여기서 마치도록 한다.
'just-coding-it' 카테고리의 다른 글
카카오 로그인을 구현해보자 (0) | 2024.11.19 |
---|---|
파이썬으로 네이버 웹툰을 압축해보자 (0) | 2022.11.22 |
파이썬으로 네이버 쇼핑 리스트를 크롤링하자 (0) | 2022.11.07 |
파이썬으로 카카오웹툰 순위를 크롤링하자 (0) | 2022.11.07 |
파이썬으로 네이버웹툰 순위를 크롤링하자 (0) | 2022.11.06 |