# tqdm: 진행상황을 보여주는 라이브러리, trange라고 하면 범위내에서 진행상황을 알려줌
# pd.read_html의 오류
# requests
# requests를 통한 HTTP요청
# 라이브러리 로드
import pandas as pd
import numpy as np
import requests
# 종목번호와 상장사 이름을 item_code와 item_name으로 설정
item_code = "005930"
item_name = "삼성전자"
page_no = 1
# 종목 URL 만들기
url = f"<https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}>"
# requests를 통한 HTTP 요청
response = requests.get(url, headers={'user-agent' : 'Mozilla/5.0'})
response
# 결과로 <response[200]> 이 출력욈, 이는 http상태코드
response.text
</response[200]>
# BeautifulSoup 을 통한 table 태그 찾기
from bs4 import BeautifulSoup as bs
html = bs(response.text)
html.title
html.a #링크를 의미함, 잘 안씀
html.find_all('a') #링크를 모두 가져옴
html.select('a') #a태그에 있는 기능을 모두 가져움
html.select('body > table') #html.table
html.select(" table > tr > td")
html.select("body > table.type2") #일별시세 테이블
#판다스 코드 한줄로 네이버 금융 일자별 시세를 페이지별로 수집하기
def get_day_list(item_code, page_no):
"""
일자별 시세를 페이지별로 수집
1) url을 만든다.
2) requests를 통해서 html 문서를 받아온다
3) read_html을 통해 table 태그를 읽어온다. pd.read_html(response.text) 하면 html내에 있는 테이블 태그만 불러옴
4) 결측행을 제거
5) 데이터 프레임 반환
"""
url = f"<https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}>"
response = requests.get(url, headers={'user-agent' : 'Mozilla/5.0'})
table = pd.read_html(response.text)
tmp = table[0]
df = tmp.dropna()
df = df.reset_index(drop=True)
return df
#반복문을 통한 전체 일자 및 페이지에 대한 데이터 수집하기
def get_item_list(item_code, item_name):
"""
일별 시세를 수집하는 함수
"""
page_no = 1
# 데이터를 저장할 빈 변수 선언
item_list = []
prev_day = ""
while True:
df_item = get_day_list(item_code, page_no)
last_day = df_item.iloc[-1]["날짜"]
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 = pd.concat(item_list)
df["종목코드"] = item_code
df["종목명"] = item_name
#컬럼 위치 변환
cols = ['종목코드', '종목명', '날짜', '종가', '전일비', '시가', '고가', '저가', '거래량']
df = df[cols]
df = df.drop_duplicates()
df = df.reset_index(drop=True)
#파일에 저장 후 파일명 반환
date = df.iloc[0]["날짜"] #최근날짜 가져오기
file_name = f"{item_name}_{item_code}_{date}.csv"
df.to_csv(file_name, index=False)
return file_name
# JSON
# 라이브러리를 불러옵니다.
import pandas as pd
import numpy as np
import requests
#requests를 통한 HTTP요청
url = '<https://finance.naver.com/api/sise/etfItemList.nhn?etfType=0&targetColumn=market_sum&sortOrder=desc>'
response = requests.get(url)
#JSOON타입으로 데이터 받기
etf_json = response.json()
#JSON에서 원하는 데이터 찾기
#JSON View를 통해서 확인: result > etfItemList 의 하위 구조로 목록을 찾고자 하는 데이터
etfItemList = etf_json["result"]["etfItemList"]
#데이터 프레임 변환
# 키-값 형태의 데이터를 데이터프레임으로 만듭니다.
df = pd.DataFrame(etfItemList)
#오늘날짜로 파일명 저장
from datetime import datetime
today = datetime.today().strftime("%Y-%m-%d")
file_name = f"etf_{today}_raw.csv"
#파일 저장하고 불러오기
# itemcode 숫자 앞의 0 이 지워진다면 dtype={"itemcode": np.object} 로 타입을 지정해 주면 문자형태로 읽어옵니다.
df.to_csv(file_name, index=False)
pd.read_csv(file_name, dtype={"itemcode":"object"})
[시각화] Plotly (0) | 2022.10.27 |
---|---|
[크롤링 & EDA] 메인 및 상세 페이지 수집 함수 만들기: 서울특별시 다산콜센터의 주요 민원 (0) | 2022.10.26 |
[크롤링] FinanceDataReader, 네이버금융 뉴스기사 크롤링 (0) | 2022.09.28 |
[EDA] 범주형데이터 기술통계 및 시각화 (0) | 2022.09.28 |
[EDA] 추상화된 도구로 기술통계량 구하기, 수치형변수 시각화, 상관분석 및 상삼각으로 시각화 (0) | 2022.09.28 |