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§ion_id=101§ion_id2=258'
data = GET(url)
print(data)
1) Status가 200이므로 데이터를 정상적으로 받아온 것
2) 인코딩 타입은 EUC-KR
Response [https://finance.naver.com/news/news_list.nhn?mode=LSS2D§ion_id=101§ion_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/↩
https://finance.naver.com/news/news_list.nhn?mode=LSS2D§ion_id=101§ion_id2=258↩
I'm a Senior Student in Data Science !
데이터 사이언스를 공부하고 있는 4학년 학부생의 TIL 블로그입니다. 게시글이 도움 되셨다면 구독과 좋아요 :)
'Data Scraping > #Quant Portfolio' 카테고리의 다른 글
[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (6) (0) | 2020.08.26 |
---|---|
[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (5) (0) | 2020.08.25 |
[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (3) (0) | 2020.08.18 |
[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (2) (0) | 2020.07.30 |
[퀀트] R을 활용한 퀀트 투자 포트폴리오 만들기 (1) (0) | 2020.07.29 |