네이버 뉴스 크롤링&워드클라우드(9주차)

 이번주에는 네이버금융에서 IT분야의 정보를 가져와 등락률의 상위 10개 종목만을 가지고 그 종목들을 검색어로 사용하여 뉴스기사의 제목, 언론사, 링크를 가져왔다. 그리고 그 제목을 가지고 워드클라우드로 시각화해 보았다.

1
2
3
4
5
6
7
import requests
from bs4 import BeautifulSoup
import pandas as pd
from collections import Counter
from konlpy.tag import Twitter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
cs

위의 라이브러리를 사용하여 진행하였다.

네이버금융 크롤링

먼저 네이버금융에서 IT분야의 정보를 가져와 등락률의 상위 10개 종목을 뽑아보았다.


1
2
3
4
5
6
7
8
9
url = 'https://finance.naver.com/sise/sise_group_detail.nhn?type=upjong&no=154'
req = requests.get(url)
html = req.text
soup = BeautifulSoup(html,'html.parser')
finance_html = soup.select('div.box_type_l table.type_5')
finance_html = str(finance_html)
finance_list = pd.read_html(finance_html)
finance_df = finance_list[0]
finance_df
cs

위의 코드를 실행하면 아래와 같이 데이터 프레임을 가져올 수 있다.

















1
2
finance_df = finance_df[1:67]
df = finance_df
cs

아래의 67,68번째 행은 비어있으므로 제거하고 진행한다.

1
2
3
4
5
df['등락률_11'= df['등락률'].str[0]
df['등락률_11'= df['등락률_11'].replace('+','0').replace('-','1')
df['등락률_22'= df['등락률'].str[1:].str.split('%').str[0]
df['등락률_22'= df['등락률_22'].astype(float)
df
cs

위에 코드는 등락률의 부호로 등락률_11이라는 열을 만들고 +면 0, -면 1로 바꾸어준다.

그리고 등락률의 숫자로 등락률_22라는 열을 만들고 float로 변환해준다.

실행 결과는 다음과 같다.















1
2
3
df = df.sort_values(by=['등락률_22'], axis=0, ascending=False)
df = df[:10]
df
cs

등락률_22라는 열로 정렬을 시켜 등락률 상위 10개 종목만 가져왔다.

결과는 다음과 같다.















네이버 검색어기반 뉴스 크롤링

1
2
3
4
df['종목명'= df['종목명'].str.replace('*''').replace(' ','')
name = df.iloc[:,0]
name = list(name)
name
cs

종목명을 다음과같이 리스트로 만들었다.












1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
s_date = "2020.10.05"
e_date = "2020.10.12"
s_from = s_date.replace(".","")
e_to = e_date.replace(".","")
 
= []
for query in name:
    for n in range(0,3):
        req = requests.get("https://search.naver.com/search.naver?where=news&query=" + query + "&sort=1&ds=" + s_date + "&de=" + e_date + "&nso=so%3Ar%2Cp%3Afrom" + s_from + "to" + e_to + "%2Ca%3A&start=" + str(n*10+1), 
                            headers={'User-Agent':'Mozilla/5.0'})
        html = req.text
        soup = BeautifulSoup(html, 'html.parser')
 
        articles = soup.select('ul.type01 > li')
 
        for article in articles:
            d = {}
            d['title'= article.select_one("a._sp_each_title").text          
            # 기사 제목
            d['agency'= article.select_one("span._sp_each_source").text     
            # 언론사
            d['link'= article.select_one("a._sp_each_title")['href']
        
            l.append(d)
cs

날짜를 지정하여 다음과 같은 코드로 기사의 제목, 언론사, 링크를 크롤링한다.

1
pd.set_option('display.max_colwidth', -1)
cs

크롤링한 링크 뒷부분에 ...으로 생략되는 문제가 있어 위에 코드를 사용한다.

1
2
a = pd.DataFrame(l)
a
cs

데이터프레임으로 만들어 결과를 확인하면 다음과 같다.









워드클라우드

두 가지 방법으로 그려보았다.

1. 형태소 분석을 하지않고 진행하였을 때

1
2
3
4
5
6
7
8
9
10
title = list(a['title'])
title1 = ''.join(title)
 
wordcloud = WordCloud(font_path='C:/Windows/Fonts/NanumGothic.ttf', background_color='white',
                     width = 1000, height = 1000, max_words = 100, max_font_size = 300)
 
fig = plt.figure(figsize = (10,10))
plt.axis('off')
img = wordcloud.generate(title1)
plt.imshow(img)
cs

위의 코드로 기사제목을 가지고 워드클라우드를 그려보았다. 결과는 다음과 같다.
















2. 형태소 분석을 하고 진행하였을 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
title = list(a['title'])
title1 = ''.join(title)
 
wordcloud = WordCloud(font_path='C:/Windows/Fonts/NanumGothic.ttf', background_color='white',
                     width = 1000, height = 1000, max_words = 100, max_font_size = 300)
 
nlp = Twitter()
nouns = nlp.nouns(title1)
count = Counter(nouns)
words = dict(count.most_common())
 
fig = plt.figure(figsize = (10,10))
plt.axis('off')
img = wordcloud.generate_from_frequencies(words)
plt.imshow(img)
cs

위의 결과는 다음과 같다.
















댓글

이 블로그의 인기 게시물

SQL(9)(performance tuning queries, pivoting data)

데이터 크롤링(3주차)

SQL(8)(writing subqueries, window functions)