2022.09.01

네이버 랭킹 뉴스 크롤링

착한 이웃 랭킹 뉴스를 크롤링 해보았다.

라이브러리 임포트 한다.

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)

어려운데 뭔가 결과물이 나오니까 성취감이 느껴진다... 기분 이상해...

profile
Do (Awe)Something!

0개의 댓글