ABC 부트캠프

[13일차] ABC 부트캠프_동적 크롤링

ejis 2024. 7. 22. 23:30

 


네이버 연예 공감별 랭킹 뉴스 크롤링

!pip install konlpy
!pip install koreanize-matplotlib # 한글이 깨지는걸 사전에 방지
from urllib.request import urlopen
from bs4 import BeautifulSoup

import re
import time
import pandas as pd
import datetime
from pytz import timezone

import warnings

warnings.filterwarnings('ignore')
# 1) 데이터 프레임 생성
data = pd.DataFrame(columns=['순위', '공감종류', '기사제목', '기사링크', '기사내용', '공감수', '수집일자'])

# 2) 네이버 연예 공감별 랭킹 뉴스 URL 준비
# https://entertain.naver.com/ranking/sympathy 좋아요
# https://entertain.naver.com/ranking/sympathy/cheer 응원해요
# https://entertain.naver.com/ranking/sympathy/congrats 축하해요
# https://entertain.naver.com/ranking/sympathy/expect 기대해요
# https://entertain.naver.com/ranking/sympathy/surprise 놀랐어요
# https://entertain.naver.com/ranking/sympathy/sad 슬퍼요

url_list = ['', '/cheer', '/congrats', '/expect', '/surprise', '/sad']

# 공감별 url 주소 조합하여 크롤링 시작
for n in range(len(url_list)):
    url = 'https://entertain.naver.com/ranking/sympathy'
    url += url_list[n]

    sympathy = 'like'
    if url_list[n] != '':
        sympathy = url_list[n].replace('/', '')
    print(' 수집 중 ...', url, 'sympathy: ', sympathy)

    # 3) url에서 html 가져오기
    html = urlopen(url)

    # 4) html 파싱할 수 있도록 변환
    soup = BeautifulSoup(html, 'html.parser')

    # 5) 네이버 공감별 랭킹 뉴스 정보가 있는 태그 가져오기 -> li class='_inc_news_lst3_rank_reply'
    li = soup.find_all('li', {'class':'_inc_news_lst3_rank_reply'})

    for index_l in range(len(li)):
        # 순위
        rank = li[index_l].find('em', {'class':'blind'}).text

        # 뉴스 제목
        title = li[index_l].find('a', {'class':'tit'}).text

        # 뉴스 내용
        summary = li[index_l].find('p', {'class':'summary'}).text

        # 뉴스 링크
        link = li[index_l].find('a', {'class':'tit'}).attrs['href']

        # 공감수
        temp_cnt = li[index_l].find('a', {'class':'likeitnews_item_likeit'}).text
        # 숫자만 추출 (숫자가 아닌 값은 제거) -> "공감수1,789" -> 1789
        # '^' : not을 의미
        # [A-Za-z] : 대소문자 모든 알파벳
        # [ㄱ-ㅎ] : 모든 한글
        # [A-Za-zㄱ-ㅎ] : 연결해서 사용 가능
        cnt = re.sub('[^0-9]', '', temp_cnt) # 숫자가 아닌 것들을 ''으로 대체

        # 6) 데이터 프레임이 저장
        temp_df = pd.DataFrame({'순위': rank,
                               '공감종류': sympathy,
                               '기사제목':title,
                               '기사링크':link,
                               '기사내용':summary,
                               '공감수':cnt,
                               '수집일자':datetime.datetime.now(timezone('Asia/Seoul'))},
                               index=['순위'])
        data = pd.concat([data, temp_df], ignore_index=True)
        print('Completes of', rank, ':', title)

print('-' * 50)
print(data.info())

data.to_csv('네이버 연예 공감별 랭킹 뉴스 크롤링_20240722.csv', encoding = 'utf-8-sig', index=False)
import matplotlib.pyplot as plt
from wordcloud import WordCloud

input_sympathy = input('보고 싶은 공감 랭킹 뉴스 입력하세요' + str(data['공감종류'].unique())+' : ')

# 선택한 공감 뉴스 제목만 텍스트로 만들기
text = ' '.join(li for li in data[data['공감종류']==input_sympathy].기사내용.astype(str))

font_path = '/content/BMDOHYEON_ttf.ttf'
wc = WordCloud(width=1000, height=700, font_path=font_path).generate(text)
plt.axis('off')
plt.imshow(wc, interpolation='bilinear')
plt.show()

 


해리포터 유튜브 영상 댓글 수집 후 시각화

 

1. 데이터 준비하기

패키지 설치 및 import

!pip install konlpy
!pip install koreanize-matplotlib
import pandas as pd
import numpy as np
import konlpy

import matplotlib.pyplot as plt
import plotly.express as px
import koreanize_matplotlib

from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator

 

2. 데이터 불러오기

youtube_df = pd.read_csv('/content/유튜브 댓글 크롤링_20240722.csv')
youtube_df

댓글을 불러왔는데... 좀 그렇네요

 

3. 단어 분석하기

okt = konlpy.tag.Okt()
word_df = pd.DataFrame({'word' : okt.nouns(' '.join(w for w in youtube_df['댓글내용'].astype(str)))})
word_df

 

4. 단어 빈도표 불러오기

word_df['count'] = word_df['word'].str.len()
word_df

 

5. 단어 집계 결과 시각화

px.bar(group_df.head(20), x='word', y='n', text_auto=True)

 

6. 워드 클라우드 시각화

word_dic = group_df.set_index('word').to_dict()['n']
word_dic
font_path = '/content/NanumGothic.ttf'
wc = WordCloud(width=1000, height=700, font_path=font_path).generate_from_frequencies(word_dic)
plt.axis('off')
plt.imshow(wc, interpolation='bilinear')
plt.show()

마스킹을 활용한 워드 클라우드 시각화


마스킹을 하는 부분에서 교수님께서 주신 과제를 받았습니다.

내가 가장 좋아하는 유튜브 영상으로 댓글을 크롤링해서, 시각화 한 다음 마스킹처리까지 해보라는 과제였는데

이 이야기는 다음편에서 진행해보도록 하겠습니다! ㅎㅎ

썸네일