Notice
Recent Posts
Recent Comments
Link
01-02 02:57
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

AI 전문가가 되고싶은 사람

웹 크롤링 - 1일 본문

기자단 활동

웹 크롤링 - 1일

Kimseungwoo0407 2024. 3. 7. 18:41

● 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)

closePrice가 object -> float로 변경

# 데이터 전처리 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()

 

FUT와 KPI200

왜 이렇게 비슷한 지 주식에 관심이 없어서 모르겠지만 신기하다!