AI/정책 댓글 반응 NLP

[1] 네이버 뉴스 댓글 크롤러_ver1_0.사전 작업

eraser 2020. 3. 31. 23:58
반응형

 

 0328 회의 이후, 네이버 뉴스 댓글 크롤러를 만들었다. 기본적인 로직을 이용해 html에서 데이터를 추출하고, 필요한 작업들을 단계별로 세분화해 함수화했다. 그 결과, 초보적인 수준이지만 이용해 네이버 뉴스에서 '주52시간'을 검색하면 나오는 뉴스들을 10페이지까지 긁어 와 csv 파일로 저장할 수 있었다.

 

NomadCoders 강의 내용과 「파이썬으로 웹 크롤러 만들기」 책 내용을 참고했다.

 

 


 

 본격적인 작업에 들어가기 앞서, 몇 단계의 사전 작업이 필요하다. 우선, 어떤 데이터를, 어디에서 얻어야 하는지 명확히 해야 한다. 이후, 필요한 정보를 얻기 위해 내가 만들 크롤러가 어떤 링크들을 타고 돌아다녀야 하는지, 링크들의 URL 구조가 어떻게 되는지 파악해야 한다. 

 

 


# 어떤 데이터를 얻어야 하는가?

 

 지난 0328 회의에서, 팀원들과 다음의 정보를 스크레이핑하는 연습을 해오기로 했다.

 

첫째, '주52시간'을 검색하면 나오는,
둘째, 네이버 뉴스 플랫폼을 통해 제공되는 기사들의,
셋째, 댓글 및 관련 정보를 수집한다.

       "기사 작성 시간, 기사 제목, 언론사, 댓글 작성자, 댓글 작성 시간, 댓글 내용, 공감 수, 비공감 수."

 

 구체적으로 데이터 스키마를 정의하는 일은 이후 회의에서 연습 후 적재된 데이터를 보고 다시 결정하기로 했다.

 

 

# 어디에서 데이터를 얻어야 하는가?

 

네이버 뉴스 홈 화면
뉴스 검색 시 연결되는 화면

 

 네이버 뉴스 홈에서 '주52시간'을 검색하면, 오른쪽과 같은 화면으로 연결된다. 검색 결과 페이지(1, 2, ...)별로 기사 링크를 클릭해 정보를 추출하면 된다.

 

 그런데 그냥 뉴스 기사 제목을 누르면, 해당 기사를 작성한 언론사 홈페이지의 기사 링크로 연결된다.
이는 (적어도 지금 단계에서는) 우리 팀이 얻고자 하는 댓글 정보가 아니다. 우리는 네이버 뉴스 댓글 플랫폼을 통해 작성된 댓글들을 얻고자 한다. 따라서 검색 결과 페이지에서 '네이버 뉴스' 버튼이 있는 기사들의 링크를 타고 들어가야 한다.

 

 

 

 

 이 링크에서는 기사 제목, 기사 작성 시간, 기사 출처(언론사), 댓글 작성자, 댓글 내용, 댓글 작성 시간, 공감/비공감 등 필요한 정보를 모두 얻을 수 있을 것 같다.

 

 그런데 스크롤을 내리다가 모든 댓글이 한 화면에 표시되지 않는다는 문제를 발견했다. 혹시 몰라 모든 댓글을 다 확인해 보기 위해 '댓글 다보기' 버튼을 클릭해 보았다. 그랬더니 아래와 같은 화면으로 연결된다.

 

 

 

 이 화면에서도 모든 댓글이 보이지는 않는다. 댓글을 더 확인하고 싶다면, 아래의 '더보기' 버튼을 클릭하며 숨겨진 댓글을 펼쳐야 한다. 따라서 댓글을 전부 다 가져오기 위해서는 이 링크에서 '더보기' 버튼을 클릭할 것다.

 

 그렇다면 이 페이지에서 댓글 외에 다른 정보들을 가져올 수 있는지 확인해야 한다. 기사 내용이 필요한 것은 아니기 때문에, 가능할 것 같다는 생각이 든다. 실제로 개발자 도구(F12) 버튼을 이용해 태그들을 확인한 결과, 기사 작성 시간, 언론사명, 제목, 기자 등의 정보를 모두 확인할 수 있었다.

 


 

정리하면, 최종적으로 내가 진행해야 할 작업은 다음과 같다.

 

1. 네이버 뉴스 홈에서 '주52시간'을 검색한다.

2. 검색 결과 페이지를 끝까지 순회하며 네이버 뉴스 플랫폼에 등록된 기사들의 '네이버 뉴스' 연결 링크를 가져 온다.

3. 각 기사들의 '네이버 뉴스' 링크에서 '댓글 더 보기' 링크를 통해 댓글 페이지로 들어간다.

4. 각 페이지에서 해당하는 정보들을 가져 온다.

 

그리고, 내 크롤러'주52시간'으로 검색된 기사들 중 네이버 기사의 댓글 링크들을 돌아다녀야 한다.

 

 


