개발/파이썬 업무 자동화

파이썬 = 웹 페이지 다운로드 하기

이게될까 2024. 2. 23. 01:03
728x90
728x90

웹 페이지 구조!

<li>안에 웹툰의 아이디가 있다.

우리가 필요한 정보는 <a>안에 있고 <a>는 <div>안에 있다.

웹툰을 다운로드 할 수 있도록 만들어 본다!

import requests
from bs4 import BeautifulSoup # 원하는 정보 추출하는 용!
import random
import os # exit 사용
# https://comic.naver.com/webtoon/detail?titleId=725586&no=247&week=fri

days =["mon","tue","wed","thu","fri","sat","sun"]
dic ={}
for i in days:
    url = f"https://comic.naver.com/webtoon?tab={i}"
    res = requests.get(url)
    soup = BeautifulSoup(res.text,"lxml")
    # div 태그 밑에 a를 찾아야 한다.
    print(i)
    #'div.Poster__thumbnail_area--gviWY.Poster__type160x207--EQAM8 > img'
    for j in soup.select('div.Poster__bullet_wrap--VcWFJ > img'):
        print(j)
        subject =j.get('alt') # 웹툰 제목
        number = j.get('src').split('webtoon/')[1].split('/')[0] #id href의 데이터 중간에 있다.
        dic[subject] = number # 저장
        
        
while True:
    for num, i in enumerate(dic,1):
        print(f"{num}.{i}")
    user = input("웹툰을 입력하세요: ")
    if (user == 'q'):
        exit()
    elif user.isnumeric(): #숫자를 입력
        user = int(user)
        if user >=1 and user <=num: # 원하는 범위 내에서 입력
            sel_subject = list(dic.keys())[int(user)-1]# 인덱스는 0부터 시작되는 것 중요1
            print(f"{sel_subject}를 선택하셨습니다.")
            break
        else:
            print("다시 입력하세요.")
    else:
        print("다시 입력하세요")


n= int(input("다운받을 회차를 입력해주세요:"))
f = open(f"{sel_subject}_{n}.html","w",encoding='utf-8')

res = requests.get(f"https://comic.naver.com/webtoon/detail?titleId={dic[sel_subject ]}&no={n}")

f.write(res.text)

print(f"{sel_subject} {n}화 다운로드 완료.")

이거 왜 안될까요...?

 

제시된 코드를 분석한 결과, 몇 가지 잠재적인 문제점을 발견했습니다. 다음은 코드에서 발견된 주요 문제점들과 그에 대한 해결 방법입니다:

웹툰 이미지 URL의 잘못된 선택자: soup.select('div.Poster__bullet_wrap--VcWFJ > img') 부분에서 사용된 선택자는 웹페이지의 구조에 따라 달라질 수 있습니다. 네이버 웹툰 페이지의 구조가 변경되었거나, 제공된 선택자가 정확하지 않을 수 있습니다. 웹 페이지의 현재 HTML 구조를 확인하고 올바른 선택자를 사용해야 합니다.

웹툰 ID 추출 방식: 웹툰의 ID를 추출하는 방식은 웹페이지의 URL 구조에 따라 달라질 수 있습니다. number = j.get('src').split('webtoon/')[1].split('/')[0] 부분은 현재 페이지 구조에 맞게 조정되어야 합니다.

예외 처리 부족: 사용자 입력에 대한 예외 처리가 부족합니다. 사용자가 잘못된 값을 입력했을 때 적절히 처리하는 로직이 필요합니다.

인코딩 문제: 파일을 저장할 때 인코딩 문제가 발생할 수 있습니다. open 함수에 encoding='utf-8'를 명시하는 것은 좋은 습관입니다.

웹툰 페이지 요청: 웹툰 페이지를 요청할 때 requests.get을 사용하는 것은 적절하지만, 해당 페이지에 접근하기 위한 올바른 URL과 필요한 파라미터를 사용해야 합니다.

HTML 파일 저장: f.write(res.text)를 사용하여 HTML 파일을 저장하는 것은 기본적으로 올바르나, 파일을 닫는 f.close() 호출이 누락되었습니다.

이러한 문제들을 해결하기 위해 웹툰 페이지의 현재 HTML 구조를 분석하고, 올바른 선택자를 사용하여 웹툰 제목과 ID를 정확히 추출하도록 코드를 수정해야 합니다. 또한, 사용자 입력에 대한 예외 처리를 강화하고, 파일 작업 시 올바른 인코딩과 파일 닫기를 보장해야 합니다.

ㅠㅠ....

 

728x90