구글 검색창에 'bitcoin'을 검색하여 나온 뉴스들에 대한 크롤링을 하였습니다.
1. 날짜별로 검색을 하게하고, 출력된 뉴스들의 링크를 가져옵니다.
-> 신문사를 몇개 정해놓고 정한 신문사에 해당하는 뉴스 링크만 가져왔습니다.
2. 뉴스들의 링크를 가지고 기사 내용을 수집해옵니다.
-> 신문사 홈페이지마다 html형식이 다르기 때문에 각각 형식에 맞게 크롤링 코드를 만들어 줍니다.
1. 뉴스 링크 가져오기 ( + 날짜, 제목, url )
-사용될 모듈들을 우선 임포트 해줍니다.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
import pandas as pd
from datetime import datetime
import re
-datetime함수를 활용하여 원하는 날짜에 'bitcoin'이 검색된 페이지를 얻어 냅니다.
datetime안에 2017,10,5 를 입력하면 2017년 10월 5일에 'bitcoin' 뉴스를 검색한 링크를 얻을 수 있습니다.
datatime 안에 2019, 7, 10을 입력하면 2019년 7월부터 10월까지 크롤링을 하게 됩니다.
date_30 = [4, 6, 9, 11]
date_28 = [2]
date_31 = [1, 3, 5, 7, 8, 10, 12]
def datetime(y,m1,m2): # 2017,9,12 하면 2017년 9월에서 12월까지의 일별 url
url_result=dict() #결과
for i in range(m1,m2+1):
month=i
if i in date_31:
for j in range(1,32):
day=j
month_day=str(y)+"-"+str(i)+"-"+str(j)
date = [str(y),str(i),str(j)]
duration = '%2Ccd_min%3A{0}%2F{1}%2F{2}%2Ccd_max%3A{3}%2F{4}%2F{5}'.format(date[1], date[2], date[0], date[1], date[2], date[0])
base_url = 'https://www.google.com/search?q=bitcoin&biw=1005&bih=842&source=lnt&tbs=cdr%3A1'+ duration + '&tbm=nws'
url_result[month_day]=base_url
elif i in date_28:
for j in range(1,29):
day=j
month_day=str(y)+"-"+str(i)+"-"+str(j)
date = [str(y),str(i),str(j)]
duration = '%2Ccd_min%3A{0}%2F{1}%2F{2}%2Ccd_max%3A{3}%2F{4}%2F{5}'.format(date[1], date[2], date[0], date[1], date[2], date[0])
base_url = 'https://www.google.com/search?q=bitcoin&biw=1005&bih=842&source=lnt&tbs=cdr%3A1'+ duration + '&tbm=nws'
url_result[month_day]=base_url
else:
for j in range(1,31):
day=j
month_day=str(y)+"-"+str(i)+"-"+str(j)
date = [str(y),str(i),str(j)]
duration = '%2Ccd_min%3A{0}%2F{1}%2F{2}%2Ccd_max%3A{3}%2F{4}%2F{5}'.format(date[1], date[2], date[0], date[1], date[2], date[0])
base_url = 'https://www.google.com/search?q=bitcoin&biw=1005&bih=842&source=lnt&tbs=cdr%3A1'+ duration + '&tbm=nws'
url_result[month_day]=base_url
return url_result
d1= datetime(2017,9,11)
d2= datetime(2018,1,12)
d3= datetime(2019,1,9)
d1.update(d2)
d1.update(d3)
DATE= [a for a in d1.keys()]
url_list=[a for a in d1.values()]
-> DATE에는 검색한 날짜를 리스트로 넣어주고, url_list에는 해당 날짜에 해당하는 검색화면 url을 넣었습니다
- 함수들을 선언해줍니다. (같은 랩실에 독실한 P형의 빠른 코드입니다.( _ _ ) )
get_company_url(a): a에 url을 주면 신문사, 제목, url을 뱉어 리턴하게 됩니다.
filter_company(b)는 위의 함수의 리턴값을 주면 우리가 정한 회사인지 아닌지 판단해서 한번 걸러내는 함수입니다.
date_column(c)는 위의 리턴값을 c에 넣으면 수집한 데이터프레임에 각 url별 날짜를 나타내주는 열하나를 붙여주는 역할을 합니다.
def get_company_url(a):
driver.get(a)
# driver를 이용하여 가져오기
contents_url = driver.find_elements_by_css_selector("a.l.lLrAF")
contents_comp = driver.find_elements_by_css_selector('div.gG0TJc')
# 각 url과 뉴스사를 리스트로 만들기
list_company = []
for i in contents_comp:
a = i.find_elements_by_css_selector('span.xQ82C.e8fRJf')
for j in a:
list_company.append(j.text)
list_url = []
for i in contents_url:
list_url.append(i.get_attribute('href'))
list_title = []
for i in contents_url:
list_title.append(i.text)
# dataframe으로 만들기
list_merge = [list_company, list_title, list_url]
col_names = ['company', 'title', 'url']
df_ = pd.DataFrame(list_merge)
df = df_.T
df.columns = col_names
return df
# company filtering 함수로 보내기
# filter_company(df)
def filter_company(b):
# company에 있는 뉴스사들만 추출하기
company_list = ['newsBTC', 'Cointelegraph', 'CoinTelegraph','Coindesk', 'BelnCrypto', 'Bitcoinist', 'Bitcoin News',
'CNBC', 'The Guardian', 'BBC news', 'Reuters', 'Business Week', 'The Economist',
'Bloomberg', 'The Wall Street Journal', 'Forbes','Bitcoin News (press release)','CoinDesk']
filter_df = b[b['company'].isin(company_list)]
return filter_df
# date_column(filter_df)
def date_column(c):
date_list = []
for i in range(len(c.index)):
date_list.append(DATE)
c.insert(0, 'date', date_list)
return c
-이제 뉴스검색화면이 뜨고 그 화면에 페이지가 여러개나 나뉘어 있다면, 페이지를 넘겨가면서 위의 함수들을 실행하여 각각의 뉴스 링크, 회사, 날짜, url을 수집하여 최종 결과물을 FINAL에 넣어줍니다.
# 페이지 넘기며 신문사, 뉴스, 날짜 수집
driver = webdriver.Chrome(r"C:\Users\rok80\Anaconda3\네이버뉴스\chromedriver_win32\chromedriver.exe")
driver.set_page_load_timeout("10")
FINAL=[]
for DATE, URL in zip(DATE[:], url_list[:]):
time.sleep(1)
driver.get(URL) # 페이지 입장
time.sleep(3)
print("웹페이지 인덱스" , url_list.index(URL), "/",len(url_list) )
r1 = get_company_url(URL)
r2 = filter_company(r1)
r3 = date_column(r2)
FINAL.append(r3)
for count in range(999):
if count==0:
try:
soup = BeautifulSoup(driver.page_source)
h1= soup.find_all("a", class_="pn")
h2='http://www.google.com'+h1[0]['href'] # 다음버튼 url
driver.get(h2)
time.sleep(3)
except Exception as ex:
print('더이상 "페이지" 없음', ex)
break
else:
try:
soup = BeautifulSoup(driver.page_source)
h1= soup.find_all("a", class_="pn")
h2='http://www.google.com'+h1[1]['href'] # 다음버튼 url
driver.get(h2)
time.sleep(3)
except Exception as ex:
print('더이상 "페이지" 없음', ex)
break
driver.close()
- url 수집결과 확인
result = pd.concat(FINAL)
print(result)
그리고 이를 통해 수집한 것에 대한 결과물을 확인할 수 있습니다.
'NLP' 카테고리의 다른 글
비정형 데이터 - 전처리 (0) | 2019.12.16 |
---|---|
비정형 데이터 - 소개 (0) | 2019.12.16 |
구글 검색 뉴스 감성분석 (0) | 2019.11.29 |
IMDB 영화 댓글 크롤링 코드 (2) | 2019.11.28 |
코사인 유사도를 활용한 유사 문서 검색 (0) | 2019.11.22 |
댓글