ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python/Crawling] 네이버 증권 주식 뉴스 크롤링
    Deep Learning/NLP 2021. 10. 29. 15:17

    미래에셋 금융 빅데이터 페스티벌에 참여하여 너무 감사하게도 본선에 진출하게 되었습니다.
    김정우(연예인 아님, 우리 팀 이름입니다) 사랑해~


    "키워드"를 이용하여 펀드를 보다 쉽게 이해시키는 과제를 받았고, 해당 키워드를 논리적으로 뽑아내기 위해 받았던 데이터 속 펀드명과 관련한 뉴스 데이터를 이용하기로 했습니다. 네이버 증권 뉴스 홈페이지에서 펀드 이름을 검색한 후, 뉴스 제목과 내용을 가져와 LDA 토픽모델링을 진행하는 것이 목적입니다. 군말말고 들어가보겠습니다.


    일단 필요한 패키지를 불러와 주고요. 저희는 검색과 클릭 기능을 사용한 동적 방법이 필요하기 때문에 크롬드라이버를 열어줍니다.

    import pandas as pd from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException import time import re from bs4 import BeautifulSoup from tqdm import tqdm driver = webdriver.Chrome(executable_path=r'본인의 경로\chromedriver.exe') driver.get('https://finance.naver.com/news/')


    네이버 증권 뉴스에서 검색어를 입력하면, 한 페이지 당 20개의 뉴스가 뜹니다. 보통의 뉴스 크롤링에서처럼, 기사 하나의 제목과 url을 따로 뽑아내고, 나중에 url에 접속해서 기사 내용을 가져오는 방식을 사용합니다.

    먼저

    1. 한 페이지에 존재하는 20개의 뉴스 제목과 url을 가져오는 함수를 정의합니다.

    # 하나의 페이지에서 뉴스 20개 긁어오기 def get_naver_news_urls(fund, search, source): # source(html)를 입력으로 results = [] soup = BeautifulSoup(source, 'lxml') tit_list = soup.find_all(attrs={'class':'articleSubject'}) for li in tit_list: title = 'NA' naver_url = 'NA' fund = fund search = search title = li.text url = 'https://finance.naver.com'+li.find('a').get('href') results.append([fund, search, title, url]) return results

    간혹 네이버 관련 사이트들은 get('href')같은 함수가 안먹혀서 이리저리 돌아가야되는 경우가 많은데 여기는 다행히 먹힙니다. 야호~


    2. 본격적으로 뉴스 url을 저장하는 함수 정의

    def get_1(fund, search): page1_results = [] total_results = [] driver.get('https://finance.naver.com/news/') # search = '삼성전자' driver.find_element_by_xpath('//*[@id="newsMainTop"]/div/div[2]/form/div/input').click() driver.find_element_by_xpath('//*[@id="newsMainTop"]/div/div[2]/form/div/input').send_keys(search) driver.find_element_by_xpath('//*[@id="newsMainTop"]/div/div[2]/form/div/a/input').click() time.sleep(1) myurl = driver.current_url try : for page in range(1,11) : # 100개 #print(str(page)+'크롤링 시작') source=driver.page_source page1_results = get_naver_news_urls(fund,search,source) # print(results, len(results)) total_results.extend(page1_results) # 다음 페이지 url = myurl+'&page='+str(page+1) driver.get(url) time.sleep(1) except NoSuchElementException: next print(len(total_results)) return total_results

    주석 처리해 놓은 print 부분은 크롤링이 제대로 돌아가는지 확인함을 위함입니다. 안쓰셔도 무방!


    3. 기사 내용 가져오기

    for i in range(len(df2)): url = df['URL'][i] driver.get(url) time.sleep(0.5) page = driver.page_source soup = BeautifulSoup(page,'lxml') content = soup.find('div', attrs = {'class':'articleCont'}).text df['뉴스내용'][i] = content

    저는 전에 모았던 url을 df라는 데이터프레임의 'URL' 열에 저장해놓았고, 내용은 df의 '뉴스내용' 열에 저장했습니다.


    간단하지만 강조하고 싶은 것은 sleep... 웹 상의 데이터를 가져오는 크롤링의 가장 기본 같아요..



    다들 화이팅입니당

Designed by Tistory.