네이버 뉴스 크롤링&워드클라우드(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(".","") l = [] 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 |
위의 결과는 다음과 같다.







댓글
댓글 쓰기