Hyesung Oh

#python#crawling - get, post 차이 이해 및 post 방식 동적 크롤링 실습 [2] 본문

DEV/Python

#python#crawling - get, post 차이 이해 및 post 방식 동적 크롤링 실습 [2]

혜성 Hyesung 2019. 8. 22. 22:41
반응형

금융투자협회 채권정보센터 KOFIABOND 에서 20년치 채권 만기수익률 데이터를 크롤링을 해보겠습니다.

URL: http://www.kofiabond.or.kr/index.html

홈화면

홈화면 -> 우측상단 시가평가-> 채권 시가평가기준 수익

채권종류, 만기일 선택 -> 조회하기 버튼 

다음과 같은 채권 만기수익률 시계열 데이터를 조회할 수 있습니다.

위는 예시로서 2019.7.22 - 2019.8.22 한달 간의 데이터를 조회한 것입니다. 

만약 20년 동안의, 모든 채권, 만기일에 대한 데이터를 받아오고 싶을 때는 어떻게 해야할까요?

  1. 하나하나 설정하고 조회하기 버튼을 누르고 다운받는다 (수작업)
  2. requests.get(target url) (GET 방식)

1번을 선택하신다면 건투를 빌겠습니다.

2번은 잘못된 적절하지 못한 방법일 뿐더러 원하는 정보를 요청할 수 없습니다.

이유는 간단합니다. 조회하기 전과 후의 해당 페이지의 URL은 변함 없이 동일하기 때문입니다. 

조회 전
조회 후 

이러한 경우를 동적인 웹페이지라 표현합니다. 쉽게 말하면 client 에게 보여지는 URL 외에 보이지 않는 무언가가 있다는 뜻입니다. 

selenium 을 이용한 방식을 선택하실 수 도 있지만 이는 로컬 환경에 따라 여러 제약과 변수가 발생할 수 있습니다.

 

따라서 이번 포스팅에서는 REST API의 POST 크롤링 방법에 대해 알아보겠습니다.

우리가 해야할 작업은 크게 두가지입니다.

  1. URL 확보
  2. header 로 넘겨줄 string format 확보

순서대로 따라 해보시기 바랍니다.

F12 버튼 -> Network -> 해당 페이지로 돌아가서 채권 종류, 만기일 선택 -> 조회하기 -> Network 창 확인

위에서 볼 수 있듯이 POST 방식을 사용하여 서버에 정보를 요청했음을 알 수 있습니다. 

1. URL : http://www.kofiabond.or.kr/proframeWeb/XMLSERVICES/

위와 동일한 상태에서 스크롤 내림 -> form data 

 

(인덴테이션 생략)

2. form_data = 

<message> <proframeHeader> <pfmAppName>BIS-KOFIABOND</pfmAppName> <pfmSvcName>BISBndSrtPrcSrchSO</pfmSvcName> <pfmFnName>selectTrm</pfmFnName> </proframeHeader> <systemHeader></systemHeader> <BISBndSrtPrcTrmDTO> <val31>1010000</val31> <val32>0003</val32> <standardDt1>20190722(조회시작일)</standardDt1> <standardDt2>20190822(조회종료일)</standardDt2> </BISBndSrtPrcTrmDTO> </message> 

일반화 하면 다음과 같습니다. 

<pfmFnName> selectTrm: 만기수익률 요청

* 저의 경우 모든 채권종류, 만기에 대해 수집하는 것을 보여드리기 위해 조회 가능한 모채권 종류, 만기일을

먼저 수집하여 데이터 프레임에 저장하도록 하겠습니다. 

  • 채권종류 수집

<pfmFnName>selectBndType 채권종류 요청

<pfmFnName> 태그 내용이 selectBndType 으로 바뀐 것을 눈치 채셔야 합니다. 채권 종류 요청시 서버에 넘겨주어야 하는 form_data 입니다. 

메커니즘은 다음과 같습니다.

  1. 기본 url + form_data 를 함께 requests.post()에 넘겨줍니다. r = requests.post(url,form_data)
  2. 받아온 응답에 beautifulsoup을 먹인후 원하는 데이터가 있는 tag 를 찾아서 파싱하여 데이터 프레임에 저장합니다.

조회 가능한 모든 채권 종류를 bnd_df 에 저장한 결과입니다

 

  • 채권 만기일 수집

mat_df에 조회 가능한 채권 만기일 저장

* 과정은 동일하며 또한 최종 만기수익률 데이터 크롤링시에도 같은 과정이 적용됩니다.

[3]편에 이어서..

반응형
Comments