본문 바로가기

Data Scraping/#Quant Portfolio

[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (4)

Chapter 4 크롤링 이해하기

크롤링에서 서버에 파일을 요청하는 방법은 크게 GET과 POST 방식이 있음

4.1.1 GET 방식

인터넷 주소를 기준으로 파일을 요청하는 방식요청 쿼리는 주로 &, ? 형식으로 결합되어 서버에 전달함&[GET 방식 사용]skinType[입력 종류]=business[입력값]?skinType=derivative < 탭 변경 시?skinType=derivative&sdate[검색시작시점]=2020-07-03&edate[검색종료시점]=2020-08-03&order_type=&now_page[현재 페이지]=2

 

4.1.2 POST 방식

 

사용자가 필요한 값을 추가해 요청하는 방식

요청 쿼리가 body 부분에 있으므로 그 내역을 직접 볼 수 없음

날짜를 변경해 검색해도 웹 페이지 주소가 바뀌지 않음

개발자도구 [f12]-[Network] 탭에서 서버 간 통신 과정을 확인할 수 있음

 

 

 

 

 

 

4.2 크롤링 예제

httr 패키지의 GET() 혹은 POST() 함수로 데이터를 다운로드한 후 rvest 패키지의 함수로 데이터를 찾는 과정

 

4.2.1 금융속보 크롤링

네이버 금융 페이지를 R로 불러오기

GET() 방식 활용

library(rvest)
library(httr)

url = 'https://finance.naver.com/news/news_list.nhn?mode=LSS2D&section_id=101&section_id2=258'
data = GET(url)

print(data)

 

1) Status가 200이므로 데이터를 정상적으로 받아온 것

2) 인코딩 타입은 EUC-KR

Response [https://finance.naver.com/news/news_list.nhn?mode=LSS2D&section_id=101&section_id2=258]
  Date: 2020-08-06 08:55
  Status: 200
  Content-Type: text/html;charset=EUC-KR
  Size: 56.9 kB

<!--  global include -->

 

1) 페이지의 제목 부분만 가져오기 위해 dl 태그 -> dd태그 -> articleSubject 클래스 -> a태그 -> title 속성으로 이동

2) 태그 추출에는 html_nodes() 함수를 사용하며, 클래스 추출에는 이름 앞에 .을 붙임

3) 속성 추출에는 html_attr() 함수를 사용

data_title = data %>% 
  read_html(encoding = 'EUC-KR') %>% 
  html_nodes('dl') %>% 
  html_nodes('.articleSubject') %>% 
  html_nodes('a') %>% 
  html_attr('title')

print(data_title)

--> 결과는 오늘 날짜에 네이버 금융 페이지 헤드라인들

[1] "오늘의 레이더M 뉴스 (8월 7일)"                                    
 [2] "상반기 경상수지 흑자 8년만에 최소…개미들 해외주식 투자 크게 늘어"
 [3] "향후10년 `모빌리티` 시대온다…밸류체인 파악이 투자 첫걸음"        
 [4] "한진중공업, 506억원 규모 홍대 아트&디자인밸리 공사 수주"          
 [5] "테슬라 과열 부담스럽다면…中CATL 등 새로운 금맥찾자"              
 [6] "韓 금펀드 놔두고…美 금ETF 쓸어담는 개미들"                       
 [7] "미래에셋대우 영업익 3871억 역대최대"                              
 [8] "코스피 또 연고점 돌파…시장선 과열 논란"                          
 [9] "삼성證, 해외주식 퀴즈이벤트…정답 맞힌 100명에 커피 쏜다"         
[10] "KB證, 업계 최초 지붕형 태양광 발전 금융주선"                      
[11] "[유가증권시장 공시] KT&G"                                         
[12] "[코스닥 공시] 큐로컴 / 에코마케팅"                                
[13] "오늘의 증시 일정 (8월 7일)"                                       
[14] "TSMC보다 싸보이는 삼성전자…더 갈까"                              
[15] "광물公, 마다가스카르 니켈 광산 지분 매각 착수"                    
[16] "주주 반대에 발목잡힌 VI `증권사 변신`"                            
[17] "코로나發 수출 타격...상반기 경상흑자 8년만에 최소"                
[18] "[단독] 쉐라톤 팔래스 호텔 다시 매물로"                            
[19] "[마켓인사이트]미투젠, 청약 경쟁률 1011대1...8조7000억 몰렸다"     
[20] "미래에셋 `TDF 2050` 신규출시"   

 

