-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcrawl_keyword.py
148 lines (116 loc) · 4.84 KB
/
crawl_keyword.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
from bs4 import BeautifulSoup
import requests
import re
import datetime
from tqdm import tqdm
import sys
# 페이지 url 형식에 맞게 바꾸어 주는 함수 만들기
#입력된 수를 1, 11, 21, 31 ...만들어 주는 함수
def makePgNum(num):
if num == 1:
return num
elif num == 0:
return num+1
else:
return num+9*(num-1)
# 크롤링할 url 생성하는 함수 만들기(검색어, 크롤링 시작 페이지, 크롤링 종료 페이지)
def makeUrl(search, start_pg, end_pg):
if start_pg == end_pg:
urls = []
start_page = makePgNum(start_pg)
url = "https://search.naver.com/search.naver?where=news&sm=tab_pge&query=" + search + "&start=" + str(start_page)
urls.append(url)
print("생성url: ", url)
return urls
else:
urls = []
for i in range(start_pg, end_pg + 1):
page = makePgNum(i)
url = "https://search.naver.com/search.naver?where=news&sm=tab_pge&query=" + search + "&start=" + str(page)
urls.append(url)
return urls
# html에서 원하는 속성 추출하는 함수 만들기 (기사, 추출하려는 속성값)
def news_attrs_crawler(articles,attrs):
attrs_content=[]
for i in articles:
attrs_content.append(i.attrs[attrs])
return attrs_content
# ConnectionError방지
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102"}
#html생성해서 기사크롤링하는 함수 만들기(url): 링크를 반환
def articles_crawler(url):
#html 불러오기
original_html = requests.get(url,headers=headers)
html = BeautifulSoup(original_html.text, "html.parser")
url_naver = html.select("div.group_news > ul.list_news > li div.news_area > div.news_info > div.info_group > a.info")
url = news_attrs_crawler(url_naver,'href')
return url
def crawl_urls(keyword):
#검색어 입력
search = keyword
#검색 시작할 페이지 입력
page = 1 # ex)1 =1페이지,2=2페이지...
print("\n크롤링할 시작 페이지: ",page,"페이지")
#검색 종료할 페이지 입력
page2 = 10 # ex)1 =1페이지,2=2페이지...
print("\n크롤링할 종료 페이지: ",page2,"페이지")
# naver url 생성
url = makeUrl(search,page,page2)
news_url =[]
#뉴스 크롤러 실행
for url_item in url:
article_urls = articles_crawler(url_item)
news_url.append(article_urls)
#제목, 링크, 내용 1차원 리스트로 꺼내는 함수 생성
def makeList(newlist, content):
for sublist in content:
newlist.extend(sublist)
return newlist
#제목, 링크, 내용 담을 리스트 생성
news_url_1 = []
#1차원 리스트로 만들기(내용 제외)
makeList(news_url_1,news_url)
#NAVER 뉴스만 남기기
final_urls = []
for i in tqdm(range(len(news_url_1))):
if "news.naver.com" in news_url_1[i]:
final_urls.append(news_url_1[i])
else:
pass
return final_urls
def crawl_news(final_urls):
news_titles = []
news_contents =[]
news_dates = []
final_urls = final_urls.copy()
for i in tqdm(final_urls):
#각 기사 html get하기
news = requests.get(i,headers=headers)
news_html = BeautifulSoup(news.text,"html.parser")
# 뉴스 제목 가져오기
title = news_html.select_one("#ct > div.media_end_head.go_trans > div.media_end_head_title > h2")
if title == None:
title = news_html.select_one("#content > div.end_ct > div > h2")
# 뉴스 본문 가져오기
content = news_html.select("article#dic_area")
if content == []:
content = news_html.select("#articeBody")
# 기사 텍스트만 가져오기
# list합치기
content = ''.join(str(content))
# html태그제거 및 텍스트 다듬기
pattern1 = '<[^>]*>'
title = re.sub(pattern=pattern1, repl='', string=str(title))
content = re.sub(pattern=pattern1, repl='', string=content)
pattern2 = """[\n\n\n\n\n// flash 오류를 우회하기 위한 함수 추가\nfunction _flash_removeCallback() {}"""
content = content.replace(pattern2, '')
news_titles.append(title)
news_contents.append(content)
try:
html_date = news_html.select_one("div#ct> div.media_end_head.go_trans > div.media_end_head_info.nv_notrans > div.media_end_head_info_datestamp > div > span")
news_date = html_date.attrs['data-date-time']
news_date = re.sub(pattern=pattern1,repl='',string=str(news_date))
news_dates.append(news_date)
except AttributeError:
news_date = news_html.select_one("#content > div.end_ct > div > div.article_info > span > em")
return news_titles, news_contents, news_dates