본문 바로가기
프로젝트 조각 모음

[ Python ] 웹 크롤링을 이용한 데이터 시각화

by 데구르르르 2021. 3. 31.
728x90



Python 을 이용하여 네이버 뉴스 IT/과학을 크롤링 후 데이터를 시각화 해보았습니다.


1. 네이버 뉴스 IT/과학 카테고리 웹 크롤링

네이버 뉴스 중 관심분야인 IT/과학 카테코리의 코드를 크롤링 해왔습니다.

웹 크롤링시 가장 많이 사용하는 BeautifulSoup를 import 하여 사용했습니다. 원래 requests.get에 headers를 넣지 않아도 되지만, 네이버 뉴스의 메인페이지 이외에 카테고리에는 크롤링을 막아 놓아서 추가로 넣어주었습니다. 

데이터 수집을 할 때 종종 웹페이지에서 크롤링을 통한 데이터수집을 막아놓는 경우가 있습니다. 이것을 "안티 크롤링" 이라 부릅니다. 이때 아래의 코드처럼requests.get()함수 안에 headers={'User-Agent':'Mozilla/5.0'} 이라는헤더값을 추가하면, 서버에 데이터를 요청하면서 웹브라우저에 대한 정보를 같이 전송하여 마치 웹브라우저를 통해 데이터를 요청하는 것처럼 보이게 합니다.

 

IT/과학 : 네이버 뉴스

모바일, 인터넷, SNS, 통신 등 IT/과학 분야 뉴스 제공

news.naver.com

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests 

url = "https://news.naver.com/main/main.nhn?mode=LSD&mid=shm&sid1=105" 
html= requests.get(url, headers={'User-Agent':'Mozilla/5.0'}) 
bsObject = BeautifulSoup(html.text, "html.parser")

print(bsObject) 

print(bsObject)시 출력되는 웹 사이트 코드 



2. 특정 태그에 있는 원하는 값 추출

저는 IT/과학 카테고리에 있는 뉴스들의 기사 제목을 추출해서 문자열(String) 객체에 정리할 것입니다. 그러기 위해 먼저 기사 제목이 어떤 태그 아래에 위치한지 파악한 후, 반복문을 통해 지정한 태그와 속성아래에 있는 값을 가지고와 문자열 객체 list 안에 공백을 기준으로 더해줍니다. 

list = ""

for title in bsObject.find_all('span',{"class":"cluster_head_sub_topic"}):
    list += (title.string) + " "

for title in bsObject.find_all('a',{"class":"cluster_text_headline nclicks(cls_sci.clsart)"}):
    list += (title.string) + " "

print(list)

기사의 제목만 추출해서 저장한 문자열 출력


3. 데이터 시각화 

중요한 단어나 키워드를 시각적으로 보여주는 시각화 도구인 WordCloud와 한국어 정보처리를 위한 파이썬 패키지인KoNLPy(코엔엘파이)를 사용하였습니다. 문자열 list에 있는 기사 제목 중 명사만 추출하고 FreqDist를 사용해 빈도수를 체크하였습니다. 여기서 WordCloud를 사용 시 주의할 점은 font_path를 따로 설정하지 않으면 한국어 데이터 시각화 시 깨져서 출력이 됩니다. 그렇기 때문에 꼭 font_path를 통해 font 설정을 해주어야 합니다.

 

KoNLPy: 파이썬 한국어 NLP — KoNLPy 0.4.3 documentation

KoNLPy: 파이썬 한국어 NLP KoNLPy(“코엔엘파이”라고 읽습니다)는 한국어 정보처리를 위한 파이썬 패키지입니다. 설치법은 이 곳을 참고해주세요. NLP를 처음 시작하시는 분들은 시작하기 에서 가

konlpy-ko.readthedocs.io

from wordcloud import WordCloud
from konlpy.tag import Twitter
from nltk import FreqDist
import matplotlib.pyplot as plt

tw = Twitter()

text_nouns = FreqDist(tw.nouns(list))

wc = WordCloud(font_path='/Windows/Fonts/malgun.ttf', background_color = 'white',random_state = 0)

plt.figure(figsize=(15, 15))
plt.imshow(wc.generate_from_frequencies(text_nouns))
plt.axis('off')  # 수치데이터가 이니므로 측정고 없앰
plt.show()

 

4. 데이터 시각화 - 발전

다양한 모양으로의 시각화도 가능합니다. 파이썬의 이미지 라이브러리인 PIL(pillow)를 설치해서 사용해주었습니다. 가장 많이 사용하는 앨리스 이미지로 해보았습니다. 이외에도 같은 데이터를 활용하여 다양한 모습으로 시각화가 가능합니다.

from PIL import Image
import numpy as np

alice_mask = np.array(Image.open("alice_mask.png"))

wordcloud = WordCloud(
    font_path ='/Windows/Fonts/malgun.ttf',
    width = 800,
    height = 800,
    background_color="white",
    mask = alice_mask
)

wordcloud = wordcloud.generate_from_frequencies(text_nouns)

plt.figure(figsize=(20, 20))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

728x90

댓글