반응형
츄르사려고 코딩하는 코집사입니다.
[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')
반응형
'빅데이터 분석 > 빅데이터 분석 학습' 카테고리의 다른 글
[데이터 크롤링] 서울 약국 경위도 크롤링하기 with Python (0) | 2021.05.25 |
---|---|
[데이터 크롤링] 서울 카페 경위도 크롤링하기 with Python (0) | 2021.05.25 |
[데이터 크롤링] 카카오 api를 활용한 서울 편의점 경위도 크롤링하기 with Python (62) | 2021.05.21 |
엔트로피(Entropy) 머신러닝 통계 - 의사결정나무(Decision Tree) (0) | 2020.12.17 |
파이썬 크롤링을 이용한 주식매매동향 간략한 데이터 분석 (1) | 2020.11.28 |
인포그래픽과 빅데이터 시각화의 차이 (0) | 2020.09.09 |
통계 일변량 분석 기초 (0) | 2020.08.27 |
빅데이터 분석과 데이터베이스 이론 (0) | 2020.08.25 |
최근댓글