๐ผ ํ๊ธ ๊นจ์ง ๋ฐฉ์ง
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()
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) ๋ค์ด๋ฒ ๋ญํน๋ด์ค ์ ์์ฃผ์
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) ๋ค์ด๋ฒ ๋ญํน๋ด์ค ์ ๋ณด๊ฐ ์๋ 12๊ฐ์ div๋ง ๊ฐ์ ธ์ค๊ธฐ
div = bsObject.find_all('div', {'class', 'rankingnews_box'})
๐ ์ด div๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒโ
# 6) ๋ค์ด๋ฒ ๋ญํน๋ด์ค ์์ธ์ ๋ณด ์ถ์ถ
for index_div in range(0, len(div)):
# 6-1) ์ธ๋ก ์ฌ๋ช
์ถ์ถ
strong = div[index_div].find('strong', {'class','rankingnews_box'})
press = strong.text
๐ ์ฌ๊ธฐ์ strong ํ๊ทธ๋ก ์ธ๋ก ์ฌ๋ช
์ ์ถ์ถํ๋ ๊ฒโ
# 6-2) ๋ญํน๋ด์ค
ul = div[index_div].find_all('ul',{'class', 'rankingnews_list'})
๐ ์ฌ๊ธฐ์ ul ํ๊ทธ๋ก ๋ญํน๋ด์ค ์ถ์ถํ๋ ๊ฒ โ ๋ฐ์ ๊ณผ์ ๋ ์์ ๋น์ทํ๋ ๋ฐ๋ถ๋ถ์ ํ๊ทธ์ค๋ช
์ฌ์ง์ ์๋ตํ๊ฒ ์๋๋ค . . .
for index_r in range(0, len(ul)):
li = ul[index_r].find_all('li') # 5๊ฐ์ 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 # ์ค๋ฅ๊ฐ ๋๋ ๊ณ์ ์งํ (break๋ ๋ฉ์ถค)
print('Completes of'+rank+' : '+title)
print('----------------------------------')
print(data)
๐ ์ ์ฒด์ฝ๋
data = pd.DataFrame(columns=['์ธ๋ก ์ฌ๋ช ','์์','๊ธฐ์ฌ์ ๋ชฉ','๊ธฐ์ฌ๋งํฌ','์์ง์ผ์']) url = 'https://news.naver.com/main/ranking/popularDay.naver' html = urlopen(url) bsObject = BeautifulSoup(html, 'html.parser',from_encoding='utf-8') div = bsObject.find_all('div', {'class','rankingnews_box'}) for index_div in range(0,len(div)): strong = div[index_div].find('strong', {'class','rankingnews_name'}) press = strong.text 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'] 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 # ์ค๋ฅ๊ฐ ๋๋ ๊ณ์ ์งํ (break๋ ๋ฉ์ถค) print('Completes of'+rank+' : '+title) print('----------------------------------') print(data)
data.tocsv('๋ค์ด๋ฒ๋ญํน๋ด์ค๋๊ธ๋ง์๋ด์ค_ํฌ๋กค๋ง_20220901.csv', encoding='utf-8-sig', index=False)
df = pd.read_csv('/content/๋ค์ด๋ฒ๋ญํน๋ด์ค_๋ง์ด๋ณธ๋ด์ค_ํฌ๋กค๋ง_20220901.csv')
df.head()
df['๊ธฐ์ฌ์ ๋ชฉ'].replace('[^\w]',' ', regex=True, inplace=True)
day_df = pd.read_csv('/content/๋ค์ด๋ฒ๋ญํน๋ด์ค_๋ง์ด๋ณธ๋ด์ค_ํฌ๋กค๋ง_20220901.csv')
memo_df = pd.read_csv('/content/๋ค์ด๋ฒ๋ญํน๋ด์ค_๋๊ธ๋ง์๋ด์ค_ํฌ๋กค๋ง_20220901.csv')
day_df['๊ธฐ์ฌ์ ๋ชฉ'].replace('[^\w]',' ', regex=True, inplace=True)
memo_df['๊ธฐ์ฌ์ ๋ชฉ'].replace('[^\w]',' ', regex=True, inplace=True)
๐ ๊ธฐ์ฌ์ ๋ชฉ์์์ ํน์๋ฌธ์ ์ ๊ฑฐ(๋์ด์ฐ๊ธฐ ์ ์ธ)
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
# WordCluod ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ํ๋์ ๋ฌธ์์ด๋ก ์ ๊ณตํด์ผ ํจ
# ๋ด์ค์ ๋ชฉ์ ํ๋์ text๋ก ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
day_text = " ".join(li for li in day_df.๊ธฐ์ฌ์ ๋ชฉ.astype(str)) #ํ ์นธ ๋ผ๊ณ join
memo_text = " ".join(clean_text(li) for li in memo_df.๊ธฐ์ฌ์ ๋ชฉ.astype(str))
๐ ์ด๋ฐ์์ผ๋ก ํ๋์ ๋ฌธ์์ด๋ก ๋ง๋ค์ด์ง!!
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()
๐ 9์ 1์ผ 14์ 43๋ถ ์์ง
# ํน์ ๋ชจ์์ ๊ฐ์ง ์๋ํด๋ผ์ฐ๋ ๋ง๋ค๊ธฐ
# ๋ง์คํฌ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์์ ์ ์ฉ
import numpy as np
from PIL import Image # 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='white', width=500, height=700, mask=mask,font_path=fontpath).generate(memo_text)
plt.axis('off')
plt.imshow(wordCloud, interpolation='bilinear')
plt.show()
๋ง์ด ๋ณธ ๋ด์ค
๋๊ธ ๋ง์ ๋ด์ค
์ธ์ ์์งํ๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ์ ์ ์์ ~~!!
๊ธ์๊ฐ ํด์๋ก ๊ธฐ์ฌ์์ ๋ง์ด ์ธ๊ธ(?)๋๋ค๋ ๊ฒ
#์ด ๋ถ๋ถ์ ์ฒ์ ํ๋ฒ๋ง ์คํํ๋ฉด ๋จ. ์ฌ๋์ด ํ๋ ๊ฒ์ฒ๋ผ ๊ฒ์ํ๋ ํน์ง ํ์ฌ
!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')
# 1 ๋ฐ์ดํฐ ํ๋ ์ ์ค๋น ๋๋ผ์ด๋ฒ๊ฐ ํฌ๋กฌ์ ์ผ๊ณ 3์ด ์ฌ๊ณ (๋ก๋ด ์๋๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ์ํด)
data = pd.DataFrame(columns = ['์์', '๊ธฐ์ฌ์ ๋ชฉ', '๊ธฐ์ฌ๋งํฌ', '๊ธฐ์ฌ๋ด์ฉ', '์์ง์ผ์'])
options = webdriver.ChromeOptions()
options.add_argument('--headless') #
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')
# class๋ก css ์ ์๋์ด์์ผ๋ฉด .classname
# id๋ก css๊ฐ ์ ์๋์ด์์ผ๋ฉด #idname ๋ก ์ฐ๋ฉด ๋๋ค.
# div > ul > li ์์ ํ
๊ทธ๊ฐ ์์ผ๋ฉด ์์ํ๊ทธ > ์์ํ๊ทธ > ์์์ ์์ํ๊ทธ ๋ก ์ด๋๊ฐ๋ฅ
li = soup.select('ul#ranking_list > li') # #ranking_list = > id๊ฐ ranking_list์ธ๊ฑฐ/ ulxprmdml id๊ฐ ranking_list์ธ ๊ฒ๋ค์ li๋ฅผ ๊ฐ์ ธ์์ค
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']
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)
print('complets of '+ rank + ' : ' + title)
except:
pass
print('---------------------------------------------------')
print(data)
# ์ ์ฅ
data.to_csv('๋ค์ด๋ฒ์ฐ์๋ด์ค.csv', encoding='utf-8-sig')
# clean_textํจ์๋ก ํน์๊ธฐํธ ์์ ๊ธฐ(์ ์ฒ๋ฆฌ ํ์์์)
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import re
def clean_text(inputString):
text_rmv = re.sub('[-=+,#/\?:^.@*\"โป~ใ!ใโ|\(\)\[\]`\'โฆใ\โ\โ\โยท]', ' ', inputString)
return text_rmv
๐ 20220901 23์ 2๋ถ ๊ธฐ์ค!
df = pd.read_csv('/content/๋ค์ด๋ฒ์ฐ์๋ด์ค.csv')
df = df.astype({'๊ธฐ์ฌ์ ๋ชฉ' : 'string'})
df['๊ธฐ์ฌ์ ๋ชฉ'].replace('[^\w]', ' ', regex = True, inplace = True)
text = ' '.join(clean_text(li) for li in df.๊ธฐ์ฌ์ ๋ชฉ.astype(str))
plt.subplots(figsize = (25, 15))
wordcloud = WordCloud(background_color = 'black', width = 1000, height = 700, font_path = fontpath).generate(text)
plt.axis('off')
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.show()
๐ ๋ค์ด๋ฒ ๋๊ธ๋ง์ ๋ด์ค์์ ๋ง์คํฌ ์ผ๋ ๊ฒ์ฒ๋ผ ์ฐ์๋ด์ค๋ ์ ์ฉ
# ํน์ ๋ชจ์์ ๊ฐ์ง ์๋ ํด๋ผ์ฐ๋ ๋ง๋ค๊ธฐ
import numpy as np
from PIL import Image # Python Imaging Library
mask = Image.open('/content/img3.png')
mask = np.array(mask)
plt.subplots(figsize = (25, 15))
wordcloud = WordCloud(background_color = 'black', width = 500, height = 700, mask = mask, font_path = fontpath).generate(text)
plt.axis('off')
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.show()
๐ ํ์ ๋ชจ์์ผ๋ก ์ ์ฉ ~~
์ค๋ ํ๋ฃจ๋ ์ด๋ฒ์ฃผ๋ ์ ๋ง ๊ธธ๋ค . . . . . . ๊ทธ๋๋ ์ง์์ ์ค๋ ๊ธฐ์ ๋ธ๋ก๊ทธ ์ฌ๊ธฐ๊น์ง ์ ๋ฆฌํ ๋ ,, ์นญ์ฐฌํด^๐๐^ ๋ฐ์ดํฐ๋ถ์์๊ฐํ ํํ๋ก์ ํธ ํ ์ฝ๋๋ ์ ๋ฆฌํ๋ ค๊ณ ํ๋๋ฐ ์ค๋์ ๋๋ฌด ํผ๊ณคํด์ ๋ด์ค ํฌ๋กค๋ง ํ ๋ถ๋ถ๋ง ์ ๋ฆฌ . . ~~ ๋ฒ์จ ๋ด์ผ ๊ธ์์ผ์ธ๊ฒ ๋ฏฟ๊ธฐ์ง์์ง๋ง ๋๋ฌด์กฐํ.๋๋ฌด๋๋ฌด.๊ทธ๋ฆฌ๊ณ ๋๋ฌด๋ฐฐ๊ณ ํ๋ค ๋นจ๋ฆฌ์์ผ์ง ใ ใ ์ค๋ ๋ด์ค๋ค์ ์๋ํด๋ผ์ฐ๋๋ก ์๊ฐํ ํ๋ฉด ๊ธ์๋ค์ด ๋์ ๋ฑ ๋ณด์ฌ์ ์ฌ๋ฐ์๋ค. ์ฐ์๋ด์ค ํฌ๋กค๋ง ํ ๋ถ๋ถ์ด ์์ง ์๋ฒฝํ ์์ง๋ ์๋ ๊ฒ ๊ฐ์ผ๋ ์ฃผ๋ง์ ๊ผญ ๋ค์ ๋ด๋ณด๊ธฐ !