본문 바로가기

코딩

파이썬 네이버 주식 매매동향 스크랩

하다 보니 가져오고 싶은 정보가 한둘이 아니다...

매매동향도 궁금해서 이어서 만들어보았다.

 

import pandas as pd
import numpy as np
import requests
import lxml
from bs4 import BeautifulSoup
from requests import Response

df_code = pd.read_html('https://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
df_code.종목코드 = df_code.종목코드.map('{:06d}'.format)

def code_search(name):
    ticker = df_code[df_code.회사명 == name].종목코드.iat[0]
    return ticker

 

여기까지는 이전 작성글과 동일한 내용이다.

위 내용이 뭔지 궁금하면 파이썬 네이버 금융 기업 정보 스크랩 여기를 봐주세요.

 

우선 네이버 금융의 투자자별 매매동향 페이지를 보면, 우리가 궁금한 외국인과 기관의 투자 동향은 다음과 같은 표로 나타나 있다. 그리고 일자별로 여러 페이지로 나눠져 있는 것을 확인할 수 있다.

그래서 저 페이지들을 차례로 넘기면서 확인하고, 각각 확인한 내용을 하나로 이어 붙이는 방식으로 생각해 보았다.

 

F12를 눌러 개발자도구를 열어서 확인하면 어떤 주소가 변하면서 정보를 불러오는지 확인이 가능하다. 아래 사진의 가장 오른쪽 박스에서 보면, 주소 뒤에 종목코드와 페이지를 설정해주면 내가 원하는 데이터가 표시되도록 할 수 있다.

종목코드는 계속 변경할 필요가 없지만, 원하는 날짜까지 가려면 페이지는 변경할 필요가 있어 루프를 돌려 1페이지부터 25페이지까지 읽기로 했다.. 한 달에 대충 20 영업일이 있다고 보고, 2년치면 24페이지 + 넉넉 1페이지 해서 25페이지로 정했다. 이 정도는 루프 돌려도 그렇게 오래 걸리지 않아서 더 읽어오고 싶으시다면 페이지를 늘려도 크게 부담은 없을 것 같다. 

 

그래서 우선 매매동향을 데이터프레임으로 저장하기 위해 trends라는 빈 데이터 프레임을 생성하고, 여기에 루프를 각각 이어서 저장하기로 했다. 

그리고 request함수로 불러올 때 header가 없으면 웹 페이지가 봇이라고 판단해서 접근을 막아버린다. 어케 알았냐... 유저처럼 보이기 위해서는 유저 정보를 header에 저장해 requset를 사용할 때 넣어주어야 한다. 아니면 직접 적어도 되는데 너무 길어 보이고 귀찮다. 

이후에는 html 데이터를 불러와서 저장하면 된다.

 

여기까지 하면 아래와 같은 코드가 된다. code_name은 원하는 종목을 찾기 위해서!

trader_day는 원하는 테이블이 아니라 다른 테이블 옵션이라 신경 안쓰셔도 됩니다.

 

def crawl_trends(name):
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
    trends = pd.DataFrame()
    code = code_search(name)

    for i in range(1,25):
        url = 'https://finance.naver.com/item/frgn.naver?code=' + code + "&page=" + str(i) + "&trader_day=1"
        res = requests.get(url, headers = headers)
        page_soup = BeautifulSoup(res.text, "lxml")
        trends_html = page_soup.select_one('div.section.inner_sub > table.type2')

 

반응형

 

 

이어서, 내가 원하는 정보가 html에서 어디에 저장되어있는지 알고 싶다면 개발자도구의 커서 모양을 누르고 원하는 부분을 클릭하면 Elements에서 어디에 해당하는지 바로 보여준다. 해당 부분의 css선택자를 복사하면 html 태그를 얻을 수 있다.

 

 

각각 원하는 정보들의 위치를 확인했다면 태그를 이용해 따로 저장하면 된다.

이어서 행 열에 맞게 데이터 형태를 바꾼 후, 데이터프레임으로 변환하여 저장한다.

이 과정은 아래에서 확인해 주세요.

 

최종 코드를 보면 다음과 같다. 

 

import pandas as pd
import numpy as np
import requests
import lxml
from bs4 import BeautifulSoup
from requests import Response

df_code = pd.read_html('https://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
df_code.종목코드 = df_code.종목코드.map('{:06d}'.format)

def code_search(name):
    ticker = df_code[df_code.회사명 == name].종목코드.iat[0]
    return ticker


def crawl_trends(name):
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
    trends = pd.DataFrame()
    code = code_search(name)

    for i in range(1,25):
        url = 'https://finance.naver.com/item/frgn.naver?code=' + code + "&page=" + str(i) + "&trader_day=1"
        res = requests.get(url, headers = headers)
        page_soup = BeautifulSoup(res.text, "lxml")
        trends_html = page_soup.select_one('div.section.inner_sub > table.type2')

        date_data = np.array([item.get_text().strip() for item in trends_html.select('td.tc')])
        col_data = np.array([item.get_text().strip() for item in trends_html.select('th')])
        col_data = np.delete(col_data,(0,7,8))
        trends_data = np.array([item.get_text().strip() for item in trends_html.select('td.num')])

        trends_data.resize(len(date_data),len(col_data))
        trend = pd.DataFrame(trends_data[0:,0:],index = date_data, columns = col_data)
        trends = pd.concat([trends,trend])
    return trends

 

실제로 실행해 보면 잘 돌아간다.

 

temp = crawl_trends("삼성전자")

temp.head(10)
              종가  전일비  등락률  ...     외국인       보유주수     보유율
2022.01.07  78,300  1,400  +1.82%  ...  +4,358,429  3,110,611,574  52.11%
2022.01.06  76,900    500  -0.65%  ...  +2,216,479  3,106,253,145  52.03%
2022.01.05  77,400  1,300  -1.65%  ...    -615,111  3,103,895,896  51.99%
2022.01.04  78,700    100  +0.13%  ...  +1,422,985  3,103,048,671  51.98%
2022.01.03  78,600    300  +0.38%  ...  +1,750,341  3,102,550,526  51.97%
2021.12.30  78,300    500  -0.63%  ...    +573,935  3,099,478,430  51.92%
2021.12.29  78,800  1,500  -1.87%  ...    +297,625  3,098,662,986  51.91%
2021.12.28  80,300    100  +0.12%  ...    +724,464  3,097,454,661  51.89%
2021.12.27  80,200    300  -0.37%  ...     +90,477  3,096,948,541  51.88%
2021.12.24  80,500    600  +0.75%  ...    +408,109  3,097,931,384  51.89%

 

굳!

반응형