반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


[Python 크롤링] 네이버 뉴스 크롤링하기 with Python

 

1. 네이버 뉴스 크롤링하기 with Python

1) 라이브러리 import

# 데이터 프레임 라이브러리 import
import pandas as pd

# 뉴스 크롤링 라이브러리 import
from selenium import webdriver
from bs4 import BeautifulSoup

# 크롤링 라이브러리 import
import requests

# 운영체제 제공 라이브러리 import
import os

# 정규표현 라이브러리 import
import re

# 시간 라이브러리 import
from datetime import datetime

 

2) 시간 설정

# 현재 시간 문자열 저장
date = str(datetime.now()) 

# -로 변환
date = date[:date.rfind(':')].replace(' ', '-') 

# :을 시로 변환하고 분 추가
date = date.replace(':','시') + '분' 

 

3) 뉴스 검색 키워드 및 크롤링 데이터 양 입력

# 뉴스 검색 키워드 입력
query = input('뉴스 검색 키워드 입력 : ') 
query = query.replace(' ', '+')

# 데이터 양 정하기
news_num = int(input('크롤링 데이터 개수 입력 : ')) 

 

4) 크롤링 페이지 및 Request Get 요청

# 크롤링 페이지 설정
news_url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}'

# 뉴스 검색 키워드 넣어서 get 요청
req = requests.get(news_url.format(query))

# BeautifulSoup 함수를 이용하여 파싱
soup = BeautifulSoup(req.text, 'html.parser')

 

5) 데이터 저장 및 크롤링 페이지 설정

news_dict = {} 
idx = 0 

# 크롤링 데이터 양이 뉴스 한 페이지의 개수보다 많으면 다음 페이지로 넘어가기 위함
cur_page = 1

 

6) 크롤링 시작

print('크롤링 시작')

while idx < news_num:
    table = soup.find('ul',{'class' : 'list_news'})
    li_list = table.find_all('li', {'id': re.compile('sp_nws.*')})
    area_list = [li.find('div', {'class' : 'news_area'}) for li in li_list]
    a_list = [area.find('a', {'class' : 'news_tit'}) for area in area_list]
    
    for n in a_list[:min(len(a_list), news_num-idx)]:
        news_dict[idx] = {'title' : n.get('title'),
                          'url' : n.get('href') }
        idx += 1
    
    #페이지 안에 글들을 크롤링 다 했으면 페이지 증가
    cur_page += 1
    
    pages = soup.find('div', {'class' : 'sc_page_inner'})
    next_page_url = [p for p in pages.find_all('a') if p.text == str(cur_page)][0].get('href')
    
    req = requests.get('https://search.naver.com/search.naver' + next_page_url)
    soup = BeautifulSoup(req.text, 'html.parser')

 

7) 결과 csv 저장

# 데이터 프레임으로 변환
news_df = pd.DataFrame(news_dict).T

# csv로 변환
news_df.to_csv('C:/Users/yong/Documents/news.csv')

 

2. 전체 코드

# 데이터 프레임 라이브러리 import
import pandas as pd

# 뉴스 크롤링 라이브러리 import
from selenium import webdriver
from bs4 import BeautifulSoup

# 크롤링 라이브러리 import
import requests

# 운영체제 제공 라이브러리 import
import os

# 정규표현 라이브러리 import
import re

# 시간 라이브러리 import
from datetime import datetime

# 뉴스 검색 키워드 입력
query = input('뉴스 검색 키워드 입력 : ') 
query = query.replace(' ', '+')

# 데이터 양 정하기
news_num = int(input('크롤링 데이터 개수 입력 : ')) 

# 크롤링 페이지 설정
news_url = 'https://search.naver.com/search.naver?where=news&sm=tab_jum&query={}'

# 뉴스 검색 키워드 넣어서 get 요청
req = requests.get(news_url.format(query))

# BeautifulSoup 함수를 이용하여 파싱
soup = BeautifulSoup(req.text, 'html.parser')

news_dict = {} 
idx = 0 

# 크롤링 데이터 양이 뉴스 한 페이지의 개수보다 많으면 다음 페이지로 넘어가기 위함
cur_page = 1

print('크롤링 시작')

while idx < news_num:
    table = soup.find('ul',{'class' : 'list_news'})
    li_list = table.find_all('li', {'id': re.compile('sp_nws.*')})
    area_list = [li.find('div', {'class' : 'news_area'}) for li in li_list]
    a_list = [area.find('a', {'class' : 'news_tit'}) for area in area_list]
    
    for n in a_list[:min(len(a_list), news_num-idx)]:
        news_dict[idx] = {'title' : n.get('title'),
                          'url' : n.get('href') }
        idx += 1
    
    #페이지 안에 글들을 크롤링 다 했으면 페이지 증가
    cur_page += 1
    
pages = soup.find('div', {'class' : 'sc_page_inner'})
next_page_url = [p for p in pages.find_all('a') if p.text == str(cur_page)][0].get('href')
    
req = requests.get('https://search.naver.com/search.naver' + next_page_url)
soup = BeautifulSoup(req.text, 'html.parser')
    
# 데이터 프레임으로 변환
news_df = pd.DataFrame(news_dict).T

# csv로 변환
news_df.to_csv('C:/Users/yong/Documents/news.csv')

출처 : https://everyday-tech.tistory.com/entry/%EC%89%BD%EA%B2%8C-%EB%94%B0%EB%9D%BC%ED%95%98%EB%8A%94-%EB%84%A4%EC%9D%B4%EB%B2%84-%EB%89%B4%EC%8A%A4-%ED%81%AC%EB%A1%A4%EB%A7%81python-2%ED%83%84

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기