반응형
네이버 연예 랭킹 뉴스 크롤링
# 2) 네이버 연예 랭킹 접속 주소 준비 : https://entertain.naver.com/ranking
url = 'https://entertain.naver.com/ranking'
# 3) url에서 HTML 가져오기
html = urlopen(url)
# 4) HTML을 파싱할 수 있는 object로 변환
bsObject = BeautifulSoup(html, 'html.parser', from_encoding='UTF-8')
print(bsObject)
: 출력해보니, ul태그 안의 내용이 안보임! ul 태그를 가져오면 못보게 막아놓은 경우가 있다. 이 경우에는 이 코드로 가져올 수 없음!
라이브러리 설치
!pip install selenium
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
라이브러리 임포트
from selenium import webdriver
from bs4 import BeautifulSoup
import time
from pytz import timezone
import datetime
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
한글 깨짐 방지
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) 크롬을 켜서 해당 주소로 접속해보자.
options = webdriver.ChromeOptions()
options.add_argument('--headless') # Head-less 설정
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver', options=options) # 웹드라이버에 크롬을 여는거(크롬을 실행)
driver.get("https://entertain.naver.com/ranking") # 해당 주소로 접속함
driver.implicitly_wait(3)
time.sleep(1.5) # (사람인 척 하려고 1.5초 정도 쉬는 것)
- 3) 스크롤 해보자.
driver.execute_script('window.scrollTo(0, 800)')
time.sleep(3)
- 4) 수집! (위의 코드까지는 접속 + 사람인 첫 했던 코드라고 생각하면 쉽다)
html_source = driver.page_source
- 5) 파싱
soup = BeautifulSoup(html_source, 'html.parser')
** class 로 css가 정의 → .classname
** id 로 css가 정의 → #idname
** div > ul > li : 상위태그 > 자식태그 > 자식태그 이런 식으로 for문을 여러번 돌리지 않아도 한줄로 코딩하는게 가능!
# li = soup.selet('ul.news_lst news_lst3 rank_news > li')
# -> class 버전 근데 이거 띄어쓰기 있어서 깨질가능성이 있음.
li = soup.select('ul#ranking_list > li') # -> id 버전
- 6) 수집
for index_l in range(0, len(li)) :
try :
# 순위
rank = li[index_l].find('em', {'class', 'blind'}).text.replace('\n', '').replace('\t', '').strip()
# 기사제목
title = li[index_l].find('a', {'class', 'tit'}).text.replace('\n', '').replace('\t', '').strip()
# 기사 내용
summary = li[index_l].find('p', {'class', 'summary'}).text.replace('\n', '').replace('\t', '').strip()
# 기사링크
link = li[index_l].find('a').attrs['href']
# 데이터 저장 dateframe 저장 (append)
data = data.append({'순위' : rank,
'기사제목' : title,
'기사링크' : 'https://entertain.naver.com' + link,
'기사내용' : summary,
'수집일자' : 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.to_csv('네이버연예랭킹뉴스_20220901.csv', encoding='utf-8-sig', index=False)
워드 클라우드 그리기
df = pd.read_csv('/content/네이버연예랭킹뉴스_20220901.csv')
df.info()
df.head()
기사 제목으로 워드클라우드 시각화데이터 전처리
- 특정 칼럼에 특수기호 빼기
df['기사제목'].replace('[^\w]', ' ', regex=True, inplace =True)
df.head()
- text 로 저장
df_text = " ".join(li for li in df.기사제목.astype(str))
df_text
라이브러리 임포트
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
워드 클라우드 시각화
plt.subplots(figsize=(25, 15))
wordcloud = WordCloud(background_color='white', width=1000, height=700, font_path=fontpath).generate(df_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
기사 내용으로 워드 클라우드 시각화
데이터 전처리
df['기사내용'].replace('[^\w]', ' ', regex=True, inplace=True)
df.head()
df_text1 = " ".join(li for li in df.기사내용.astype(str))
df_text1
마스크 설정
import numpy as np
from PIL import Image
mask = Image.open('/content/cloud.png')
mask = np.array(mask)
워드 클라우드 시각화
plt.subplots(figsize=(25, 15))
wordcloud = WordCloud(background_color='white', width=1000, height=700, mask=mask, font_path=fontpath).generate(df_text1)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
기사 제목을 말풍선 마스크로 처리해보자
mask = Image.open('/content/comment.png')
mask = np.array(mask)
plt.subplots(figsize=(25, 15))
wordcloud = WordCloud(background_color='white', width=1000, height=700, mask=mask, font_path=fontpath).generate(df_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
LIST
'대외활동 > ABC 지역주도형 청년 취업역량강화 ESG 지원산업' 카테고리의 다른 글
[ABC 220902 14일차] - 6번째 특강 (0) | 2022.09.05 |
---|---|
[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 |