AI 전문가가 되고싶은 사람
웹 크롤링 - 1일 본문
● URL ( Uniform Resource Locator )
http://news.naver.com:80/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=001&aid=0009847211#da_727145
해당 주소의 '?'를 바탕으로 앞부분은 파일 찾기, 뒷부분은 data를 찾는 것이라고 한다
- http, https : Protocol ( 규칙 )
- News : Sub Domain
- naver.com - Primary Domain
- 80 - Port ( app 접속할 때 사용 80, 443 ( http, https ) 생략이 가능해서 잘 볼 일 없을 듯
- jupyter notebook을 켰을 때 주소에 8888의 경우 내 pc로 접속하면 그렇게 나옴
- /main/ - Path ( 서버 컴퓨터에 main에 있는 디렉터리 )
- read.nhn - Page ( File ) Path를 통해 찾아 들어간다
- mode = LSD - Query
- da_727145 - Fragment
● 웹 크롤링 방법
- 웹페이지의 종류
1. 정적인 페이지 : 웹 브라우저에 화면이 한번 뜨면 이벤트에 의한 화면의 변경이 없는 페이지, 웹 서버에 이미 저장된 파 일을 클라이언트에게 전송하는 웹 페이지
2. 동적인 페이지 : 웹 브라우저에 화면이 뜨고 이벤트가 발생하면 서버에서 데이터를 가져와 화면을 변경하는 페이지, 사 용자가 상황, 시간, 요청 등에 따라 달라지는 웹 페이지를 보게 됨
- requests 이용 : 받아 오는 문자열에 따라 두가지 방법으로 구분
1. json 문자열로 받아서 파싱하는 방법 : 주로 동적 페이지 크롤링할때 사용
2. html 문자열로 받아서 파싱하는 방법 : 주로 정적 페이지 크롤링할때 사용
- selenium 이용 : 브라우저를 직접 열어서 데이터를 받는 방법
- 크롤링 방법에 따른 속도 : requests json > requests html >>> selenium
● 네이버 증권 사이트에서 주가 데이터 수집
○ 수집할 데이터 : 일별 선물, 코스피 200
○ 데이터 수집 절차 : url( 웹서비스 분석) -> request(url) > response : json(str) ( 서버에 데이터 요청 ) -> json(str) > list, dict > DataFrame ( 서버에서 받은 데이터 파싱( 데이터 형태를 변경 )
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import requests
1. 웹서비스 분석 : url ( pc 웹페이지가 너무 복잡하면 mobile로 해도 된다 )
url = 'https://m.stock.naver.com/api/index/FUT/price?pageSize=10&page=3'
url
2. 서버에 데이터 요청 : request(url) > response : json(str) + status code가 200이 나오는지 확인 안나오면 막힌 것
response = requests.get(url)
response
request.text[:200]
3. 서버에서 받은 데이터 파싱( 데이터 형태를 변경 ) : json(str) > list, dict > DataFrame
data = response.json()
df = pd.DataFrame(data)[columns]
df.head(2)
4. 함수로 만들기 ( code 부분은 FUT : 선물, KPI 200 : 코스피 200 )
def stock_price(code="FUT", page =1, page_size = 60):
url = f'https://m.stock.naver.com/api/index/{code}/price?\pageSize={page_size}&page={page}'
response = requests.get(url)
columns = ['localTradedAt','closePrice']
data = response.json()
return pd.DataFrame(data)[columns]
df = stock_price()
df.head(2)
5. 시각화
%matplotlib inline
%config InlineBackend.figure_formats = {'png', 'retina'}
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 수집
page_size = 60
FUT_df = stock_price("FUT", page_size=page_size)
KPI200_df = stock_price("KPI200", page_size=page_size)
# 데이터 전처리 1 : 데이터 타입 변경
FUT_df["FUT"] = FUT_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
FUT_df = FUT_df.drop(columns=["closePrice"])
KPI200_df["KPI200"] = KPI200_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
KPI200_df = KPI200_df.drop(columns=["closePrice"])
# 데이터 전처리 2 : 날짜 데이터 맞추기 : merge
merge_df = pd.merge(FUT_df,KPI200_df, on = 'localTradedAt')
# 시각화
plt.figure(figsize = (20,5))
columns = merge_df.columns[1:]
for column in columns:
plt.plot(merge_df['localTradedAt'], merge_df[column], label=column)
xticks_count = 11
plt.xticks(merge_df['localTradedAt'][::int(len(merge_df) // xticks_count) +1])
plt.legend(loc=0)
plt.show()
왜 이렇게 비슷한 지 주식에 관심이 없어서 모르겠지만 신기하다!
'기자단 활동' 카테고리의 다른 글
[KT 에이블스쿨 기자단] 1주차 회고 (0) | 2024.04.19 |
---|---|
[KT 에이블스쿨 기자단] AI 트랙 합격 후기 (0) | 2024.04.19 |
분산 분석 ( ANOVA) 및 이변량 분석 복습 (0) | 2024.03.01 |
가설 검정, 중심 극한 정리, t-test 정리 및 복습 (2) | 2024.02.28 |
파이썬 시각화와 단변량 분석 복습 ( + 시계열 데이터 처리 ) (1) | 2024.02.28 |