상세 컨텐츠

본문 제목

[크롤링] FinanceDataReader, 네이버금융 뉴스기사 크롤링

멋사 AISCOOL 7기 Python/INPUT

by dundunee 2022. 9. 28. 23:34

본문

# FinanceDataReader

  • 한국 주식 가격, 미국주식 가격, 지수, 환율, 암호화폐 가격, 종목 리스팅 등 금융 데이터 수집 라이브러리
  • 데이터를 가져올 수 있는 방법을 제공하고 있음
!pip install -U finance-datareader

import FinanceDataReader as fdr
  • 한국거래소 상장종목 전체 가져오기
# KRX : KRX 종목 전체
df = fdr.StockListing("KRX")
#요약, 기술통계, sorting등 데이터프레임형태로 가공할 수 있음
  • 파일로 저장하고 읽어오기
# to_csv로 Dataframe을 데이터 저장용 파일인 CSV 파일로 바꿀 수 있습니다.
df.to_csv("krx.csv",index = False, encoding = "cp949")

# CSV로 저장된 파일을 다시 DataFrame으로 읽어서 확인해 봅니다.
pd.read_csv("krx.csv", encoding = "cp949")

  # 데이터수집/웹스크래핑 시 확인/주의해야 할 사항

  • 저작권
  • 로봇 배제 표준
  • 네트워크부담

#웹페이지를 구성하는 HTML과 CSS

  • html이란 소스코드로 웹페이지가 구성되어 있음
  • table tag 형태로 되어 있다면 판다스로 불러올 수 있음

# 네이버금융 뉴스기사 한 페이지 크롤링: Only Pandas

#url가져오기

페이지 확인 → 검사 → network → 확인

 

#페이지 수집해서 데이터프레임에 저장하기

#수집할 url 가져오기
item_code = "035720"
item_name = "카카오"

# url: f-string
url = f"<https://finance.naver.com/item/news_news.nhn?code={item_code}&page=1&sm=title_entity_id.basic&clusterId=>"

#데이터프레임에 담기: pd.read_html
table = pd.read_html(url)
cols = table[0].columns #컬럼 인덱스만 추출하기

#반복문으로 데이터 가져오기
temp_list = []

for news in table[:-1]: #페이징부분 제외하고 가져오기
    news.columns = cols #컬럼 넣기
    temp_list.append(news)
    display(news)

# 수집한 데이터 합치기: pd.concat
df_news = pd.concat(temp_list)
df_news

#전처리

#결측치 처리
df_news.dropna()

#인덱스번호 순차로 초기화
df_news = df_news.reset_index(drop=True)

#특정단어 제거'~'는 반대를 뜻함, str.contains
df_news[~df_news["정보제공"].str.contains("연관기사")].copy()

#중복값 제거
df_news.drop_duplicates()

 

# 함수로 만들기

def get_one_page_news(item_code, page_no):
    """
    get_url 에 item_code, page_no 를 넘겨 url 을 받아오고
    뉴스 한 페이지를 수집하는 함수
    1) URL 을 받아옴
    2) read_html 로 테이블 정보를 받아옴
    3) 데이터프레임 컬럼명을 ["제목", "정보제공", "날짜"]로 변경
    4) temp_list 에 데이터프레임을 추가
    5) concat 으로 리스트 병합하여 하나의 데이터프레임으로 만들기
    6) 결측치 제거
    7) 연관기사 제거
    8) 데이터프레임 반환
    """
    url = f"<https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId=>"
    table = pd.read_html(url)
    cols = table[0].columns

    temp_list = []
    for news in table[:-1]:
        news.columns = cols
        temp_list.append(news)
    
    df_news = pd.concat(temp_list)

    df_news.dropna()
    df_news = df_news.reset_index(drop=True)
    df_news = df_news[~df_news["정보제공"].str.contains("연관기사")].copy()
    df_news = df_news.drop_duplicates()

    return df_news

item_code = "035720"
page_no = 2

temp = get_one_page_news(item_code, page_no)
temp

# FinanceDataReader로 “기아” 종목코드(item_code)받아와서 뉴스 목록 전체 출력

!pip install -U finance-datareader

import FinanceDataReader as fdr
import time
from tqdm import trange

#종목코드와 페이지번호로 페이지 받아오는 함수 정의
def get_ne_page_news(item_code, page_no):
		url = f"<https://finance.naver.com/item/news_news.nhn?code={item_code}&page={page_no}&sm=title_entity_id.basic&clusterId=>"
    table = pd.read_html(url)
    cols = table[0].columns

    temp_list = []
    for news in table[:-1]:
        news.columns = cols
        temp_list.append(news)
    
    df_news = pd.concat(temp_list)

    df_news.dropna()
    df_news = df_news.reset_index(drop=True)
    df_news = df_news[~df_news["정보제공"].str.contains("연관기사")].copy()
    df_news = df_news.drop_duplicates()

    return df_news

#"기아" 종목코드 krx에서 찾기
df_krx = fdr.StockListing("KRX")
item_name = "기아"
item_code = df_krx.loc[df_krx["Name"] == item_name, "Symbol"].values[0]

#전체 페이지 받아오는 반복문 실행
news_list = []
for page_no in trange(1, 11):
    temp = get_one_page_news(item_code, page_no)
    news_list.append(temp)
    time.sleep(0.1)

#데이터프레임으로 변환
df_news = pd.concat(news_list)

#파일 저장
filename = f"news{itemcode}{item_name}.csv"
df_news.to_csv(file_name, index=False)

관련글 더보기