ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • KT AIVLE School DX트랙 4주차-웹크롤링
    KT_Aivle_School/Python 2024. 3. 24. 21:54

    웹크롤링 기초와 네이버 증권 데이터 수집하기

    웹크롤링은 웹페이지에서 데이터를 추출하는 과정을 말합니다. 이 과정은 크게 정적인 페이지와 동적인 페이지로 나눌 수 있으며, 각각 다른 방법으로 데이터를 수집합니다.


    웹페이지의 종류

    • 정적인 페이지: 웹 브라우저에 화면이 한 번 뜨면 이벤트에 의한 화면의 변경이 없는 페이지입니다.
    • 동적인 페이지: 웹 브라우저에 화면이 뜨고 이벤트가 발생하면 서버에서 데이터를 가져와 화면을 변경하는 페이지입니다.

    데이터 수집 방법

    • requests 이용
      • json 문자열로 받아서 파싱하는 방법: 주로 동적 페이지 크롤링할 때 사용합니다.
      • html 문자열로 받아서 파싱하는 방법: 주로 정적 페이지 크롤링할 때 사용합니다.
    • selenium 이용
      • 브라우저를 직접 열어서 데이터를 받는 방법: 동적인 페이지에서 자바스크립트로 생성되는 데이터를 수집할 때 유용합니다.

    크롤링 방법에 따른 속도

    • requests json > requests html > selenium

    Crwaling Naver Stock Data

    네이버 증권 사이트에서 주가 데이터를 수집하는 과정을 살펴보겠습니다. 수집할 데이터는 일별 KOSPI, KOSDAQ 주가, 일별 환율(exchange rate) 데이터입니다.

    데이터 수집 절차

    1. 웹서비스 분석: URL을 분석합니다.
    2. 서버에 데이터 요청: request(url)response를 json 형태로 받습니다.
    3. 서버에서 받은 데이터 파싱: json 형태의 데이터를 list, dict로 변환 후 DataFrame으로 만듭니다.
    import warnings
    warnings.filterwarnings('ignore')
    import pandas as pd
    import requests
    
    # 1웹서비스 분석
    page, page_size = 1, 60
    url = f'https://m.stock.naver.com/api/index/KOSPI/price?pageSize={page_size}&page={page}'
    print(url)
    
    # 2서버에 데이터 요청
    response = requests.get(url)
    # response의 status code 확인
    
    # 3서버에서 받은 데이터 파싱
    columns = ["localTradedAt", "closePrice"]
    data = response.json()
    kospi_df = pd.DataFrame(data)[columns]
    kospi_df.tail(2)

    함수 만들기

    def stock_price(code="KOSPI", 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]

    시각화

    %matplotlib inline
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 데이터 수집
    kospi_df = stock_price("KOSPI", page_size=page_size)
    # 시각화
    plt.figure(figsize=(20, 5))
    plt.plot(kospi_df["localTradedAt"], kospi_df["closePrice"])
    plt.show()

    데이터 스케일링과 상관관계 분석

    데이터 스케일링과 상관관계 분석을 통해 데이터 간의 관계를 더 명확하게 이해할 수 있습니다.

    from sklearn.preprocessing import minmax_scale
    # 데이터 스케일링
    plt.figure(figsize=(20, 5))
    plt.plot(kospi_df["localTradedAt"], minmax_scale(kospi_df["closePrice"]))
    plt.show()

    # 상관관계 분석
    corr_df = kospi_df.corr()
    sns.heatmap(corr_df, cmap="YlGnBu", annot=True)
    plt.show()

Designed by Tistory.