๐ผ ์ค๋น
# ํ๊ธ ํจ์น 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() # ์ ๋ ๋์ !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.pyplot as plt from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator import re def clean_text(inputString): text_rmv = re.sub('[-=+,#/\?:^.@*\"โป~ใ!ใโ|\(\)\[\]`\'โฆใ\โ\โ\โยท]', ' ', inputString) return text_rmv
๐ ์ด๋ป๊ฒ??
- https://entertain.naver.com/ranking/sympathy ์ด์ฉ
- '์์', '๊ณต๊ฐ์ข ๋ฅ', '๊ธฐ์ฌ์ ๋ชฉ', '๊ธฐ์ฌ๋งํฌ', '๊ธฐ์ฌ๋ด์ฉ', '๊ณต๊ฐ์', '์์ง์ผ์' ํฌ๋กค๋ง
- ์ฌ์ฉ์์๊ฒ ๋ณด๊ณ ์ถ์ ๋ด์ค๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ(love, cheer, ...)
- ์ ๋ ฅ๋ฐ์ ๋ด์ค ์๋ํด๋ผ์ฐ๋ ์๊ฐํ ์งํ
# ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๋จ์ง ์๊ณ ํฌ๋กค๋ง ์งํ
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)
# ๋ฐ์ดํฐํ๋ ์ ์์ฑ
data = pd.DataFrame(columns = ['์์', '๊ณต๊ฐ์ข
๋ฅ', '๊ธฐ์ฌ์ ๋ชฉ', '๊ธฐ์ฌ๋งํฌ', '๊ธฐ์ฌ๋ด์ฉ', '๊ณต๊ฐ์', '์์ง์ผ์'])
# ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ณต๊ฐ ์ข
๋ฅ ์
๋ ฅ๋ฐ๊ธฐ
# ๋๋ฌธ์๋ก ์
๋ ฅํ ์๋ ์์ผ๋ lower()์ ์ด์ฉํด ์๋ฌธ์๋ก ๋ฐ๊พธ์ด์ค
want = input('๋ณด๊ณ ์ถ์ ๊ณต๊ฐ๋ญํน ๋ด์ค(love, cheer, congrats, expect, surprise, sad) : ').lower()
๐ ์ฌ๊ธฐ๊น์ง ๊ด์ฐฎ์๋๋ฐ ์ด ๋ค์ ๊ณผ์ ์์ ๊ณต๊ฐ์ข ๋ฅ์ ๊ณต๊ฐ์๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์์ผ ํ ์ง ๋ง๋งํ๋ค. ใ ^ใ
๐ ๋ค์ด๋ฒ ๊ณต๊ฐ ์ข ๋ฅ๊ฐ ๋ฌ๋ผ์ง ๋๋ง๋ค ์ฃผ์๊ฐ ์ผ์ ๊ท์น์ผ๋ก ๋ฐ๋๋ ๊ฒ์ ์ด์ฉํด์ผ ํจ
- ์ข์์ : 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
if want == 'love':
driver.get("https://entertain.naver.com/ranking/sympathy")
num = 0
else:
driver.get("https://entertain.naver.com/ranking/sympathy/" + want)
if want == 'cheer': num = 1
elif want == 'congrats' : num = 2
elif want == 'expect' : num = 3
elif want == 'surprise' : num = 4
else: num = 5
๐ ์ผ๋จ ์๋ฌด๊ฑฐ๋ ์ ๋ ฅํด๋ ์ข์์๊ฐ ๋๋ค๋ ๊ฒ์ ๋ชฐ๋์ ๋๋ ์ด๋ ๊ฒ ๋ถ๋ฆฌํด์ ์ฝ๋๋ฅผ ์งฐ๋ค. ์ด๋ ๊ฒ if๋ฌธ์ด ๋ง์ด ์ค์ฒฉ๋๋ ๊ฒฝ์ฐ๋ ์ข์ง ์์ ์ฝ๋์ธ ๊ฑธ ์๊ณ ์์๊ณ .. ๊ต์๋๋ ์ข์ง์์ ์ฝ๋๋ผ๊ณ ๊ทธ๋ฌ์ จ๋๋ฐ ์ฒ์ ์งฐ์ ๋๋ ๋์ ํ ์ด๋ป๊ฒ ์ง์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ด์ ์ผ๋จ ..........................
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')
li = soup.select('ul.news_lst.news_lst3.count_info > li')
clk = soup.select('ul.likeitnews_nav_list > li > a > div.likeitnews_nav_item_name')[num]
for index_l in range(0, len(li)):
try:
# ์์
rank = li[index_l].find('em', {'class', 'blind'}).text.replace('\n', '').replace('\t', '').strip()
# ๊ณต๊ฐ์ข
๋ฅ
thumb = clk.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()
# ๊ณต๊ฐ์
like = soup.select('div.tit_area > a')[2*index_l+1].text.replace('\n', '').replace('\t', '').strip()
like = like[3:]
# ๊ธฐ์ฌ๋งํฌ
link = li[index_l].find('a').attrs['href']
data = data.append({'์์' : rank,
'๊ธฐ์ฌ์ ๋ชฉ' : title,
'๊ณต๊ฐ์ข
๋ฅ' : thumb,
'๊ธฐ์ฌ๋งํฌ' : 'https://entertain.naver.com'+link,
'๊ธฐ์ฌ๋ด์ฉ' : summary,
'๊ณต๊ฐ์' : like,
'์์ง์ผ์' : 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('one.csv', encoding='utf-8-sig')
๐ ์ฌ๊ธฐ์ ๊ณต๊ฐ์ข ๋ฅ์ ๊ณต๊ฐ์ ๋๋ฌธ์ ๋ค์๊ฐ .......... . ..
โฌ๏ธ ์ด ๋ฐ์ค์์ ๊ธ์๋ฅผ ์ถ์ถ
# class๋ช
์ด likeitnews_nav_list์ธ ulํ๊ทธ์ ์์ ํ๊ณ ํ๊ณ class๋ช
์ด likeitnewss_nav_item_name ์ธ divํ๊ทธ์ ๋์ฐฉ
# ์ฒ์์ ์ฌ์ฉ์์๊ฒ ์
๋ ฅ๋ฐ์ ๊ณต๊ฐ ์ข
๋ฅ์ ๋ฐ๋ผ ๋ถ์ฌํ num ๊ฐ์ผ๋ก ๊ธ์ ์ถ์ถ
# ์ง์ง ๋ด๊ฐ ์๊ฐํด๋ ์ด๊ฑฐ์ง๋ก ์ฅ์ด์ง ์ฝ๋๋ผ๊ณ ์๊ฐํจ๋ฏธ๋ค . . ..
clk = soup.select('ul.likeitnews_nav_list > li > a > div.likeitnews_nav_item_name')[num]
โฌ๏ธ ์ด ๊ณต๊ฐ์ text๋ฅผ ์ถ์ถ
๐ ์ ๊ธฐ์ 4929๋ฅผ ๊ฐ์ ธ์์ผ ํจ ์ค๋ spanํ๊ทธ ์์ด ์๋๋ผ aํ๊ทธ ์ด์ฉํด์ ๊ฐ์ ธ์์ผ ํ๋๋ฐ .. ๋ฐฉ๋ฒ์ ๋์ ํ ๋ชจ๋ฅด๊ฒ ์๋ค.
# tit_area ํด๋์ค๋ช
์ ๊ฐ์ง divํ๊ทธ์ ์์์ธ aํ๊ทธ๋์ฐฉ~~
#
like = soup.select('div.tit_area > a')
๐ ๊ณ์ ๋์ ํ๋ค๊ฐ ๊ฒจ์ฐ ๋ฐฉ๋ฒ ๋ฐ๊ฒฌ........~~ ๋ณ๋ก์ธ๊ฑด ์์์ง๋ง ์ต์ ์ด์๋ฅ.
โฌ๏ธ ์ด๊ฑด ๊ธฐ์ฌ๋ค์ด์์ฌ
soup.select ๋ค์ ๋๊ดํธ์ 2*์์(0๋ถํฐ29๊น์ง)+1์ ํ ์ซ์๋ฅผ ๋ฃ์ผ๋ฉด ํด๋น ๊ธฐ์ฌ์ ๊ณต๊ฐ ์๊ฐ ํฌํจ๋ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค๋ ๊ฑธ ์์๋ค ใ
ใ
ใ
ใ
ใ
ใ
์์ ์ด๊ฑฐ์ง์ฃ ..?์ ๋์์์ฌ..^^ ๊ทธ๋๋ ์ด๊ฒ ์ต์ ์ด์๋ต๋๋ค^~^!! ๊ทธ๋์ ๋ฐ์ ์ฝ๋๊ฐ ๋์จ๊ฑฐ์์ฌ
like = soup.select('div.tit_area > a')[2*index_l+1].text.replace('\n', '').replace('\t', '').strip()
# '๊ธ์์' ๋ผ๋ ๋ฌธ์์ด์ ๋นผ๊ธฐ์ํ ์ฌ๋ผ์ด์ฑ
like = like[3:]
data.to_csv('one.csv', encoding='utf-8-sig')
df = pd.read_csv('/content/one.csv', index_col = 0)
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()
๐ surprise(๋๋์ด์) 20220908/23:02์์ ํฌ๋กค๋ง
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)
# ๋จผ์ ๊ณต๊ฐ์ข
๋ฅ๋ฅผ ๋ฆฌ์คํธ์ ์ ์ฅ
url_list = ['', '/cheer', '/congrats', '/expect','/surprise','/sad']
for n in range(0, len(url_list)):
url = 'https://entertain.naver.com/ranking/sympathy'
url += url_list[n] # ๊ธฐ๋ณธ url๊ณผ ๊ฐ๊ฐ ๊ณต๊ฐ์ข
๋ฅ ์ฐ๊ฒฐ
sympathy = 'love'
# ๊ณต๊ฐ ์ข
๋ฅ ์ถ์ถ ํ๊ธฐ
if url_list[n] !='':
sympathy = url_list[n].replace('/','') # ๊ณต๊ฐ์ข
๋ฅ ๋ฆฌ์คํธ์์ /๋ฅผ ๋ผ์ ์์ด๋ง ๋จ๊ธฐ๊ธฐ
print('์์ง ์ค .. ' + url)
driver.get(url)
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')
li = soup.select('li._inc_news_lst3_rank_reply')
for n in range(0, len(li)):
try:
# ์์
rank = li[n].find('em', {'class', 'blind'}).text.replace('\n', '').replace('\t', '').strip()
# ๊ธฐ์ฌ์ ๋ชฉ
title = li[n].find('a', {'class', 'tit'}).text.replace('\n', '').replace('\t', '').strip()
# ๊ธฐ์ฌ๋ด์ฉ
summary = li[n].find('p', {'class', 'summary'}).text.replace('\n', '').replace('\t', '').strip()
# ๋ด์ค ๋งํฌ
link = li[n].find('a').attrs['href']
# ๊ณต๊ฐ ์
# ๋ฐ์ ๊ณผ์ ๋ง ์ํํ๊ฒ ๋๋ฉด '๊ณต๊ฐ์7' ๊ณผ ๊ฐ์ด '๊ณต๊ฐ์'๋ผ๋ ๋ฌธ์์ด์ด ๋ถ์ด์ ์ถ์ถ๋จ
temp_cnt = li[n].find('a', {'class','likeitnews_item_likeit'}).text.replace('\n','').replace('\t', '').strip()
# ๋ฐ๋ผ์ ๋ฐ์ ๊ณผ์ ์ ์ํํ์ฌ ๋ฌธ์๋ฅผ ์ ๊ฑฐํจ
cnt = re.sub(r'[^0-9]','',temp_cnt)
data = data.append({'์์' : rank,
'๊ธฐ์ฌ์ ๋ชฉ' : title,
'๊ณต๊ฐ์ข
๋ฅ' : sympathy,
'๊ธฐ์ฌ๋งํฌ' : 'https://entertain.naver.com'+link,
'๊ธฐ์ฌ๋ด์ฉ' : summary,
'๊ณต๊ฐ์' : cnt,
'์์ง์ผ์' : datetime.datetime.now(timezone('Asia/Seoul')).strftime('%Y-%m-%d %H:%M:%S')},
ignore_index=True)
print('complets of '+ rank + ' : ' + title)
except:
pass
print('-------------------')
input_sympathy = input('๊ณต๊ฐ ์ข
๋ฅ ์
๋ ฅ : ')
# ์๋ํด๋ผ์ฐ๋
# data์ ๊ณต๊ฐ์ข
๋ฅ์ ์
๋ ฅ๋ฐ์ ๊ณต๊ฐ์ข
๋ฅ๊ฐ ๊ฐ์ ๊ฒ๋ง ์๋ํด๋ผ์ฐ๋ ์๊ฐํ
text = ''.join(li for li in data[data.๊ณต๊ฐ์ข
๋ฅ == input_sympathy].๊ธฐ์ฌ์ ๋ชฉ.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()
๐ ์์๋ ๋ชปํด๋ดค๋ ์ฝ๋๋ผ ์ ๊ธฐํ๊ณ ์๋กญ๋ค .. ใ ใ .
re.sub
- ๊ต์๋ ์ฝ๋์์ ๋ฌธ์ ์ ๊ฑฐํ ๋ ์ฐ์
- re.sub('์ฐพ์ ํจํด', '์ฐพ์ ํจํด์ ๋ณ๊ฒฝํ ๋ด์ฉ', '์๋ณธ')
[^0-9] ์ซ์๋ฅผ ์ ์ธํ ๋ฌธ์์ด
๋ด๊ฐ ์ฝ๋๋ฅผ ๋จผ์ ์ง๋ดค์ ๋ ์น ํ์ด์ง์ ๊ตฌ์ฑ์ด ์กฐ๊ธ๋ง ๋ฐ๋๋ฉด ์ฌ์ฉํ ์ ์๋ ์ฝ๋์ผ ์ ๋๋ก ์๋ชป์งฐ๋ค๊ณ ์๊ฐ์ํ๋ค. ๊ทผ๋ฐ ๊ทธ๋๋ ์ผ๋จ ๋น์ฅ์ ๋ผ์ ์ข์๋ค^!^!! ์ด๊ฑฐ์ง์๋๋ผ๋ ์ฑ๊ณตํ์ผ๋๊น ๋ฟ๋ฏํ์๋ค ๊ทธ๋๋ ์ข์ ์๋์๋น ใ
ใ
.. ๊ต์๋ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ ๋ง ๋ง์ด ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ๋๊ผ๋ค. ๊ต์๋ ์ฒ์์๋ ์ฝ๋ ์ดํดํ๊ธฐ ์ด๋ ค์ ๋๋ฐ ๋ฒจ๋ก๊ทธ ์ ๋ฆฌํด๋ณด๋ ์ดํด์๊ฐ๋ฅ๐คช. ์ญ์ ์๋๊ฑฐ๋ ์ดํดํ๋๊ฒ ๋ง์์ผ ์ด๋ ๊ฒ๋ ์๊ฐํด๋ณด๊ณ ์ ๋ ๊ฒ๋ ์๊ฐํด๋ณผ ์ ์๊ตฐ.. ๐ ์ค๋ ์ด์ฌํ์ ๋ฆฌํ๋ค ๋ด์ผ ์ ํ๋ธ ๋๊ธ ํฌ๋กค๋ง๋ง ์ ๋ฆฌํด์ผ์ง ~