import time
from tqdm import trange
page_no = 1
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.01)
네이버 금융 국내증시 https://finance.naver.com/sise/ 에서 url을 가져온다.
inspect-network : css는 스타일, doc 등 클릭해보면서 원하는 데이터를 찾을 수 있다.
import pandas as pd
import numpy as np
import requests
item_code =
item_name =
page_no = 1
url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"
2-1. pd.read_html(url)
테이블을 찾을 수 없다고 오류가 난다.
read_html은 테이블 태그가 있어야 불러올 수 있다.
url 들어가서 inspect 해보면 테이블 태그가 있는데도 불러올 수 없다. 이유는 접근 권한을 막아놔서
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
HTML 정보를 파싱해서 원하는 정보를 찾아온다.
BeautifulSoup(html_doc)해주면 구조화되어 있지 않던 response 출력 결과 문서를 보기 좋게 정렬해준다.
함수 생성에 beautifulsoup을 사용 안하는 이유는? pd.readhtml에 테이블 태그 기능이 내장되어 있기 때문
4.1 from bs4 import BeautifulSoup as bs
4.2 bs(response.text)를 html에 넣어서 불러서 사용하자. : html = bs(response.text)
4.3 공식 사이트의 매서드를 보자 : html.title/ .table / pd.DataFrame(html.table)
4.4 find_all과 select의 차이
4.5 select 지정 순서
5-1. pd.read_html
5-2. 페이징 테이블 제거
5-3. .dropna()
뉴스 기사 수집과 일별 시세 수집에서의 차이? - 테이블 접근 권한 때문에 user_agent를 썼다.
def get_day_list(item_code, page_no):
url을 만든다.
url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}"
requests를 통해 html 문서를 받아온다.
response = request.get(url, headers = {"user-agent" : "Mozilla/5.0"})
read_html을 통해 table 태그를 읽어온다.
table = pd.read_html(response.text)
결측행을 제거
temp = table[0]
temp.dropna()
데이터 프레임을 반환
return temp
-> 조은님 코드 : 한줄로 해주는 경우
df_table = pd.read_html(response.text)[0].dropna()
return df_table
쏘카도 데이터가 적어서 실습했다. item_code = "403550" , item_name = "쏘카"
for문은 갯수가 정해져 있을 때.(1~10페이지까지 수집하겠다.)
마지막 페이지를 모를 경우 while문
import time
item_code = "373220"
item_code = "LG에너지솔루션"
page_no = 1
# 데이터를 저장할 빈 변수 선언
item_list=[]
curr_day = ""
# curr_day = None해도됨
# last_day랑 비교할 초기값을 아무거나 설정해주어야 함.
while True:
# 한 페이지의 일별 시세 수집
df_item = get_day_list(item_code, page_no)
# 해당 데이터의 마지막 날짜를 가져옴
last_day = df_item.iloc[-1]["날짜"]
print(page_no, curr_day, last_day)
# 해당 데이터의 마지막 날짜와 이전 데이터의 마지막 날짜 비교
# 맨 첫 데이터에는 이전 데이터 날짜가 없기 때문에 반복문 밖에서 초기화를 해주었음.
# 이전 데이터의 마지막 날짜와 현재 데이터의 마지막 날짜가 같다면 반복문을 빠져나감.
if last_day == curr_day:
break
# 현재 데이터의 날짜를 다음 턴에서 비교할 수 있게 변수에 값을 넣어줌.
curr_day = last_day
# 수집한 일별 시세를 리스트에 추가
item_list.append(df_item)
# 다음 페이지를 수집하기 위해 페이지 번호 증가
page_no = page_no + 1
time.sleep(0.01)
df_day = pd.concat(item_list)
df_day["종목코드"]=item_code
df_day["종목명"]=item_name
cols = ['종목코드', '종목명', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량']
df_day = df_day[cols]
df_day.head(2)
df_day = df_day.drop_duplicates()
9-1. 날짜 column의 첫 row 값 확인
date = df_day.iloc[0]["날짜"]
date
9-2. 종목명, 종목코드, 날짜를 이름으로 하는 csv 파일명 만들기
filename = f"{item_name}{itemcode}{date}.csv"
file_name
9-3. 파일로 저장
df_day.to_csv(file_name, index=False)
제대로 저장되었는지 read로 확인
pd.read_csv(file_name)
def get_day_list(item_code, page_no):
page_no = 1
item_list = []
prev_day = None
while True:
df_item = get_day_list(item_code, page_no)
last_day = df_item.iloc[-1]["날짜"]
print(page_no, prev_day, last_day)
if last_day == prev_day:
break
prev_day = last_day
item_list.append(df_item)
page_no = page_no + 1
time.sleep(0.01)
df_day = pd.concat(item_list)
df_day["종목코드"] = item_code
df_day["종목명"] = item_name
cols = ['종목코드', '종목명', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량']
df_day = df_day[cols]
date = df_day.iloc[0]["날짜"]
file_name = f"{item_name}_{item_code}_{date}.csv"
df_day.to_csv(file_name, index=False)
return file_name
ETF 네이버 금융 사이트의 데이터 수집 https://finance.naver.com/sise/etf.nhn
1-1. 라이브러리
판다스, 넘파이, requests 불러온다.
1-2. url
url = "https://finance.naver.com/sise/etf.nhn"
1-3. pd. read_html(url)
지금까지 한 것은 웹스크래핑 방식으로 한 것이고, 지금은 API를 통해 가져오는 것을 실습
키워드 : 키-값 쌍 / XML
2-1. requests
url = "https://finance.naver.com/api/sise/etfItemList.nhn?etfType=0&targetColumn=market_sum&sortOrder=desc"
response = requests.get(url)
2-2. pd.read_html(response.text)
2-3. requests의 응답을 json 타입으로 받기
etf_json = response.json()
2-4. result > etfItemList
etfItemList = etf_json["result"]["etfItemList"]
print(len(etfItemList))
etfItemList[-1]
여기 len() 해주는 거랑 이해 안된다
2-5. 데이터프레임 형태로 만들기
df = pd.DataFrame(etfItemList)
2-6. 파생변수 만들기
df["브랜드"] = df["itemname"].str.split(expand = True)[0]
3-1. 파일명 만들기
from datetime import datetime
today = datetime.today().strftime("%Y-%m-%d")
file_name = f"dtf-{today}_raw.csv
3-2. 저장하고 불러오기
df.to_csv(file_name, index=False)
pd.read_csv(file_name, dtype={"itemcode" : np.object})
10/12문제
1. 틀린 것
item_code = df_krx.loc[df_krx["Name"]=="넷마블", "Symbol"].values[0] 이 코드에서 .values[0]가 의미하는 것 까먹었다. 다시 찾아보기iloc와 loc 다시 구분 찾아보기df.reset_index(drop=True) 를 어디서 썼는지 실습 파일 찾아보기