🪧 About  
home
[출판사] 전기장판  
home

[python-크롤링] 파이썬으로 네이버 뉴스 수집하기 - 기사내용 포함

글쓴이
생성일
2019/06/14
카테고리
태그
5 more properties
네이버에서 검색한 뉴스를 긁어오는 코드입니다. 각 홈페이지로 리다이렉트 되는 기사의 경우 주소의 일관성이 없어서 기사 내용은 불러오지 못 합니다. 그래서 네이버 포털 자체에서 제공하는 뉴스 기사만 대상으로 기사 내용을 포함해서 수집합니다.
자세한 설명은 추후 시간이 날 때 하도록 하겠습니다.
아래는 코드 전문입니다.
불필요한 코드들이 중간에 섞여 있습니다.

전체코드

# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup import pandas as pd from datetime import datetime import os RESULT_PATH = 'D:/키워드 분석/네이버뉴스(02)/' now = datetime.now() #파일이름 현 시간으로 저장하기 # %% # 뉴스 수집을 위한 def입니다. def get_news(n_url): news_detail = [] breq = requests.get(n_url) bsoup = BeautifulSoup(breq.content, 'html.parser') title = bsoup.select('h3#articleTitle')[0].text.replace('\\\\n', " ") #대괄호는 h3 #articleTitle 인 것중 첫번째 그룹만 가져오겠다. news_detail.append(title) pdate = bsoup.select('.t11')[0].get_text()[:11] news_detail.append(pdate) _text = bsoup.select('#articleBodyContents')[0].get_text().replace('\\\\n', " ") btext = _text.replace("// flash 오류를 우회하기 위한 함수 추가 function _flash_removeCallback() {}", "") news_detail.append(btext.strip()) news_detail.append(n_url) pcompany = bsoup.select('#footer address')[0].a.get_text() news_detail.append(pcompany) return news_detail def crawler(maxpage,query,s_date,e_date): s_from = s_date.replace(".","") e_to = e_date.replace(".","") page = 1 maxpage_t =(int(maxpage)-1)*10+1 # 11= 2페이지 21=3페이지 31=4페이지 ...81=9페이지 , 91=10페이지, 101=11페이지 f = open("D:/키워드 분석/네이버뉴스(02)/contents_text.txt", 'w', encoding='utf-8') while page < maxpage_t: print(page) url = "<https://search.naver.com/search.naver?where=news&query=>" + query + "&sort=0&ds=" + s_date + "&de=" + e_date + "&nso=so%3Ar%2Cp%3Afrom" + s_from + "to" + e_to + "%2Ca%3A&start=" + str(page) req = requests.get(url) print(url) cont = req.content soup = BeautifulSoup(cont, 'html.parser') #print(soup) for urls in soup.select("._sp_each_url"): try : #print(urls["href"]) if urls["href"].startswith("<https://news.naver.com>"): #print(urls["href"]) news_detail = get_news(urls["href"]) # pdate, pcompany, title, btext f.write("{}\\\\t{}\\\\t{}\\\\t{}\\\\t{}\\\\n".format(news_detail[1], news_detail[4], news_detail[0], news_detail[2],news_detail[3])) # new style except Exception as e: print(e) continue page += 10 f.close() def excel_make(): data = pd.read_csv(RESULT_PATH+'contents_text.txt', sep='\\\\t',header=None, error_bad_lines=False) data.columns = ['years','company','title','contents','link'] print(data) xlsx_outputFileName = '%s-%s-%s %s시 %s분 %s초 result.xlsx' % (now.year, now.month, now.day, now.hour, now.minute, now.second) #xlsx_name = 'result' + '.xlsx' data.to_excel(RESULT_PATH+xlsx_outputFileName, encoding='utf-8') def main_mod(): x=0 # 연도별로 반복시키기 위해서(400줄 이상 네이버가 검색 결과를 제공하지 않기 때문에, 400줄 단위로 작업해야 하며, 연도를 나눠야 한다.) while x<20: maxpage = 400 query = '"문화영향평가"' s_date = "20{0:0>2}.01.01".format(x) #2019.01.01 print(s_date) e_date = "20{0:0>2}.12.31".format(x) #2019.04.28 crawler(maxpage,query,s_date,e_date) #검색된 네이버뉴스의 기사내용을 크롤링합니다. os.rename("D:/OneDrive - 서울대학교/키워드 분석/네이버뉴스(02)/contents_text.txt", "D:/OneDrive - 서울대학교/키워드 분석/네이버뉴스(02)/contents_{0:0>2}.txt".format(x)) # 2001년도 숫자 x=1을 01로 채우기 x+=1 # %% main_mod() # %% # 경우에 따라 마지막 뉴스가 수백번 중복되는 경우가 발생하여 중복 제거가 필요 x=0 # 0년부터 2019년까지 반복작업 while x<20: with open('D:/키워드 분석/네이버뉴스(02)/contents_{0:0>2}.txt'.format(x), 'r', encoding='utf-8') as f: list_file = f.readlines() list_file = [line.rstrip('\\\\n') for line in list_file] new_list=list(set(list_file)) # 중복 뉴스기사 제거하기 with open('D:/키워드 분석/네이버뉴스(02)/contents_mod_{0:0>2}.txt'.format(x), 'w', encoding='utf-8') as nf: for line in new_list: nf.write(line+'\\\\n') x+=1 # %% # 수집한 연도별 데이터 기초통계량(데이터 수집 과정에서 줄바꿈이 제대로 이루어지지 않아, 기사 개수를 세는 것에 오류) #!/usr/bin/env python3 import csv import glob import os import sys input_path = "D:/키워드 분석/네이버뉴스(02)" file_counter = 0 for input_file in glob.glob(os.path.join(input_path,'*contents_mod_*.txt')): line_counter = 1 with open(input_file, 'r', encoding="utf-8") as txt_in_file: for line in txt_in_file: line_counter += 1 print('{0!s}: \\\\t{1:d} rows'.format(os.path.basename(input_file), line_counter)) file_counter += 1 print('Number of files: {0:d}'.format(file_counter))
Plain Text
Copyright ⓒ 2022 SADAM Media All Rights Reserved.
사담미디어(SADAM Media) / 사업자번호: 703-37-00838