멋사 AISCOOL 7기 Python/INPUT
[크롤링] FinanceDataReader, 네이버금융 뉴스기사 크롤링
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)