4.2.2 기업 공시채널에서 오늘의 공시 불러오기

 

한국거래소 상장공시시스템의 공시내용 중 날짜만 변경하는 경우는 URL이 변경되지 않음 (GET 방식 사용 불가)

개발자 도구 화면 (f12)의 Network 탭 - Form Data에서 서버에 데이터를 요청하는 내역을 확인할 수 있음 

 

 

 

1) Sys.setlocale() 함수로 한글로 된 페이지의 locale 언어를 영어로 설정

2) POST() 함수 안에 원하는 쿼리를 작성하는데, 이는 위 화면의 Form Data 내역과 동일함 (빈 항목은 생략해도 됨)

3) html_table() 함수는 페이지 내의 테이블 형태의 데이터를 읽어옴 (셀 병합된 열이 있으므로, fill = TRUE)

4) 위에서 영어로 설정해준 언어를 Sys.setlocale() 함수로 다시 한국어로 변경

Sys.setlocale("LC_ALL", "English")

url = 'http://kind.krx.co.kr/disclosure/todaydisclosure.do'
data = POST(url, body = 
              list(
                method = 'searchTodayDisclosureSub',
                currentPageSize = '15',
                pageIndex = '1',
                orderMode = '0',
                orderStat = 'D',
                forward = 'todaydisclosure_sub',
                chose = 'S',
                todayFlag = 'Y',
                selDate = '2019-01-08'
                ))

data = read_html(data) %>%
  html_table(fill = TRUE) %>%
  .[[1]]

Sys.setlocale("LC_ALL", "Korean")

print(head(data))

--> 결과

쿼리문에서 selDate의 값을 조작해 원하는 날짜의 데이터를 받아올 수 있음

##      NA           NA
## 1 18:32   이노와이즈
## 2 18:26 에스제이케이
## 3 18:11     아이엠텍
## 4 18:10 시그넷이브이
## 5 18:09             
## 6 18:09             
##                                            NA
## 1                                최대주주변경
## 2 증권 발행결과(자율공시)(제3자배정 유상증자)
## 3               [정정]유상증자결정(제3자배정)
## 4                          유형자산 양수 결정
## 5            자기주식매매신청내역(코스닥시장)
## 6                    대량매매내역(코스닥시장)
##               NA                             NA
## 1     이노와이즈 공시차트\r\n\t\t\t\t\t주가차트
## 2   에스제이케이 공시차트\r\n\t\t\t\t\t주가차트
## 3       아이엠텍 공시차트\r\n\t\t\t\t\t주가차트
## 4   시그넷이브이 공시차트\r\n\t\t\t\t\t주가차트
## 5 코스닥시장본부                               
## 6 코스닥시장본부

 

Reference

http://hkconsensus.hankyung.com/

 

한경 컨센서스

 

consensus.hankyung.com

http://kind.krx.co.kr/

 

Chapter 4 크롤링 이해하기 | R을 이용한 퀀트 투자 포트폴리오 만들기

API를 이용하면 데이터를 매우 쉽게 수집할 수 있지만, 국내 주식 데이터를 다운로드 하기에는 한계가 있으며, 원하는 데이터가 API의 형태로 제공된다는 보장도 없습니다. 따라서 우리는 필요한

hyunyulhenry.github.io

https://finance.naver.com/news/news_list.nhn?mode=LSS2D§ion_id=101§ion_id2=258

 

Chapter 4 크롤링 이해하기 | R을 이용한 퀀트 투자 포트폴리오 만들기

API를 이용하면 데이터를 매우 쉽게 수집할 수 있지만, 국내 주식 데이터를 다운로드 하기에는 한계가 있으며, 원하는 데이터가 API의 형태로 제공된다는 보장도 없습니다. 따라서 우리는 필요한

hyunyulhenry.github.io

 


 

I'm a Senior Student in Data Science ! 

데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)