본문 바로가기
NLP

구글 비트코인 뉴스 크롤링

by 볼록티 2019. 11. 29.
728x90
반응형

구글 검색창에 '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)

그리고 이를 통해 수집한 것에 대한 결과물을 확인할 수 있습니다.

 

 

 

 

 

 

728x90
반응형

'NLP' 카테고리의 다른 글

비정형 데이터 - 전처리  (0) 2019.12.16
비정형 데이터 - 소개  (0) 2019.12.16
구글 검색 뉴스 감성분석  (0) 2019.11.29
IMDB 영화 댓글 크롤링 코드  (2) 2019.11.28
코사인 유사도를 활용한 유사 문서 검색  (0) 2019.11.22

댓글