|
# 1. 중앙일보 기사 크롤링 함수 choongang()
def choongang(keyword, num1):
from selenium.webdriver.common.keys import Keys
from selenium import webdriver # 컴퓨터가 알아서 웹페이지를 움직일 수 있도록 하는 모듈
from bs4 import BeautifulSoup
import urllib
import re
import time
# 인공지능으로 중앙일보에서 검색했을때의 url 을 driver 가 인식할 수 있게 합니다.
list_url ="https://www.joongang.co.kr/search/news?keyword="+keyword
driver = webdriver.Chrome("C:\\data\\chromedriver_win32\\chromedriver.exe")
driver.implicitly_wait(10)
driver.get(list_url)
for i in range(1,num1+1): # 더보기 num+1쪽까지
더보기 = driver.find_element_by_css_selector('a.btn.btn_outline_gray')
더보기.send_keys('\n') # 엔터를 칩니다.
time.sleep(3)
driver.find_element_by_xpath("//body").send_keys(Keys.PAGE_DOWN) # 페이지 다운합니다
html = driver.page_source # 크롬브라우져에서 현재 불러온 html 소스를 가져옵니다
soup = BeautifulSoup( html, "html.parser") # html 코드를 beautifulsoup 으로 파싱합니다
base = soup.select("h2.headline > a") # html 코드에서 h2 태그의 headline 클래스의 자식 태그인
# a 태그의 html 문서들을 가져오기
params=[] # 상세 기사 url 을 담을 리스트
for i in base[5:-5]: # 중앙일보의 경우는 많이 본 뉴스가 상위 5개, 하위 5개를 제외.
params.append(i.get("href")) # a 태그 안에 있는 href 의 상세 url 을 가져온다..
f2 = open('c:\\data\\'+keyword+'.txt', "w", encoding="utf8") # 입력한 keyword에 따른 크롤링한 내용을 담는 파일f2
cnt = 0
for k in params:
url = urllib.request.Request(k)
f = urllib.request.urlopen(url).read().decode("utf-8")
# 가져온 html 을 beautifulsoup 이 인식할 수 있도록 파싱합니다.
soup = BeautifulSoup( f, "html.parser")
for i in soup.find_all("div", class_ ="article_body fs3"):
cnt += 1
f2.write( str(cnt) + '. ' + re.sub('[\n\r\t]', '',i.text ) + '\n' )
f2.close()
driver.quit() # 끝나면 브라우저 닫기.
# 2. 네이버 블로그 크롤링 함수 n_blog
def n_blog(keyword,p_num):
# 모듈
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from urllib import request as urlreq
import time
import re
# 크롬 드라이버
binary = "C:\\data\\chromedriver_win32\\chromedriver.exe"
# 브라우저를 인스턴스화
driver = webdriver.Chrome(binary)
params = []
for i in range(1,p_num+1):
url = "https://section.blog.naver.com/Search/Post.naver?pageNo="+str(i)+"&rangeType=ALL&orderBy=sim&keyword="+keyword
driver.get(url)
time.sleep(1)
html = driver.page_source
soup = BeautifulSoup(html,'html.parser')
base = soup.select('div.desc > a')
for i in base:
params.append(i.get('href'))
params2 = list(set(params))
from tqdm import tqdm_notebook # 속도 진행상황
f2 = open("c:\\data\\"+keyword+".txt","w",encoding = "utf8")
for k in tqdm_notebook(params2):
driver = webdriver.Chrome(binary)
driver.get(k)
element = driver.find_element_by_id("mainFrame") #iframe 태그 엘리먼트 찾기
driver.switch_to.frame(element)
html2 = driver.page_source
soup2 = BeautifulSoup(html2, 'html.parser')
#닉네임 크롤링
overlays = ".nick"
nick = driver.find_element_by_css_selector(overlays)
nickname = nick.text
nickname = re.sub('[\n\r\t]','',nickname)
#날짜 크롤링
try:
overlays = ".se_publishDate.pcol2"
date = driver.find_element_by_css_selector(overlays)
datetime = date.text
except:
continue
#내용 크롤링
content = soup2.select('div.se-component-content>div>div>p')
f2.write('\n\nurl주소 : '+k) # url 쓰기
f2.write('\n작성날짜: ' + datetime) # 날짜쓰기
f2.write('\n블로그 작성자['+nickname +']\n') # 닉네임 쓰기
for i in content:
if len(i.text) > 1:
f2.write(re.sub('[\n\r\t]','',i.text)+'\n') # 내용 크롤링하면서 쓰기
f2.close()
# 3. 감성분석 함수 sensitivity_ana()
def sensitivity_ana(keyword):
#1. 텍스트 파일 3개를 불러옵니다.
blog_review = open('C:\\data\\'+keyword+'.txt', encoding='utf-8-sig')
positive = open('C:\\data\\pos_pol_word.txt',encoding='utf-8-sig')
negative = open('C:\\data\\neg_pol_word.txt',encoding='utf-8-sig')
#2. 텍스트 파일 3개를 읽어들입니다.
blog_r = blog_review.read() # 게시글을 문자형 변수 blog_r 에 담는다.
pos = set(positive.read().split('\n')) # 긍정단어를 엔터로 구분해서 리스트로 구성
neg = set(negative.read().split('\n')) # 부정단어를 엔터로 구분해서 리스트로 구성
#3. pos 와 neg 리스트에서 결측치를 제거합니다.
pos = list(filter(lambda x:x,pos))
pos1 = set(pos) #중복되는 pos 의 단어를 제거
neg = list(filter(lambda x:x,neg))
pos1 = list(filter(lambda x:True if len(x)>1 else False, pos1))
neg = list(filter(lambda x:True if len(x)>1 else False, neg))
#4. 긍정단어를 갯수와 함께 word_pos.csv 에 저장합니다.
f2 = open("c:\\data\\word_pos.csv", "w", encoding="utf-8-sig")
# pos1.remove('정')
pos1.remove('ㅎㅎ')
pos1.remove('^^')
pos1.remove('이벤트')
pos_cnt = 0 # 긍정단어의 갯수를 담을 변수 생성
for i in pos1: # 긍정 단어들을 하나씩 불러와서 i 변수 담습니다.
if i in blog_r: # blog_r 라는 문자열 변수 안에 i 변수의 있는 긍정단어가 포함되어 있다면
#print(i+','+ str(blog_r.count(i))) # 그 단어를 출력하고 그 건수를 출력
f2.write( i + ',' + str(blog_r.count(i)) + '\n') # word_pos.csv 파일에 쓴다.
#4. 부정단어를 갯수와 함께 word_neg.csv 에 저장합니다.
f3= open("c:\\data\\word_neg.csv", "w", encoding="utf-8-sig")
"""
neg.remove('벌')
neg.remove('해')
neg.remove('화')
neg.remove('ㅜ')
neg.remove('ㅠ')
neg.remove('ㅜㅜ ')
neg.remove('저는')
neg.remove('마약')
neg.append('느끼')
neg.remove(':/')
neg.remove('ㅠㅠ ')
neg.remove(':)')
"""
neg_cnt = 0 # 부정단어의 갯수를 담을 변수 생성
for i in neg: # 부정 단어들을 하나씩 불러와서 i 변수 담습니다.
if i in blog_r: # blog_r 라는 문자열 변수 안에 i 변수의 있는 부정단어가 포함되어 있다면
#print(i+','+ str(blog_r.count(i))) # 그 단어를 출력하고 그 건수를 출력
f3.write( i + ',' + str(blog_r.count(i)) + '\n') # word_neg.csv 파일에 쓴다
f2.close()
f3.close()
#2. blog_r의 긍정단어 상위 50개 나열
import pandas as pd
# pd.set_option('display.max_rows', None)
word_pos = pd.read_csv("c:\\data\\word_pos.csv" , header=None)
word_pos.columns=['word', 'cnt']
word_pos['순위']=word_pos['cnt'].rank(method='first', ascending=False).astype('int')
a = word_pos[:].sort_values(by=['순위']).head(50)
print(a)
#3. blog_r의 부정 단어 상위 50개 나열
import pandas as pd
word_neg = pd.read_csv("c:\\data\\word_neg.csv" , header=None)
word_neg.columns=['word', 'cnt']
word_neg['순위']=word_neg['cnt'].rank(method='first', ascending=False).astype('int')
b = word_neg[:].sort_values(by=['순위']).head(50)
print(b)
# 분석 옵션 함수 my_data()
def my_data():
print('-'*20,'OPTION','-'*20)
print('\n1. 중앙일보 기사 데이터 스크롤링 \n2. 네이버 블로그 데이터 스크롤링\n3. 긍정,부정 감성분석\n')
print('-'*48)
num = int(input('▶ 옵션 번호를 입력하세요: '))
if num == 1:
keyword = input('▶ 키워드를 입력하세요: ')
num1 = int(input('▶ 더보기를 몇 번 하시겠습니까?: '))
choongang(keyword, num1)
### 문제446. 네이버 블로그도 같이 스크립트에서 실행되도록 하기.
elif num == 2:
keyword = input('▶ 키워드를 입력하세요: ')
p_num = int(input('▶ 더보기를 몇 번 하시겠습니까?: '))
n_blog(keyword, p_num)
### 문제447. 감성분석 코드도 스크립트에서 실행되게 하기.
elif num == 3:
keyword = input('▶ 키워드를 입력하세요: ')
sensitivity_ana(keyword)
|