네이버 뉴스와 관련된 데이터로 연구실에서 일하다 보니, 여러가지 관점에서 데이터를 수집하는 경우가 생긴다.
네이버 뉴스에서 오른쪽 위쪽을 잘 살펴보면 기사배열 이력 이라는 코너가 있다.
2019년 4월 4일 이후부터는 메인에 뜨는 뉴스가 개인마다 다르게 적용되도록 서비스 하고 있는 것 같은데, 그 전에는 네이버가 자신들의 기준으로 메인에 기사를 걸어놓은 것 같다.
원하는 기간에 네이버 뉴스 메인에 게시되었던 기사들만 골라서 제목 및 링크를 수집하여 보자.
차근차근 따라올 수 있도록 코드를 최대한 구성해 보도록 노력했다.
코드는 python 3.7
환경에서 작성했다.
수집 기간 정의하기
먼저, 원하는 수집 기간을 정의해 보자. 파이썬의 기본 패키지 중 하나인 datetime
을 사용할 것이다.
1 | # 가져올 범위를 정의 |
코드를 읽어보면 별로 어렵지 않다. start
와 end
로 날짜 범위를 지정한 다음, striptime
함수를 활용하여 원하는 형식인 %Y-%m-%d 으로 뽑아내어 days_range
라는 리스트에 저장하였다.
html parser 정의하기
이제 원하는 페이지의 html에 접근하기 위해, parser을 정의할 것이다.
다행히도 간편하게 html parsing을 지원하는 패키지인 BeautifulSoup4
가 존재한다.
혹시나 이 패키지를 다운받지 않으신 분들은 주피터 노트북 상에서 아래와 같은 코드를 입력하면 된다.
1 | !pip install bs4 |
다운로드가 완료되었다면, 이제 원래의 목적으로 돌아가보자. 아래의 코드를 작성한다.
1 | import requests |
get_bs_obj()
라는, url을 입력하면 bs_obj을 반환하는 함수를 작성하였다.
뉴스 페이지 수 구하기
이제 우리가 수집할 페이지에 접속하여, 페이지가 동작하는 방식에 대해서 파악해 보자.
우리가 원하는 정보는 위의 페이지에서 우리 눈으로 보이는 정보들 (기사 제목, 링크, 날짜 등) 이다.
빨간색 네모 부분을 누르면 다음 페이지로 넘어가며, 사진과 같이 메인 뉴스로 게시되었던 기사 및 텍스트만 메인 뉴스로 게시된 기사 모두를 수집해야 한다.
날짜가 바뀔때 마다 메인 뉴스에 걸렸던 기사의 갯수가 달라질 것인데, 그러면 당연하게도 페이지 수를 알아야 한다.
1 | from tqdm import tqdm_notebook |
위 코드에 사용된 tqdm
은 for문의 진행 정도를 시각적으로 보여주는 좋은 패키지이다. 사용법은 위와 같이 import한 후, for문의 범위에 감싸주면 된다.
웹페이지의 html에서 값을 가져오는 데에는 bs4
의 find()
함수를 사용하였다.
사용법이 궁금하다면, 예전 포스트들을 참고하자.
전체적인 흐름은, 페이지 수 주변의 html 코드를 가져온 후, Python의 기본 함수인 split()
으로 쪼개어, 원하는 부분만 출력한 것이다.
뉴스 정보 수집하기
이제 진짜 우리가 원하는 정보를 수집할 준비가 완료되었다.
예시로 각 페이지에서 기사 제목, 발행 언론사, 카테고리, 기사 링크, 기사 고유번호 (10자리) 를 수집할 것이다.
1 | from tqdm import tqdm_notebook |
코드가 크게 두 부분으로 나뉘어져 있다.
하나는 포토 기사에 대한 데이터 수집. 앞선 step에서 photo_news_count
에 페이지 수를 저장했던 것을 기억할 것이다.
for문으로 페이지 수만큼 반복하여 여러가지 정보를 수집하도록 코드를 짰다.
그리고, 수집하다보면 네이버 기사 메인에 게시되긴 하였지만 뉴스가 아닌(?) 링크들이 있어서 제외하였다.
두 번째는 text_news_count
으로 페이지 수를 저장하였던 텍스트 기사에 대한 데이터 수집이다.
또한, 수집된 기사가 포토 기사인지 텍스트 기사인지 알고 싶어서 중간에 article_type
을 추가해 놓았다.
모든 수집된 데이터는 main_news_list
라는 이름의 리스트에 차례대로 append 되도록 설정했다.
마지막 줄의 pprint()
는 단지 리스트를 깔끔하게 출력하고 싶어서 추가한 코드이니, 크롤러랑은 무관하다.
test 기간에 대해 네이버 메인 뉴스 기사배열이력 수집 결과
CSV 파일로 저장하기
수집을 했으면 관리하기 쉽도록 적절한 형태로 저장하는 것이 필수!
가장 보편적인 형태인 .csv 파일로 저장해 보자.
1 | import pandas as pd |
실행하면, working directory 내에 naver_main_news.csv
파일이 생성되어 있음을 확인할 수 있다.
csv file을 만들기 위해, 데이터를 다루는 데에 매우 편리한 패키지인 pandas
를 사용하였다.
참고로, 주피터 노트북에서 작업하는 사용자의 경우 위에 bs4
패키지를 설치할 때와 유사하게 코드를 입력하면 쉽게 패키지를 다운로드 받을 수 있다.
제대로 수집되었는지 csv file을 열어서 확인해 보자. 아래와 같은 코드를 입력한다.
1 | # open .csv file |
위 코드에서 read_csv()
으로 파일을 읽을 때 dtype
을 추가한 이유는, 저장했었던 aid
가 뉴스 고유 번호 10자리인데 경우에 따라 0000003455와 같이 앞에 0이 있어서, 이를 그대로 출력하고 싶어서 이다.
만약 저 옵션을 추가하지 않으면 방금 전 예로 든 뉴스 고유 번호는 10자리가 아니라 0을 다 빼버린 3455 라고 출력된다.. (ㅠㅠ)
전체 코드
수집을 원하는 기간을 가장 위의 start
, end
에 입력하면 그 결과가 csv file 로 저장되는 코드이다.
본 코드는 정적 데이터를 수집하기 위해 작성되었으며, 동적 데이터가 존재하는 경우 다른 패키지를 사용해야 한다. (참고!)
그리 깔끔한 코드는 아니니까 공부용으로 사용하시길..
1 | # 가져올 범위를 정의 |