라이브러리 임포트 한다.
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd
import datetime
from pytz import timezone
네이버 랭킹 뉴스(많이 본 뉴스) 크롤링
# 1) 데이터 프레임 생성
data = pd.DataFrame(columns=['언론사명', '순위', '기사제목', '기사링크', '수집일자'])
# 2) 네이버 랭킹 뉴스 접속 주소 준비 : https://news.naver.com/main/ranking/popularDay.naver
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) 네이버 랭킹 뉴스 상세 정보 추출
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('Aa/Seoul')).strftime('%Y-%m-%d %H:%M:%S')}, ignore_index = True)
except:
pass
print('Complets of ' + rank + ' : ' + title)
print('-----------------------------------------------------')
print(data)
네이버 랭킹 뉴스(댓글 많은 뉴스) 크롤링
# 1) 데이터 프레임 생성
data_re = 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)
data_re = data_re.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_re)
라이브러리 임포트
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
워드 클라우드 시각화를 위한 데이터 전처리
# WordCloud 라이브러리에서는 하나의 문자열로 제공해야 함
# 391개의 기사제목을 하나의 text로 데이터를 전처리 해야 함
day_text = " ".join(clean_text(li) for li in data.기사제목.astype(str))
day_text
memo_text = " ".join(clean_text(li) for li in data_re.기사제목.astype(str))
memo_text
import re
def clean_text(inputString):
text_rmv = re.sub('[-=+,#/\?:^.@*\"※~ㆍ!』‘|\(\)\[\]`\'…》\”\“\’·]', ' ', inputString)
return text_rmv
네이버 랭킹뉴스 많이본뉴스 워드클라우드 시각화
# 특정 모양을 가진 워드 클라우드 만들기
import numpy as np
from PIL import Image # Python Image Library
mask = Image.open('/content/sphx_glr_masked_002.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(day_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
네이버 랭킹뉴스 댓글 많이 단 뉴스 워드클라우드 시각화
plt.subplots(figsize=(25,15))
wordcloud = WordCloud(background_color = 'black', width=1000, height=700, font_path=fontpath).generate(memo_text)
plt.axis('off')
plt.imshow(wordcloud, interpolation='bilinear')
plt.show()
# 2) 네이버 랭킹 뉴스 접속 주소 준비 : https://news.naver.com/main/ranking/popularDay.naver
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')
print(bsObject)
#이 부분은 처음 한번만 실행하면 됌.
!pip install selenium
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
네이버 연예 랭킹 크롤링
# 1) 데이터 프레임 준비
data = pd.DataFrame(columns=['순위', '기사제목', '기사링크', '기사내용', '수집일자'])
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)
driver.execute_script('window.scrollTo(0,800)')
time.sleep(3)
html_source = driver.page_source
soup = BeautifulSoup(html_source, 'html.parser')
# print(soup)
# class로 css가 -> .classname
# id로 css가 -> #idname
# div > ul > li : 상위태그 > 자식태그 > 자식태그
li = soup.select('ul#ranking_list > li')
# li = soup.select('ul.news_1st3 rank_news > li') class name version
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']
# dataframe 저장(append)
data = data.append({'순위' : rank,
'기사제목' : title,
'기사링크' : 'https://entertain.naver.com/ranking'+link,
'기사내용' : summary,
'수집일자' : datetime.datetime.now(timezone('Asia/Seoul')).strftime('%Y-%m-%d %H:%M:%S')}, ignore_index = True)
print('Complets of ' + rank + ' : ' + title)
except:
pass
print('--------------------------------------------------')
print(data)
어려운데 뭔가 결과물이 나오니까 성취감이 느껴진다... 기분 이상해...