본문 바로가기
Information

[Python] 네이버웹툰 크롤링 - 제목, 링크주소 가져오기

by 정티그로 2021. 5. 29.

파이썬 'BeautifulSoup'을 이용하면 다양한 정보를 얻어 올 수 있다는 것은 이전 시간에 네이버 블로그 글 제목과 링크, 본문을 가져오는 실습을 해보면서 알았다. 이번 시간에는 현재 업로드 중인 '네이버 웹툰' 전체 제목과 링크 주소(URL)를 가져와 보겠다.

 

네이버에는 참 다양한 웹툰이 존재한다. F12를 눌러 개발자도구를 켜서 분석을 시작하겠다.

 

class='list_area daily_all'인 <div>태그 안에 우리가 원하는 모든 정보가 들어있다.

 

그 아래 class명이 'col'인 부분을 확인해보니, 요일 별 웹툰 정보가 들어있다.

 

제일 첫 번째에 있는 것이 '월요웹툰'이다. <li>태그 안을 살펴보면, '신의탑, 참교육, 뷰티풀 군바리' 등 다양한 웹툰이 있다. 'ul - li - div - a'까지 내려오면, 우리가 원하는 제목과 링크 정보가 들어있다.

 

import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
import csv

BeautifulSoup을 이용해 크롤링 하고, pandas를 이용해 데이터를 정리해 csv 형태로 저장할 예정이다. 

 

def select_webtoon():
    main_url = "https://comic.naver.com/webtoon/weekday.nhn"

    headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
    res = requests.get(main_url, headers=headers)
    res.raise_for_status()
    soup = BeautifulSoup(res.text, "lxml")
    
    find_titles = soup.select('#content > div > div')

    for find_title in find_titles :
        col_inners = find_title.select('div > ul > li > a')
        #print('col_inners:', col_inners) 
        for col_inner in col_inners:
            title = col_inner.text
            new_title = re.sub('[-=+,#/\?:^$.@*\"※~&%ㆍ!』\\‘|\(\)\[\]\<\>`\'…》]', '', title)
            link = "https://comic.naver.com/webtoon" + col_inner['href']
            print('-'*50)
            print('title :', new_title)
            print('title :', link)
            f.write(new_title + "," + link + "\n")
            

네이버 만화 메인 페이지의 링크를 main_url에 담았다. 이곳에서 우리가 원하는 정보를 얻을 수 있기 때문이다.

 

find_all(), find()를 이용하지 않고, select()와 select_one()을 이용해보았다. for문을 이중으로 사용한 이유는 첫 번째 for문에서 요일별로 웹툰을 가져오고, 두 번째 for문에서 가져온 요일별 웹툰을 하나씩 가져와 제목과 링크 주소를 저장하는 형태이다. (말로 표현하려니까 은근히 힘들다.)

 

 

title을 그냥 저장하지 않고, new_title로 정규식을 거친 이유는?

웹툰 제목 안에 '쉼표(,)'가 나오면 안된다. csv파일로 저장 시 쉼표(,)를 기준으로 데이터를 나누기 때문이다. 위에 보이는 '곱게 키웠더니, 짐승'이라는 웹툰은 쉼표(,)가 존재한다. (이것 외에도 몇 개 더 있었다.)

 

쉼표와 같은 특수문자를 없애기 위해 정규식을 사용했고, 특수문자가 없어진 제목을 'new_title'에 저장했다. 그 후 저장하니, 원하는 대로 데이터가 저장되었다.

 

 

다시 이어서 설명을 해보자면, 한 방에 내가 원하는 정보를 모두 가져오면 좋겠지만, 요일별로 묶여 있으므로 이중 반복문을 사용했다. 

 

프로세스를 간략하게 설명해보겠다. 월요웹툰을 통째로 가져온다. - 그 후 하나씩 정보(신의 탑, 참교육, 뷰티풀 군바리, 파이게임 등)를 확인하고, 제목과 링크 주소를 가져와 저장한다. - 월요웹툰이 끝났으면, 화요웹툰으로 넘어간다. - 이것을 일요웹툰까지 반복한다.

 

 

## import ##

f = open('NaverWebtoon_list.csv', 'w', encoding="utf-8-sig", newline="")
writer = csv.writer(f)
df = pd.DataFrame(columns=("제목", "URL"))
writer.writerow(df)

def select_webtoon():
	## 이하 생략
    
def main():
    select_webtoon()
    f.close()

if __name__ == "__main__":
    main()

 

실행 결과
저장된 csv 데이터

처음에는 매우 간단할 줄 알고 쉽게 끝날 것이라 생각했다. 하지만 이중 for문을 사용해 가져와야 해서 약간 애먹었다. 저장된 csv파일을 열어보니, 우리가 원하는 대로 데이터가 잘 저장된 것을 볼 수 있다.

 


 

 

[Python] BeautifulSoup을 이용한 네이버 블로그 크롤링 - 1

뷰티플수프(BeautifulSoup)를 이용해 특정 키워드 검색 후 나온 결과의 네이버 블로그 제목과 URL을 가져올 예정이다. import requests from bs4 import BeautifulSoup from urllib.parse import quote query = "s..

kissi-pro.tistory.com