forked from sbomhoo/naver_news_crawling
-
Notifications
You must be signed in to change notification settings - Fork 0
/
naver_news.py
125 lines (96 loc) · 4.8 KB
/
naver_news.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
from datetime import datetime
import requests
import pandas as pd
import re
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
< naver 뉴스 검색시 리스트 크롤링하는 프로그램 > _select사용
- 크롤링 해오는 것 : 링크,제목,신문사,날짜,내용요약본
- 날짜,내용요약본 -> 정제 작업 필요
- 리스트 -> 딕셔너리 -> df -> 엑셀로 저장
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#각 크롤링 결과 저장하기 위한 리스트 선언
title_text=[]
link_text=[]
source_text=[]
date_text=[]
contents_text=[]
result={}
#엑셀로 저장하기 위한 변수
RESULT_PATH ='C:/Users/User/Desktop/python study/beautifulSoup_ws/crawling_result/' #결과 저장할 경로
now = datetime.now() #파일이름 현 시간으로 저장하기
#날짜 정제화 함수
def date_cleansing(test):
try:
#지난 뉴스
#머니투데이 10면1단 2018.11.05. 네이버뉴스 보내기
pattern = '\d+.(\d+).(\d+).' #정규표현식
r = re.compile(pattern)
match = r.search(test).group(0) # 2018.11.05.
date_text.append(match)
except AttributeError:
#최근 뉴스
#이데일리 1시간 전 네이버뉴스 보내기
pattern = '\w* (\d\w*)' #정규표현식
r = re.compile(pattern)
match = r.search(test).group(1)
#print(match)
date_text.append(match)
#내용 정제화 함수
def contents_cleansing(contents):
first_cleansing_contents = re.sub('<dl>.*?</a> </div> </dd> <dd>', '',
str(contents)).strip() #앞에 필요없는 부분 제거
second_cleansing_contents = re.sub('<ul class="relation_lst">.*?</dd>', '',
first_cleansing_contents).strip()#뒤에 필요없는 부분 제거 (새끼 기사)
third_cleansing_contents = re.sub('<.+?>', '', second_cleansing_contents).strip()
contents_text.append(third_cleansing_contents)
#print(contents_text)
def crawler(maxpage,query,sort,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페이지
while page <= maxpage_t:
url = "https://search.naver.com/search.naver?where=news&query=" + query + "&sort="+sort+"&ds=" + s_date + "&de=" + e_date + "&nso=so%3Ar%2Cp%3Afrom" + s_from + "to" + e_to + "%2Ca%3A&start=" + str(page)
response = requests.get(url)
html = response.text
#뷰티풀소프의 인자값 지정
soup = BeautifulSoup(html, 'html.parser')
#<a>태그에서 제목과 링크주소 추출
atags = soup.select('._sp_each_title')
for atag in atags:
title_text.append(atag.text) #제목
link_text.append(atag['href']) #링크주소
#신문사 추출
source_lists = soup.select('._sp_each_source')
for source_list in source_lists:
source_text.append(source_list.text) #신문사
#날짜 추출
date_lists = soup.select('.txt_inline')
for date_list in date_lists:
test=date_list.text
date_cleansing(test) #날짜 정제 함수사용
#본문요약본
contents_lists = soup.select('ul.type01 dl')
for contents_list in contents_lists:
#print('==='*40)
#print(contents_list)
contents_cleansing(contents_list) #본문요약 정제화
#모든 리스트 딕셔너리형태로 저장
result= {"date" : date_text , "title":title_text , "source" : source_text ,"contents": contents_text ,"link":link_text }
print(page)
df = pd.DataFrame(result) #df로 변환
page += 10
# 새로 만들 파일이름 지정
outputFileName = '%s-%s-%s %s시 %s분 %s초 merging.xlsx' % (now.year, now.month, now.day, now.hour, now.minute, now.second)
df.to_excel(RESULT_PATH+outputFileName,sheet_name='sheet1')
def main():
info_main = input("="*50+"\n"+"입력 형식에 맞게 입력해주세요."+"\n"+" 시작하시려면 Enter를 눌러주세요."+"\n"+"="*50)
maxpage = input("최대 크롤링할 페이지 수 입력하시오: ")
query = input("검색어 입력: ")
sort = input("뉴스 검색 방식 입력(관련도순=0 최신순=1 오래된순=2): ") #관련도순=0 최신순=1 오래된순=2
s_date = input("시작날짜 입력(2019.01.04):") #2019.01.04
e_date = input("끝날짜 입력(2019.01.05):") #2019.01.05
crawler(maxpage,query,sort,s_date,e_date)
main()