HTTP
먼저 HTTP는 클라이언트와 서버 사이에 이루어지는
요청/응답(request/response) 프로토콜이다.
쉽게 말해 컴퓨터가 서로 통신하는데 사용되는 것이 HTTP 프로토콜이라고 생각하면 된다.
만약 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지나 이미지 정보들을 요청하면,
서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다.
여기서 요청과 응답이라함은 HTTP Request와 HTTP Response를 뜻한다.
HTTP Request
먼저 클라이언트가 서버에게 특정 데이터를 보내달라고 요청하게 되면
다시 말해
웹사이트의 정보나 이미지 등을 요청하게 되면
HTTP Response
서버는 아래와 같이 응답한다.
즉 이 과정을 통해 우리는
요청에 따른 응답을 받음으로써 정상적으로 웹사이트를 화면에 출력할 수도 있고,
이미지 등을 받아올 수 있는 것이다.
Download Image
이제 이 개념을 바탕으로 우리는
파이썬으로 아주 간단하게
웹툰을 다운로드 할 수 있는 프로그램을 만들 수 있는데
위와 같이 http 요청과 응답을 보낼 수 있는 requests 라이브러리와
원하는 정보를 찾아낼 수 있는 beautifulsoup 라이브러리를 사용하면 된다.
순서는 다음과 같다.
1. 먼저 다운받을 웹툰이 있는 URL에 http 요청을 해서
2. 응답을 받은 데이터를 beautifulsoup 라이브러리를 이용해
다운받을 웹툰 img 태그의 속성 src 부분을 찾은 후,
3. 다시 그 img URL로 http 요청을 해서
응답받은 이미지를 다운로드하고
4. 저장할 폴더에 파일을 저장하면 되는 것이다.
따라서 네이버 웹툰을 다운로드할 수 있는 함수는 다음과 같습니다.
def download(url, savepath):
resp = requests.get(url)
if(resp.ok == True):
html = resp.text
soup = BeautifulSoup(html, 'html.parser')
id_num = 0
header = {'User-Agent':'Mozilla/5.0', 'Referer':'http://m.naver.com'}
# User-Agent : 브라우저 종류
# Referer : 이전 페이지 URL
# Accept-Language : 어떤 언어의 응답을 원하는가
# Authorization : 인증 정보
# https://goodthings4me.tistory.com/140
while True:
try:
# Get img src
img_id_tag = '#content_image_' + str(id_num)
img_tag = soup.select(img_id_tag) # <img src="https:// ...
img_src = findImgSrc(img_tag)
print(img_src)
# Create folder
createFolder(savepath)
filename = savepath + "\\" + str(id_num) + re.compile('(.png|.jpg|jpeg|.gif)').search(img_src[0]).group()
print(filename + "에 저장 중...")
# Download
img = requests.get(img_src[0], headers=header).content # ex) b'\xff\xd8 ...
with open(filename, 'wb') as f:
f.write(img)
id_num += 1
time.sleep(2)
except Exception as ex:
break
추가로
코드를 돌릴 때
403 forbidden 에러가 발생할 수 있는데
이는 headers 값을 입력해주지 않아서이므로
이미지로 http 요청을 할 때에는 headers 부분을 반드시 입력해 보내주어야하며
print(img)
위 코드에서
이미지로 http get 요청을 보내 내용을 확인해보면
저런식으로 바이너리 값을 던져주는데
이 값을 파일로 저장하면 이미지가 저장됩니다.
더 자세한 코드는 아래를 참고해주세요
github.com/insecurity22/Download-websiteimg/tree/master/naver
참고
https://ko.wikipedia.org/wiki/HTTP
'Web' 카테고리의 다른 글
font-face 한글/영어, 두께 (0) | 2022.03.17 |
---|---|
Delete `␍`eslintprettier/prettier (0) | 2022.02.25 |
Media Query 디바이스별 분기점 (0) | 2021.06.05 |
환경 변수 바로 적용 시키기 (0) | 2020.11.30 |
JQuery Ajax Uncaught TypeError: Cannot read property '0' of undefined (0) | 2020.10.21 |