반응형
네이버 랭킹 뉴스 크롤링 및 워드 클라우드 시각화
라이브러리 임포트
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import datetime
from pytz import timezone
한글 깨짐 방지 코드
import matplotlib as mpl
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
!apt -qq -y install fonts-nanum
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic')
mpl.font_manager._rebuild()
네이버 랭킹 뉴스(많이 본 뉴스) 크롤링
- 1) 데이터 프레임 생성
data = pd.DataFrame(columns=['언론사명', '순위', '기사제목', '기사링크', '수집일자'])
- 2) 네이버 랭킹 뉴스(많이 본 뉴스) 접속 주소 준비
url = 'https://news.naver.com/main/ranking/popularDay.naver'
- 3) url에서 HTML 가져오기
html = urlopen(url)
- 4) HTML을 파싱할 수 있는 object로 변환
bsObject = BeautifulSoup(html, 'html.parser', from_encoding='UTF-8')
- 5) 네이버 랭킹 뉴스 정보가 있는 div만 가져오기 → 12개의 div가 담겼을 것
div = bsObject.find_all('div', {'class', 'rankingnews_box'})
- 6) 네이버 랭킹뉴스 상세 정보 추출 & 7) dataframe 저장(append)
for index_div in range(0,len(div)) :
# 6-1) 언론사명 추출
strong = div[index_div].find('strong', {'class', 'rankingnews_name'})
press = strong.text
# 6-2) 랭킹뉴스 정보 추출
ul = div[index_div].find_all('ul', {'class', 'rankingnews_list'})
for index_r in range(0, len(ul)):
li = ul[index_r].find_all('li')
for index_l in range(0, len(li)):
try : # 예외처리 구문
# 순위
rank = li[index_l].find('em', {'class', 'list_ranking_num'}).text
# 기사 제목
title = li[index_l].find('a').text
# 기사 링크
link = li[index_l].find('a').attrs['href']
# 7) dataframe 저장 (append)
data = data.append({'언론사명': press,
'순위':rank,
'기사제목' : title,
'기사링크' : link,
'수집일자' : datetime.datetime.now(timezone('Asia/Seoul')).strftime('%Y-%m-%d %H:%M:%S')}, # 지금 현재의 시간을 받아줌
ignore_index = True)
except:
pass
print('Complets of' + rank + ':' + title)
print('------------------------------------------------------------------------------------')
print(data)
data.info()
data.head()
크롤링 데이터 저장하기
data.to_csv('네이버랭킹뉴스_많이본뉴스_크롤링_20220901.csv', encoding='utf-8-sig', index=False)
네이버 랭킹뉴스(댓글 많은 뉴스) 크롤링 (위의 원리와 동일, 한번에 첨부)
# 1) 데이터 프레임 생성
data1 = pd.DataFrame(columns=['언론사명', '순위', '기사제목', '기사링크', '수집일자'])
# 2) 네이버 랭킹 뉴스(댓글 많은 뉴스) 접속 주소 준비 : https://news.naver.com/main/ranking/popularMemo.naver
url = 'https://news.naver.com/main/ranking/popularMemo.naver'
# 3) url에서 HTML 가져오기
html = urlopen(url)
# 4) HTML을 파싱할 수 있는 object로 변환
bsObject = BeautifulSoup(html, 'html.parser', from_encoding='UTF-8')
# 5) 네이버 랭킹 뉴스 정보가 있는 div만 가져오기 -> 12개의 div가 담겼을 것.
div = bsObject.find_all('div', {'class', 'rankingnews_box'})
# 6) 네이버 랭킹뉴스 상세 정보 추출
for index_div in range(0,len(div)) :
# 6-1) 언론사명 추출
strong = div[index_div].find('strong', {'class', 'rankingnews_name'})
press = strong.text
# 6-2) 랭킹뉴스 정보 추출
ul = div[index_div].find_all('ul', {'class', 'rankingnews_list'})
for index_r in range(0, len(ul)):
li = ul[index_r].find_all('li')
for index_l in range(0, len(li)):
try : # 예외처리 구문
# 순위
rank = li[index_l].find('em', {'class', 'list_ranking_num'}).text
# 기사 제목
title = li[index_l].find('a').text
# 기사 링크
link = li[index_l].find('a').attrs['href']
# 7) dataframe 저장 (append)
data1 = data1.append({'언론사명': press,
'순위':rank,
'기사제목' : title,
'기사링크' : link,
'수집일자' : datetime.datetime.now(timezone('Asia/Seoul')).strftime('%Y-%m-%d %H:%M:%S')}, # 지금 현재의 시간을 받아줌
ignore_index = True)
except:
pass
print('Complets of' + rank + ':' + title)
print('------------------------------------------------------------------------------------')
print(data)
data1.info()
data1.head()
data1.to_csv('네이버랭킹뉴스_댓글많은뉴스_크롤링_20220901.csv', encoding='utf-8-sig', index=False)
많이 본 뉴스 데이터 준비하기
df = pd.read_csv('/content/네이버랭킹뉴스_많이본뉴스_크롤링_20220901.csv')
df.info()
df.head()
데이터 전처리
- 1) 특정 컬럼에만 특수기호를 다 빼자
df['기사제목'].replace('[^\w]', ' ', regex=True, inplace=True)
df.head()