# 검색 결과 링크 URL 구조 확인

 

 우선, 네이버 뉴스 홈에서 '주52시간'을 검색했을 때 나오는 URL 구조를 확인한다.

 

https://search.naver.com/search.naver?query=%EC%A3%BC52%EC%8B%9C%EA%B0%84&where=news&ie=utf8&sm=nws_hty

 

 가장 먼저 눈에 띄는 것은 query 부분이다. `query=` 다음 부분에 검색어가 들어간다. 네이버 사이트의 인코딩은 'utf-8'이기 때문에, '주52시간'을 인코딩한 결과가 들어가는 것을 알 수 있다.

 

 페이지가 바뀔 때 검색 화면 URL 구조가 어떻게 바뀌는지 확인하기 위해 2페이지, 3페이지를 클릭해 본다.

 

https://search.naver.com/search.naver?&where=news&query=%EC%A3%BC52%EC%8B%9C%EA%B0%84&sm=tab_pge&sort=0&photo=0&field=0
&reporter_article=&pd=0&ds=&de=&docid=&nso=so:r,p:all,a:all&mynews=0&cluster_rank=18&start=11
&refresh_start=0


https://search.naver.com/search.naver?&where=news&query=%EC%A3%BC52%EC%8B%9C%EA%B0%84&sm=tab_pge&sort=0&photo=0&field=0
&reporter_article=&pd=0&ds=&de=&docid=&nso=so:r,p:all,a:all&mynews=0&cluster_rank=41&start=21
&refresh_start=0


 

 위에서 찾아볼 수 없던 'cluster_rank=' 부분과 'start=' 부분이 생긴 것을 알 수 있다. 네이버 뉴스 검색 결과 창에서 표시되는 기사의 개수가 10개씩이고, 2페이지에서 'start=11', 3페이지에서 'start=21'로 변하는 것으로 보아, 페이지가 넘어갈 때 'start='에 따라 시작 게시물 수가 변한다. 공식은 "(페이지 번호-1) x 10 + 1"을 적용하면 된다.

 'cluster_rank='의 경우는 무엇을 나타내는지 알 수 없었다. 실제 이후 페이지를 클릭해 보더라도 규칙을 알 수 없다. 혹시나 해서 해당 부분을 삭제하고 start 부분을 1, 11, 21로 하여 url을 변경해 보았는데, 아래와 같이 검색어 페이지가 잘 바뀌는 모습을 확인할 수 있다.

 

 

 이 외에 다른 부분들을 바꿔 가며 확인해 본 결과, 'sort='에서 뒤에 나오는 숫자가 0이면 관련순, 1이면 최신순, 2이면 오래된 순으로 기사 검색 결과가 정렬되는 것을 알 수 있었다. 일단 연습이고, 팀원들과 어떤 순서로 기사를 가져올지 결정하지 않았기 때문에 'sort=0'으로 둔다.

 

 


최종적으로 확인한 검색 결과 페이지의 URL 구조는 다음과 같다.

 

https://search.naver.com/search.naver?&where=news&query=[검색어]&&sm=tab_pge&sort=0[이후 변경 가능]&start=[공식]&refresh_start=0

 


# 기사 댓글 링크 URL 구조 확인

 

 각각의 기사 댓글 링크로 들어가기 위해서는 네이버 뉴스 기사 링크를 찾아야 한다. 이는 크롤러가 스크레이핑 작업을 통해 찾아낼 것이기 때문에 당장 확인할 필요가 없다. 그러나 댓글 링크로 들어가기 위해서는 댓글 링크 URL이 어떤 특징을 가지는지 알아야 한다.

 

https://news.naver.com/main/read.nhn?m_view=1&includeAllCount=true&mode=LSD&mid=sec&sid1=101&oid=023&aid=0003518886

https://news.naver.com/main/read.nhn?m_view=1&includeAllCount=true&mode=LSD&mid=sec&sid1=101&oid=015&aid=0004309472

 

 몇 개의 기사에서 댓글 링크를 들어가 보니, 댓글 링크에는 공통적으로 'm_view=1' 부분이 있는 것을 알 수 있었다. 그런데 해당 부분이 링크 중간에 있다. 크롤러가 스크레이핑을 통해 찾아낸 링크를 일일이 분해하여 중간 위치에 'm_view=1'을 넣기란, 쉬운 일이 아니다. 

 

 따라서 위와 같이 링크 마지막에 'm_view=1' 부분을 붙여 보았다.

 

https://news.naver.com/main/read.nhn?includeAllCount=true&mode=LSD&mid=sec&sid1=101&oid=023&aid=0003518886&m_view=1

https://news.naver.com/main/read.nhn?
includeAllCount=true&mode=LSD&mid=sec&sid1=101&oid=015&aid=0004309472&m_view=1

 

 다행히, 똑같은 페이지로 잘 접속되는 것을 확인할 수 있다.

 


 

 최종적으로 확인한 기사 댓글 페이지의 URL 구조는 다음과 같다.

 

[스크레이핑으로 찾아낸 기사 링크]&m_view=1

 

 

반응형