본문 바로가기
공대생/무작정 해보는 파이썬

Python Beautifulsoup 네이버 뉴스 크롤링 (2)

by 흔한 공대생 2020. 3. 31.
728x90
반응형

 

 

본 포스팅에서는 이전 포스팅에 이어, python Beautifulsoup 모듈을 이용하여 작일 네이버 랭킹 뉴스의 제목을 크롤링하는 법을 다룬다. 저작권을 침해하지 않는 범위에서 이용해야함을 밝힌다.


04. 날짜 설정

 네이버 뉴스의 랭킹 뉴스는 여러 날짜의 데이터를 가지고 있다. 따라서 url 설정 시 날짜 정보를 기입해야한다. 당일의 정보를 기입하면 그 날이 아닌 특정 시간대의 랭킹 뉴스가 뜨기 때문에, 불가피하게 작일 이전의 날짜만 유용하게 사용할 수 있다.

 

 날짜를 조작하는 가장 쉬운 방법은 datetime 모듈을 사용하는 것이다. 소스코드는 다음과 같다.

 

from datetime import datetime, timedelta

t = datetime.today() - timedelta(1)   #오늘 날짜에서 하루를 뺀, 어제 날짜 정보 저장
y = str(t.year)   #어제 날짜의 년도
m = str(t.month).zfill(2)   #어제 날짜의 월, 형식(두자리) 맞추기 위해 zfill 사용
d = str(t.day).zfill(2)   #어제 날짜의 일, 형식(두자리) 맞추기 위해 zfill 사용

url = 'https://news.naver.com/main/ranking/popularDay.nhn?rankingType=popular_day&date='+y+m+d

 

 위와 같이 어제 날짜의 연-월-일 정보를 가져와 미리 준비된 url에 대입한다. 저런 식으로 날짜를 지정한 url을 사용하면, 지정된 날짜에 해당하는 랭킹 뉴스 페이지에 들어갈 수 있다.


 

05. 크롤링

 이전 포스팅에서 사용했던 beautifulsoup를 사용하여 크롤링을 진행한다.

 

import requests
from bs4 import BeautifulSoup
from datetime import datetime, timedelta

t = datetime.today() - timedelta(1)
y = str(t.year)
m = str(t.month).zfill(2)
d = str(t.day).zfill(2)

url = 'https://news.naver.com/main/ranking/popularDay.nhn?rankingType=popular_day&date='+y+m+d

r = requests.get(url)
html = r.content
soup = BeautifulSoup(html, 'html.parser')
time_html = soup.select('.ranking_datetime > em')
cart_html = soup.select('.ranking_section > h4 > em')
titles_html = soup.select('.ranking_section > ol > li > dl > dt > a')

 

 (잘 이해가 되지 않는다면 이전 포스팅을 참고)

2020/03/31 - [파이썬] - python Beautifulsoup 네이버 뉴스 크롤링 (1)

 

Python Beautifulsoup 네이버 뉴스 크롤링 (1)

본 포스팅에서는 python Beautifulsoup 모듈을 이용하여 작일 네이버 랭킹 뉴스의 제목을 크롤링하는 법을 다룬다. 저작권을 침해하지 않는 범위에서 이용해야함을 밝힌다. 01. 들어가며 이번 주제는 입대한 친구..

commonengineerr.tistory.com


 

06. 텍스트 파일 조작

 크롤링한 데이터는 뉴스 기사들의 제목이므로, 텍스트 파일로 저장하고자 한다.

 

 기사는 6개의 카테고리 (정치, 경제, 사회, 생활/문화, 세계, IT/과학) 로 분류되고, 각 카테고리마다 5개의 기사를 보여준다. 우리는 크롤링한 기사의 날짜 정보, 카테고리명, 기사 순번, 기사 제목을 표시해보도록 하자.

 

import os
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timedelta

t = datetime.today() - timedelta(1)
y = str(t.year)
m = str(t.month).zfill(2)
d = str(t.day).zfill(2)

url = 'https://news.naver.com/main/ranking/popularDay.nhn?rankingType=popular_day&date='+y+m+d

r = requests.get(url)
html = r.content
soup = BeautifulSoup(html, 'html.parser')
time_html = soup.select('.ranking_datetime > em')
cart_html = soup.select('.ranking_section > h4 > em')
titles_html = soup.select('.ranking_section > ol > li > dl > dt > a')

#파일 제목 생성
now = y+'-'+m+'-'+d+' 일간 누적 집계'

#py 파일을 실행하는 위치에 txt 파일 생성
f = open(str(os.getcwd())+"/"+now+".txt", 'w', encoding='utf-8')

#txt 파일 상단에 날짜 정보 기입
f.write('{} {}\n'.format(str(t)[0:10], time_html[0].text+' 집계'))

#for문을 돌며 기사 제목 기입
for i in range(len(titles_html)):
    if i%5==0:		#카테고리 기입
        f.write('<{}>\n'.format(cart_html[i//5].text.strip()))
    #기사 순번, 기사 제목 기입
    f.write('{}  {}\n'.format(str(i+1).zfill(2), titles_html[i]['title']))

#txt 파일 저장 후 닫기
f.close()

 

07. 마무리

 완성된 소스코드를 실제로 실행시키면, 실행시킨 py 파일이 있는 위치에 txt 파일이 생긴다. 파일을 열어보면 다음과 같다.

저작권 문제로 인해 파일을 일부러 깨트렸습니다.

 이렇게 원하는대로 작일 랭킹 뉴스 기사 제목이 담긴 txt 파일이 생성되었다.

728x90
반응형

댓글