네이버 뉴스 댓글 크롤링 + 워드클라우드 만들기
안녕하세요! 개발자 북치기입니다👍
네이버 뉴스 댓글 크롤링하는 방법에 대해 설명하도록 하겠습니다.
원래 제 글에 있었는데, 코랩에 설정이 잘못돼있어서 많은 분들이 신청만 해주시고 못봤다는걸 알게되었습니다.
굳이 코랩에 가지않아도 여기서 참고할 수 있도록 작성해보도록 하겠습니다.
제가 이 프로그램을 만들게 된 이유는 빅데이터를 이용한 '여론 조사'의 목적이었습니다.
어떤 키워드를 검색하였을 때, 뉴스 본문보다는 댓글이 국민의 여론을 나타낸다고 생각했기 때문입니다.
현재 만들어져있는 빅카인즈같은 사이트를 보면 본문을 분석해주는 것 뿐이라서요.
로직은 이렇습니다.
- 어떤 키워드를 입력하면, 네이버 뉴스 중 네이버 댓글이 달리는 뉴스만 필터링하여 크롤링한다.
- 그 뉴스들 내에 있는 댓글을 싹 크롤링한다.
- 댓글들을 분석하고, 불필요한 불용어들을 제거한다.
- 남은 단어들의 빈도수를 센다.
- 빈도수를 바탕으로 워드클라우드를 작성한다.
- 원하는 이미지로 모양을 만들 수 있다.
이 소스는 21년도인가 20년도인가 만들고, 냅뒀다가 최근에 다시 쓰려니까 잘 안돼서 수정한 버전입니다.
여기서 안된다는건 댓글이 계속 반복되어 추출된다는 것입니다. 예를들어 1페이지의 결과값만 반복됩니다.
아마 검색했을 때 나오는 모든 글들 살펴보시면 똑같은 증상이 있을 것입니다. 왜냐하면 다 똑같은 소스를 참고해서 만들었을 것이기 때문입니다 ㅎㅎ..
저 또한 최초 근본은 이 선생님의 블로그를 참고하였기 때문에 해당 에러가 발생했고 현재는 수정하였습니다.
네이버 뉴스 댓글 크롤링
안녕하세요 이번시간에는 네이버 뉴스 댓글 크롤링에 대해서 살펴보겠습니다. 빅데이터 수업의 김혜진교수...
blog.naver.com
22.9.13. 민주당 키워드로 실행 결과부터 올리자면 이렇구요. 고작 150개 뉴스만 긁었을 뿐인데 역시 민주당 ㅋㅋ



중복제거하고나니 무려 댓글이 18,198개 입니다.
다들 어느정도 아시는 분들이라 생각하고 사소한 설명은 생략하겠습니다.
뉴스 목록을 가져오는 함수입니다. 여기서 query부분에는 키워드가 들어가면 됩니다. ex) 민주당
def news_url(query):
page =1
url_list=[]
while page <= 151 :
url = "https://m.search.naver.com/search.naver?where=m_news&sm=tab_pge&query="+query+"&sort=0&photo=0&field=0&pd=1&ds=&de=&cluster_rank=129&mynews=0&office_type=0&office_section_code=0&news_office_checked=&nso=so:r,p:1w,a:all&start="+str(page)
response = requests.get(url,headers=headers)
html = response.text
soup = BeautifulSoup(html, "lxml")
atags = soup.select('.news_tit')
for i in atags:
if "https://n.news.naver.com/" in i['href'] :
url_list.append(i['href']) #링크주소
if len(atags) < 15 : #한페이지에 15개나오는데, 그보다 작으면 없다고 판단
break
page = page + 15
return url_list
검색으로 뉴스를 가져오는데, PC버전에서 하면 언론사 공식홈페이지로 가는 경우가 많았습니다.
하지만 모바일로 검색했을 때는 그런 증상이 없었기에 모바일로 진행하였습니다. (댓글 유무)
테스트와 속도를 위해 10페이지 까지만 긁어왔습니다. (한 페이지에 15개 뉴스 있음)
query 뒷부분에 있는 것들은 소팅, 사진, 언론사, 기간 등 다양한 옵션을 줄 수 있는 곳입니다.
param으로 구성했으면 더 깔끔할 듯 합니다.
아래 함수는 위에서 클롤링한 뉴스 url을 가지고 댓글을 추출하는 함수입니다.
# 위에서 크롤링한 네이버 뉴스 url을 입력합니다.
def comment(url_list):
total_comment = [] #모든 댓글을 담는 리스트
for url_ex in url_list:
url = url_ex
url = url.split('?')[0]
oid_1 = url.split('/')[-1]
oid_2 = url.split('/')[-2]
i = 1
# df = pd.DataFrame(columns=['댓글'])
while True:
params = {
'ticket': 'news',
'templateId': 'default_society',
'pool': 'cbox5',
'lang': 'ko',
'country': 'KR',
'objectId': f'news{oid_2},{oid_1}',
'pageSize': '100',
'indexSize': '10',
'page': str(i),
'currentPage': '0',
'moreParam.direction': 'next',
'moreParam.prev': '10000o90000op06guicil48ars',
'moreParam.next': '1000050000305guog893h1re',
'followSize': '100',
'includeAllStatus': 'true',
}
response = requests.get('https://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json', params=params, headers=headers)
response.encoding = "UTF-8-sig"
res = response.text.replace("_callback(","")[:-2]
temp=json.loads(res)
# print(temp)
try :
comment = list(pd.DataFrame(temp['result']['commentList'])['contents'])
for j in range(len(comment)):
total_comment.append(comment[j])
if len(comment)<97:
break
else:
i+=1
except :
break
print(total_comment)
return total_comment
https://n.news.naver.com/article/055/0000981200?sid=100 주소가 이런식으로 오게됩니다.
여기서 보면 055 와 0000981200 은 뉴스의 ID 이므로 따로 추출하게됩니다.
이것을 https://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json 여기에 파라미터로 넣어 보내는 것입니다.
제가 각종 테스트를 해본 결과 반복되어 추출되는 이유는
'moreParam.prev': '10000o90000op06guicil48ars',
'moreParam.next': '1000050000305guog893h1re',
이부분 때문이었습니다. 이 값을 넣어주지않으면 댓글이 같은 값만 추출됩니다.
다음 페이지 주소를 알려주는 값인데, 해보시면 아시겠지만 저 값은 계속 바뀌게됩니다.
하지만 저 값을 넣으면 일단은 다 긁어와집니다. 사실 언제 또 막힐지 모른다는 단점이 있습니다. 또 막히면 다른 방법을 찾겠지요.
저도 어떻게 찾았는지 모르지만 때려맞추다보니 됐습니다..ㄷㄷ..
워드클라우드 부분은 따로 시간내어 작성하도록 하겠습니다.
많은 참고되길 바라며 궁금증 있으시면 하트와 댓글 부탁드립니다 👍
전체 소스코드는 여기있습니다.
네이버뉴스댓글크롤링_211109_.ipynb
Colaboratory notebook
colab.research.google.com

참고로 저는 개인 프로젝트와 동시에 외주를 받아 프로그램을 만들고 있습니다.

1:1 강의 또는 자동화 프로그램, 매크로, 자료 수집 등의 작업을 하는 프로그램이 필요하신 경우
아래 오픈 채팅방으로 메신저 부탁드립니다. 최선을 다하겠습니다!