본문 바로가기
# 연구실

뉴스 키워드를 어떻게 수집하지? (1)

by lakedaimong 2022. 6. 29.

이전 포스팅에서 네이버 헤드라인 기사의 키워드를 모아서 '워드 클라우드'형태로 보여드렸습니다. 이렇게 보면 해당 매체에서 어떠한 키워드들을 주로 보여주고 있는지 시각적으로 빠르게 파악을 할 수 있는데요. 이러한 키워드를 어떻게 수집해서 워드 클라우드로 보여줄 수 있는지 그 코드를 안내하고 설명해 보겠습니다.

 

이시간 네이버 정치 헤드라인 뉴스 키워드 보기 202206292240

다른 워드 마이닝을 진행하기 전에 지금 이 시각 네이버 뉴스 정치 카테고리 헤드라인 기사의 키워드를 워드클라우드로 살펴봅니다. 현재 대통령이 나토 정상회담에 참석중이라 관련된 키워드

blog.arecacoco.com

 

기사 크롤링

네이버 뉴스 정치 카테고리를 기준으로 설명해 보겠습니다. 네이버 뉴스 페이지에서 정치 카테고리가 제일 앞에 있기 때문에 선택하게 되었습니다. 네이버 뉴스 정치 카테고리에 들어가면 아래와 같은 페이지를 볼 수 있습니다.

네이버 뉴스 정치 카테고리

가운데 '헤드라인 뉴스'라는 제목 아래로 기사들의 링크가 있습니다. 기사제목 하나하나를 클릭하면 해당 기사의 자세한 내용을 볼 수 있죠. 따라서 보이는 기사 제목마다 그 기사의 상세페이지로 이동하는 링크가 걸려있다는 것을 알 수 있습니다. 이 기사 링크가 있으면 해당 기사의 제목과 내용을 '데이터프레임'으로 만들 수 있습니다.

 

