본문 바로가기
Study/파이썬

[Python] 웹툰 크롤러

by 투말치 2020. 5. 31.

목차

    반응형

    1. 조건

    - 해당 웹툰 제목으로 폴더 만들고, 그 안에 회차 별로 폴더를 만들어서 회차 별 이미지 저장

    - 한 페이지에 있는 웹툰 전체 회차 가져와서 저장하기(10개)

    => 웹툰 크롤러를 실행한 결과화면이다.

     

     

    2. 코드 설명

     

    (1) 웹툰 제목으로 폴더 만들기

    from bs4 import BeautifulSoup
    import urllib.response
    import urllib.request
    import requests
    import os
    
    
    html = urllib.request.urlopen("https://comic.naver.com/webtoon/list.nhn?titleId=726214&weekday=tue")   #가져올 웹툰 url
    result=BeautifulSoup(html.read(), "html.parser")
    
    
    
    search=result.find("div", {"class", "detail"})   #웹툰 제목 가져오기
    title_a=search.find("h2").get_text()
    title_b=search.find("span").get_text()    #작가 이름 들어감
    title=title_a.replace(title_b, "")    #웹툰 제목에서 작가부분 없애기 위한 과정
    title=title.strip()   #제목 공백 제거
    print(title)
    
    os.mkdir(title)   #웹툰 이름으로 폴더 만들기
    os.chdir(title)

    먼저 크롤링할 웹툰 URL을 가져온다.

    웹툰 제목을 가져오기 위해 F12를 눌러서 태그를 분석한다.

     

    분석한 결과 웹툰 제목이 class 속성의 값이 detail인 div 태그 안에 있어서 find함수로 찾아준다.

    찾은 결과에서 h2태그 안에 있는 텍스트만 빼준다. 

    그러면 많은 공백, 웹툰 제목, 웹툰 작가 이름이 추출된다.

    거기서 웹툰 작가 이름을 빼기 위해 replace함수를 이용한다.

    그 후에 제목부분의 많은 공백을 제거한다. 그러면 title에는 웹툰 제목만 저장된다.

    다음에는 제목으로 폴더를 만든다.

     

     

    (2) 회차로 폴더 만들기

    search=result.findAll("td", {"class", "title"})  #회차 제목 가져오기
    epi_list=[]  #회차 이름 리스트
    epi_url=[]   #회차 url 리스트
    
    index=0
    for e in search:  #회차 이름으로 폴더만들기
        epi_list.append(e.get_text(" ", strip=True))
        epi_url.append(e.find("a").get('href'))  #회차 url 가져옴
        os.mkdir(epi_list[index])
        index+=1

    회차는 class 속성이 title인 td 태그에 있기 때문에 그 태그를 찾아준다.

    회차 이름을 get_text함수를 이용해 epi_list에 추가한다.

    회차 url을 따로 저장해야 회차 이미지를 가져올 수 있기 때문에 a태그의 href 값을 epi_url 리스트에 저장한다.

     

    (3) 이미지 가져오기 전 밑작업

    opener=urllib.request.build_opener()   #이미지 다운로드 막히는 거 가능하게 해주는 코드
    opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
    urllib.request.install_opener(opener)

    나중에 urllib.request.urlretrieve를 사용해서 이미지를 가져오라고 하면 오류가 나기 때문에 다음 코드를 추가해준다.

     

    (4) 이미지 다운로드

    epi=0
    for u in epi_url:
        src_list=[] #이미지 태그 src를 저장
        image_list=[] #진짜 이미지 url 저장(썸네일 제외한 웹툰 이미지 링크만 저장하는 리스트)
        html = urllib.request.urlopen("https://comic.naver.com"+u)   #해당 회차 url 가져옴
        result=BeautifulSoup(html.read(), "html.parser")
        search=result.findAll("img")
    
        for s in search :
            src_list.append(s.get('src'))
        
        for i in range(0, len(src_list), 1) :
            text="image-comic"     #웹툰 이미지 src에는 "image-comic"이 포함되어 있어서 해당 문자열을 포함하는 이미지 주소를 image_list에 넣어줌 
            src_string=str(src_list[i])
            if text in src_string :
                image_list.append(src_list[i])
            index+=1
         
        
        index=1
        for i in image_list :
            path=epi_list[epi]+"/"
            urllib.request.urlretrieve(i, path+str(index)+".jpg")  #이미지 다운로드
            index+=1
    
        epi+=1  
    

     

    우선 해당 회차의 url로 가기 위해 아까 저장한 epi_url을 이용한다. 

    회차 페이지를 파싱한 것에서 img 태그를 모두 가져온다.

    img 태그 중에는 웹툰 썸네일, 별점 등이 있기 때문에 웹툰 이미지만 가져오기 위한 과정이 필요하다.

    웹툰 이미지 src에는 "image-comic"이 포함되어 있기 때문에 해당 문자열을 포함하는 이미지를

    image_list에 추가해준다.

    이미지는 웹툰회차/번호.jpg로 저장된다.

     

     

    반응형