많이 본 뉴스 데이터 및 댓글 많은 뉴스 데이터 준비하기
day_df = pd.read_csv('/content/네이버랭킹뉴스_많이본뉴스_크롤링_20220901.csv')
memo_df = pd.read_csv('/content/네이버랭킹뉴스_댓글많은뉴스_크롤링_20220901.csv')
day_df.head()
memo_df.head()
데이터 전처리
day_df['기사제목'].replace('[^\w]', ' ', regex=True, inplace=True)
memo_df['기사제목'].replace('[^\w]', ' ', regex=True, inplace=True)
day_df.head()
memo_df.head()
워드 클라우드 시각화
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
워드클라우드 시각화를 위한 데이터 전처리
1. day 텍스트는 전처리를 한 후에 텍스트로 붙임
2. memo 텍스트는 텍스트로 붙이면서 전처리 함께 같이 진행
- WordCloud 라이브러리에서는 하나의 문자열로 제공해야함. 즉, 391개의 기사제목을 하나의 text로 데이터 전처리 해야한다. → WordCloud 모듈에서 텍스트로 받기를 원한다.
- 1) 기사제목을 텍스트로 만들어주는 작업 → List comprehension(리스트 내포) 함수 내에서 for문을 돌릴 수 있게 해줌
day_text = " ".join(li for li in day_df.기사제목.astype(str))
day_text
- 2) 이번에는 사용자 정의 함수를 통해서 텍스트로 바꿔주자.
import re
def clean_text(inputString):
text_rmv = re.sub('[-=+,#/\?:^.@*\"※~ㆍ!』‘|\(\)\[\]`\'…》\”\“\’·]', ' ', inputString)
return text_rmv
memo_text = " ".join(clean_text(li) for li in memo_df.기사제목.astype(str))
memo_text
네이버 랭킹 뉴스 많이 본 뉴스 워드 클라우드 시각화
plt.subplots(figsize=(25, 15))
wordcloud = WordCloud(background_color='black', width=1000, height=700, font_path=fontpath).generate(day_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
네이버 랭킹뉴스 댓글이 많은 뉴스 워드 클라우드 시각화
plt.subplots(figsize=(25, 15))
wordcloud = WordCloud(background_color='white', width=1000, height=700, font_path=fontpath).generate(memo_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
워드 클라우드 마스킹 : 특정 모양을 가진 워드 클라우드 만들기
import numpy as np
from PIL import Image
# PIL? => Python Imaging Library(이미지 처리하는 라이브러리)
mask = Image.open('/content/sphx_glr_masked_002.png')
mask = np.array(mask)
plt.subplots(figsize=(15, 15))
wordcloud = WordCloud(background_color='black', width=1000, height=700, mask = mask, font_path=fontpath).generate(memo_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
LIST
'대외활동 > ABC 지역주도형 청년 취업역량강화 ESG 지원산업' 카테고리의 다른 글
[ABC 220902 - 14일차] 5번째 특강 (0) | 2022.09.05 |
---|---|
[ABC 220901 - 13일차] 크롤링 및 워드 클라우드 시각화 실습 (0) | 2022.09.02 |
[ABC 220831 - 12일차] PANDAS를 활용한 인구 구조 분석 (0) | 2022.09.02 |
[ABC 220831 - 12일차] 어울링 크롤링 (0) | 2022.09.02 |
[ABC 220831 - 12일차] 과제 피드백 (0) | 2022.09.02 |