제일 앞에 보이는 '尹대통령-나토 사무총장 면담 30일로 재조정'이라는 기사로 실습해 보겠습니다. 기사 제목을 클릭하면 아래 화면과 같이 그 기사로 페이지가 이동합니다. 이동한 페이지의 주소(https://n.news.naver.com/mnews/article/014/0004859682?sid=100)가 그 기사를 데이터프레임으로 만드는데 필요한 소스입니다.

기사 상세

url을 이용해서 인터넷 기사의 제목과 본문 내용을 쉽게 가져올 수 있도록 'newspaper3k'라는 패키지를 사용할 겁니다. 해당 모듈을 어떻게 사용하는지 코드를 실행시켜 알아보겠습니다.

from newspaper import Article

url = 'https://n.news.naver.com/mnews/article/014/0004859682?sid=100'
article = Article(url, language='ko')
article.download()
article.parse()

print(article.title)
print('-------------------------')
print(article.text)

뉴스가 있는 링크를 이용하여 해당 페이지의 기사를 내려받고 .download() 파싱해 parse() 줍니다. 그러면 article.title에 기사의 제목과 article.text에 기사의 본문이 담기게 됩니다. 

尹대통령-나토 사무총장 면담 30일로 재조정
-------------------------
【마드리드(스페인)=김학재 기자】 윤석열 대통령과 옌스 스톨텐베르그 나토(NATO) 사무총장의 면담이 30일(현지시간) 오후로 재조정됐다.대통령실 관계자는 29일 마드리드 프레스센터에서 브리핑을 통해 "윤 대통령과 스톨텐베르그 사무총장과의 면담이 30일 오후로 재조정됐다"고 밝혔다.당초 윤 대통령은 지난 28일 스톨텐베르그 사무총장과 면담할 예정이었지만, 핀란드·스웨덴의 나토 가입 문제를 논의하기 위한 핀란드·스웨덴·튀르키예(터키) 정상과의 4자 회담이 길어지면서 면담이 연기된 바 있다.스웨덴과 핀란드가 나토 회원국이 되겠다고 가입 신청을 했으나, 나토 30개 회원국의 만장일치 동의가 있어야 하는 상황에서 튀르키예의 레젭 타입 에르도안 대통령이 반대 입장을 보여 협상에 난항을 겪은 바 있다.

출력결과 해당 기사의 제목과 본문이 잘 출력되는 것을 볼 수 있습니다.

기사링크 크롤링

기사 링크가 있으면 해당 기사의 제목과 본문 내용을 수집할 수 있다는 사실을 알았으니까 한 번에 많은 기사들을 수집하기 위해 기사링크를 어떻게 크롤링 하는지 알아보겠습니다. 제일 처음에 보았던 네이버 뉴스 헤드라인 페이지에 기사 제목 하나하나에 해당 기사의 링크가 걸려 있다고 말씀드렸습니다. 따라서 해당 페이지의 HTML을 beautifulsoup으로 가져와서 해당 링크만 뽑아내면 되겠죠? 이 크롤링 방법은 모든 게시판이나 글 목록 등에서 데이터를 긁어오는데 공통적으로 사용하는 방법이므로 코드를 한 번 이해하면 아주 유용할 겁니다.

기사링크 검사

먼저 기사목록에서 좀전에 봤던 기사 링크를 크롬브라우저 검사로 들여다 보겠습니다.

링크 검사 상세

검사를 통해서 보면 기사 제목에 상세 페이지로 이동할 수 있는 링크가 있다는 것을 확인할 수 있습니다. 앞에서 newspaper3k를 이용하여 기사 제목과 본문을 가지고 올 때 봤던 주소와 같다는 것을 알 수 있습니다. 추가로 아래의 기사 제목 하나더 검사를 해보겠습니다.

기사 링크 검사 상세 다른 화면

바로 아래에 있는 기사에도 그 기사의 상세 페이지로 이동할 수 있는 url이 있는 것을 볼 수 있습니다. 그리고 공통점 하나더!! 바로 두 이미지 모두 빨간색 박스 표시된 맨 윗줄을 보면 div 테그의 class="cluster_text" 자식 테그에 url이 있다는 사실을 알게 되었습니다. 아래로 기사 제목들이 있는데 모두 같은 구조입니다. 이와같이 게시판의 목록에는 일정한 패턴이 존재하는데요 이것들을 이용해서 내가 원하는 자료를 뽑아낼 수 있습니다. 그럼 기사 제목에 붙어있는 url들을 가져와 보겠습니다.

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
naverNEWS = requests.get('https://news.naver.com/main/main.naver?mode=LSD&mid=shm&sid1=100',headers=headers)
soup = BeautifulSoup(naverNEWS.text, 'html.parser')

newsUrlLIST = []

for link in soup.select('div .cluster_text') :
    url_tmp = link.find("a")["href"]
    newsUrlLIST.append(url_tmp)

print(len(newsUrlLIST))
print(newsUrlLIST)

 앞부분은 네이버 뉴스 정치 카테고리 페이지 url을 이용해서 해당 페이지 전체 html을 가지고 오는 코드 입니다. 지난번 크롤링 기본 포스팅을 참조하세요.

 

크롤링 기초 requests를 이용한 웹페이지 긁기

크롤링은 인터넷 상의 수많은 웹페지중 조건에 많은 정보들을 수집하는 기술입니다. 내가 필요한 특정 정보에 대한 조건을 설정하기 전에 raw data에 해당하는 웹페이지의 html을 긁어와야 합니다.

blog.arecacoco.com

새로운 부분은 for문 안에 있습니다. beautifulsoup를 이용해서 만들 soup에 .select 함수를 이용하면 html에서 해당하는 부분을 가져올

   

수 있습니다. 우리가 가져올 부분은 div 테그에 cluster_text 클래스 자식 중 a 태그의 href 부분을 가져오는 것입니다. for문 안에 코드를 이해할 수 있을 겁니다. 이렇게 해서 준비한 newsUrlList 리스트에 추출한 url을 차곡차곡 넣으면 다음과 같이 출력이 됩니다.

44
['https://n.news.naver.com/mnews/article/001/0013277658?sid=100', 'https://n.news.naver.com/mnews/article/015/0004718387?sid=100', 'https://n.news.naver.com/mnews/article/047/0002358210?sid=100', 'https://n.news.naver.com/mnews/article/018/0005255102?sid=100', 'https://n.news.naver.com/mnews/article/003/0011275315?sid=100', 'https://n.news.naver.com/mnews/article/052/0001757739?sid=100', 'https://n.news.naver.com/mnews/article/056/0011292858?sid=100', 'https://n.news.naver.com/mnews/article/421/0006186839?sid=100', 'https://n.news.naver.com/mnews/article/018/0005255127?sid=100', 'https://n.news.naver.com/mnews/article/001/0013278038?sid=100', 'https://n.news.naver.com/mnews/article/001/0013277739?sid=100', 'https://n.news.naver.com/mnews/article/011/0004070670?sid=100', 'https://n.news.naver.com/mnews/article/448/0000364722?sid=100', 'https://n.news.naver.com/mnews/article/011/0004070525?sid=100', 'https://n.news.naver.com/mnews/article/009/0004984701?sid=100', 'https://n.news.naver.com/mnews/article/001/0013277409?sid=100', 'https://n.news.naver.com/mnews/article/469/0000683213?sid=100', 'https://n.news.naver.com/mnews/article/056/0011292904?sid=100', 'https://n.news.naver.com/mnews/article/032/0003156381?sid=100', 'https://n.news.naver.com/mnews/article/586/0000040941?sid=100', 'https://n.news.naver.com/mnews/article/025/0003205967?sid=100', 'https://n.news.naver.com/mnews/article/022/0003710170?sid=100', 'https://n.news.naver.com/mnews/article/001/0013278419?sid=100', 'https://n.news.naver.com/mnews/article/366/0000824175?sid=100', 'https://n.news.naver.com/mnews/article/421/0006185801?sid=100', 'https://n.news.naver.com/mnews/article/009/0004984702?sid=100', 'https://n.news.naver.com/mnews/article/016/0002009373?sid=100', 'https://n.news.naver.com/mnews/article/214/0001205850?sid=100', 'https://n.news.naver.com/mnews/article/016/0002009242?sid=100', 'https://n.news.naver.com/mnews/article/056/0011292839?sid=100', 'https://n.news.naver.com/mnews/article/001/0013278265?sid=100', 'https://n.news.naver.com/mnews/article/005/0001536479?sid=100', 'https://n.news.naver.com/mnews/article/052/0001757425?sid=100', 'https://n.news.naver.com/mnews/article/003/0011273272?sid=100', 'https://n.news.naver.com/mnews/article/009/0004984768?sid=100', 'https://n.news.naver.com/mnews/article/469/0000683485?sid=100', 'https://n.news.naver.com/mnews/article/001/0013277886?sid=100', 'https://n.news.naver.com/mnews/article/025/0003206089?sid=100', 'https://n.news.naver.com/mnews/article/214/0001205713?sid=100', 'https://n.news.naver.com/mnews/article/421/0006185070?sid=100', 'https://n.news.naver.com/mnews/article/449/0000229586?sid=100', 'https://n.news.naver.com/mnews/article/449/0000229530?sid=100', 'https://n.news.naver.com/mnews/article/449/0000229463?sid=100', 'https://n.news.naver.com/mnews/article/449/0000229401?sid=100']

모두 44개의 기사 링크 url이 수집되었네요. 다음에 이 링크와 newspaper3k를 이용하여 '데이터프레임'을 만들어 보겠습니다.

반응형

댓글