diff --git a/04-crawling.Rmd b/04-crawling.Rmd index fa75109b..52213576 100644 --- a/04-crawling.Rmd +++ b/04-crawling.Rmd @@ -142,7 +142,7 @@ library(rvest) Sys.setlocale("LC_ALL", "English") -url = 'https://dev-kind.krx.co.kr/disclosure/todaydisclosure.do' +url = 'https://kind.krx.co.kr/disclosure/todaydisclosure.do' data = POST(url, body = list( method = 'searchTodayDisclosureSub', @@ -182,7 +182,7 @@ POST 형식의 경우 body에 들어가는 쿼리 내용을 바꾸어 원하는 ```{r results="hide"} Sys.setlocale("LC_ALL", "English") -url = 'https://dev-kind.krx.co.kr/disclosure/todaydisclosure.do' +url = 'https://kind.krx.co.kr/disclosure/todaydisclosure.do' data = POST(url, body = list( method = 'searchTodayDisclosureSub', @@ -193,7 +193,7 @@ data = POST(url, body = forward = 'todaydisclosure_sub', chose = 'S', todayFlag = 'Y', - selDate = '2020-09-18' + selDate = '2021-12-13' )) data = read_html(data) %>% diff --git a/docs/404.html b/docs/404.html index 94c9927c..15bb0449 100644 --- a/docs/404.html +++ b/docs/404.html @@ -6,7 +6,7 @@ Page not found | R을 이용한 퀀트 투자 포트폴리오 만들기(개정판) - + @@ -24,7 +24,7 @@ - + @@ -33,9 +33,8 @@ - + - @@ -51,76 +50,11 @@ + - - - - - + + @@ -477,6 +411,7 @@

Page not found

+ @@ -514,7 +449,7 @@

Page not found

}, "download": null, "search": { -"engine": "fuse", +"engine": "lunr", "options": null }, "toc": { @@ -525,20 +460,6 @@

Page not found

}); - - diff --git a/docs/index.html b/docs/index.html index bf39f98c..7956f4da 100644 --- a/docs/index.html +++ b/docs/index.html @@ -24,7 +24,7 @@ - + @@ -53,154 +53,9 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -531,7 +386,7 @@

Welcome

@@ -543,7 +398,9 @@

Welcome

강의 바로가기

책 발간 이후 업데이트 내용은 다음과 같습니다.

또한 종목명을 클릭해 이동하는 페이지의 URL을 확인해보면, 끝 6자리가 각 종목의 거래소 티커임도 확인이 됩니다.

티커 정리를 위해 HTML에서 확인해야 할 부분은 총 두 가지입니다. 먼저 하단의 페이지 내비게이션을 통해 코스피와 코스닥 시가총액에 해당하는 페이지가 각각 몇 번째 페이지까지 있는지 알아야 합니다. 아래와 같은 항목 중 [맨뒤]에 해당하는 페이지가 가장 마지막 페이지입니다.

-
+
페이지 네비게이션

그림 4.10: 페이지 네비게이션

[맨뒤]에 마우스 커서를 올려두고 마우스 오른쪽 버튼을 클릭한 후 [검사]를 선택하면 개발자 도구 화면이 열립니다. 여기서 해당 글자가 HTML 내에서 어떤 부분에 위치하는지 확인할 수 있습니다. 해당 링크는 pgRR 클래스 → a 태그 중 href 속성에 위치하며, page= 뒷부분의 숫자에 위치하는 페이지로 링크가 걸려 있습니다.

-
+
HTML 내 페이지 네비게이션 부분

그림 4.11: HTML 내 페이지 네비게이션 부분

종목명 링크에 해당하는 주소 중 끝 6자리는 티커에 해당합니다. 따라서 각 링크들의 주소를 알아야 할 필요도 있습니다.

-
+
네이버 금융 시가총액 페이지

그림 4.12: 네이버 금융 시가총액 페이지 @@ -779,24 +698,24 @@

4.2.3 네이버 금융에서 주

삼성전자에 마우스 커서를 올려둔 후 마우스 오른쪽 버튼을 클릭하고 [검사]를 선택합니다. 개발자 도구 화면을 살펴보면 해당 링크가 tbody → td → a 태그의 href 속성에 위치하고 있음을 알 수 있습니다.

위 정보들을 이용해 데이터를 다운로드하겠습니다. 아래 코드에서 i = 0일 경우 코스피에 해당하는 URL이 생성되고, i = 1일 경우 코스닥에 해당하는 URL이 생성됩니다. 먼저 코스피에 해당하는 데이터를 다운로드하겠습니다.

-
library(httr)
-library(rvest)
-
-i = 0
-ticker = list()
-url = paste0('https://finance.naver.com/sise/',
-             'sise_market_sum.nhn?sosok=',i,'&page=1')
-down_table = GET(url)
+
library(httr)
+library(rvest)
+
+i = 0
+ticker = list()
+url = paste0('https://finance.naver.com/sise/',
+             'sise_market_sum.nhn?sosok=',i,'&page=1')
+down_table = GET(url)
  1. 빈 리스트인 ticker 변수를 만들어줍니다.
  2. paste0() 함수를 이용해 코스피 시가총액 페이지의 url을 만듭니다.
  3. GET() 함수를 통해 해당 페이지 내용을 받아 down_table 변수에 저장합니다.

가장 먼저 해야 할 작업은 마지막 페이지가 몇 번째 페이지인지 찾아내는 작업입니다. 우리는 이미 개발자 도구 화면을 통해 해당 정보가 pgRR 클래스의 a 태그 중 href 속성에 위치하고 있음을 알고 있습니다.

-
navi.final = read_html(down_table, encoding = 'EUC-KR') %>%
-      html_nodes(., '.pgRR') %>%
-      html_nodes(., 'a') %>%
-      html_attr(., 'href')
+
navi.final = read_html(down_table, encoding = 'EUC-KR') %>%
+      html_nodes(., '.pgRR') %>%
+      html_nodes(., 'a') %>%
+      html_attr(., 'href')
  1. read_html() 함수를 이용해 해당 페이지의 HTML 내용을 읽어오며, 인코딩은 EUC-KR로 설정합니다.
  2. html_nodes() 함수를 이용해 pgRR 클래스 정보만 불러오며, 클래스 속성이므로 앞에 마침표(.)를 붙입니다.
  3. @@ -804,39 +723,39 @@

    4.2.3 네이버 금융에서 주
  4. html_attr() 함수를 통해 href 속성을 불러옵니다.

이를 통해 navi.final에는 해당 부분에 해당하는 내용이 저장됩니다.

-
print(navi.final)
-
## [1] "/sise/sise_market_sum.nhn?sosok=0&page=34"
+
print(navi.final)
+
## [1] "/sise/sise_market_sum.nhn?sosok=0&page=35"

이 중 우리가 알고 싶은 내용은 page= 뒤에 있는 숫자입니다. 해당 내용을 추출하는 코드는 다음과 같습니다.

-
navi.final = navi.final %>%
-  strsplit(., '=') %>%
-  unlist() %>%
-  tail(., 1) %>%
-  as.numeric()
+
navi.final = navi.final %>%
+  strsplit(., '=') %>%
+  unlist() %>%
+  tail(., 1) %>%
+  as.numeric()
  1. strsplit() 함수는 전체 문장을 특정 글자 기준으로 나눕니다. page= 뒷부분 의 데이터만 필요하므로 =를 기준으로 문장을 나눠줍니다.
  2. unlist() 함수를 통해 결과를 벡터 형태로 변환합니다.
  3. tail() 함수를 통해 뒤에서 첫 번째 데이터만 선택합니다.
  4. as.numeric() 함수를 통해 해당 값을 숫자 형태로 바꾸어줍니다.
-
print(navi.final)
-
## [1] 34
-

코스피 시가총액 페이지는 34번째 페이지까지 있으며, for loop 구문을 이용하면 1페이지부터 navi.final, 즉 34 페이지까지 모든 내용을 읽어올 수 있습니다. 먼저 코스피의 첫 번째 페이지에서 우리가 원하는 데이터를 추출하는 방법을 살펴보겠습니다.

-
i = 0 # 코스피
-j = 1 # 첫번째 페이지
-url = paste0('https://finance.naver.com/sise/',
-             'sise_market_sum.nhn?sosok=',i,"&page=",j)
-down_table = GET(url)
+
print(navi.final)
+
## [1] 35
+

코스피 시가총액 페이지는 35번째 페이지까지 있으며, for loop 구문을 이용하면 1페이지부터 navi.final, 즉 35 페이지까지 모든 내용을 읽어올 수 있습니다. 먼저 코스피의 첫 번째 페이지에서 우리가 원하는 데이터를 추출하는 방법을 살펴보겠습니다.

+
i = 0 # 코스피
+j = 1 # 첫번째 페이지
+url = paste0('https://finance.naver.com/sise/',
+             'sise_market_sum.nhn?sosok=',i,"&page=",j)
+down_table = GET(url)
  1. i와 j에 각각 0과 1을 입력해 코스피 첫 번째 페이지에 해당하는 url을 생성합니다.
  2. GET() 함수를 이용해 해당 페이지의 데이터를 다운로드합니다.
-
Sys.setlocale("LC_ALL", "English")
-
-table = read_html(down_table, encoding = "EUC-KR") %>%
-  html_table(fill = TRUE)
-table = table[[2]]
-
-Sys.setlocale("LC_ALL", "Korean")
+
Sys.setlocale("LC_ALL", "English")
+
+table = read_html(down_table, encoding = "EUC-KR") %>%
+  html_table(fill = TRUE)
+table = table[[2]]
+
+Sys.setlocale("LC_ALL", "Korean")
  1. Sys.setlocale() 함수를 통해 로케일 언어를 English로 설정합니다.
  2. read_html() 함수를 통해 HTML 정보를 읽어옵니다.
  3. @@ -845,44 +764,44 @@

    4.2.3 네이버 금융에서 주
  4. 한글을 읽기 위해 Sys.setlocale() 함수를 통해 로케일 언어를 다시 Korean으로 변경합니다.

저장된 테이블 내용을 확인하면 다음과 같습니다.

-
print(head(table))
+
print(head(table))
## # A tibble: 6 x 13
 ##       N 종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율 거래량
 ##   <int> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>    <chr>           <dbl> <chr> 
 ## 1    NA ""     ""     ""     ""     ""     ""       ""               NA   ""    
-## 2     1 "삼성~ "70,2~ "400"  "-0.5~ "100"  "4,190,~ "5,969,78~       51.2 "12,6~
-## 3     2 "SK하~ "107,~ "1,00~ "+0.9~ "5,00~ "778,96~ "728,002"        47.3 "2,50~
-## 4     3 "NAVE~ "410,~ "1,00~ "-0.2~ "100"  "674,30~ "164,263"        56.7 "308,~
-## 5     4 "카카~ "128,~ "1,50~ "-1.1~ "100"  "572,28~ "445,361"        30.7 "2,79~
-## 6     5 "삼성~ "864,~ "1,00~ "-0.1~ "2,50~ "571,66~ "66,165"         10.6 "48,9~
-## # ... with 3 more variables: PER <dbl>, ROE <chr>, 토론실 <lgl>
+## 2 1 "삼성~ "77,0~ "200" "+0.2~ "100" "4,596,~ "5,969,78~ 51.8 "10,9~ +## 3 2 "SK하~ "121,~ "500" "-0.4~ "5,00~ "880,88~ "728,002" 48.7 "2,18~ +## 4 3 "NAVE~ "392,~ "1,50~ "+0.3~ "100" "643,91~ "164,263" 56.5 "318,~ +## 5 4 "삼성~ "890,~ "18,0~ "+2.0~ "2,50~ "588,86~ "66,165" 10.8 "74,6~ +## 6 5 "삼성~ "70,4~ "0" "0.00~ "100" "579,31~ "822,887" 74.6 "787,~ +## # ... with 3 more variables: PER <chr>, ROE <chr>, 토론실 <lgl>

이 중 마지막 열인 토론실은 필요 없는 열이며, 첫 번째 행과 같이 아무런 정보가 없는 행도 있습니다. 이를 다음과 같이 정리해줍니다.

-
table[, ncol(table)] = NULL
-table = na.omit(table)
-print(head(table))
+
table[, ncol(table)] = NULL
+table = na.omit(table)
+print(head(table))
## # A tibble: 6 x 12
 ##       N 종목명 현재가 전일비 등락률 액면가 시가총액 상장주식수 외국인비율 거래량
 ##   <int> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>    <chr>           <dbl> <chr> 
-## 1     1 삼성~  70,200 400    -0.57% 100    4,190,7~ 5,969,783        51.2 12,60~
-## 2     2 SK하~  107,0~ 1,000  +0.94% 5,000  778,963  728,002          47.3 2,501~
-## 3     3 NAVER  410,5~ 1,000  -0.24% 100    674,301  164,263          56.7 308,6~
-## 4     4 카카오 128,5~ 1,500  -1.15% 100    572,289  445,361          30.7 2,798~
-## 5     5 삼성~  864,0~ 1,000  -0.12% 2,500  571,666  66,165           10.6 48,927
-## 6     6 LG화학 786,0~ 4,000  -0.51% 5,000  554,856  70,592           47.4 172,1~
-## # ... with 2 more variables: PER <dbl>, ROE <chr>
+## 1 1 삼성~ 77,000 200 +0.26% 100 4,596,7~ 5,969,783 51.8 10,94~ +## 2 2 SK하~ 121,0~ 500 -0.41% 5,000 880,883 728,002 48.7 2,183~ +## 3 3 NAVER 392,0~ 1,500 +0.38% 100 643,912 164,263 56.5 318,8~ +## 4 4 삼성~ 890,0~ 18,000 +2.06% 2,500 588,868 66,165 10.8 74,632 +## 5 5 삼성~ 70,400 0 0.00% 100 579,312 822,887 74.6 787,4~ +## 6 6 카카오 118,5~ 1,500 -1.25% 100 528,255 445,785 31.0 1,711~ +## # ... with 2 more variables: PER <chr>, ROE <chr>

이제 필요한 정보는 6자리 티커입니다. 티커 역시 개발자 도구 화면을 통해 tbody → td → a 태그의 href 속성에 위치하고 있음을 알고 있습니다. 티커를 추출하는 코드는 다음과 같습니다.

-
symbol = read_html(down_table, encoding = 'EUC-KR') %>%
-  html_nodes(., 'tbody') %>%
-  html_nodes(., 'td') %>%
-  html_nodes(., 'a') %>%
-  html_attr(., 'href')
-
-print(head(symbol, 10))
+
symbol = read_html(down_table, encoding = 'EUC-KR') %>%
+  html_nodes(., 'tbody') %>%
+  html_nodes(., 'td') %>%
+  html_nodes(., 'a') %>%
+  html_attr(., 'href')
+
+print(head(symbol, 10))
##  [1] "/item/main.naver?code=005930"  "/item/board.naver?code=005930"
 ##  [3] "/item/main.naver?code=000660"  "/item/board.naver?code=000660"
 ##  [5] "/item/main.naver?code=035420"  "/item/board.naver?code=035420"
-##  [7] "/item/main.naver?code=035720"  "/item/board.naver?code=035720"
-##  [9] "/item/main.naver?code=207940"  "/item/board.naver?code=207940"
+## [7] "/item/main.naver?code=207940" "/item/board.naver?code=207940" +## [9] "/item/main.naver?code=005935" "/item/board.naver?code=005935"
  1. read_html() 함수를 통해 HTML 정보를 읽어오며, 인코딩은 EUC-KR로 설정합니다.
  2. html_nodes() 함수를 통해 tbody 태그 정보를 불러옵니다.
  3. @@ -890,35 +809,35 @@

    4.2.3 네이버 금융에서 주
  4. html_attr() 함수를 이용해 href 속성을 불러옵니다.

이를 통해 symbol에는 href 속성에 해당하는 링크 주소들이 저장됩니다. 이 중 마지막 6자리 글자만 추출하는 코드는 다음과 같습니다.

-
library(stringr)
-
-symbol = sapply(symbol, function(x) {
-        str_sub(x, -6, -1) 
-      })
-
-print(head(symbol, 10))
+
library(stringr)
+
+symbol = sapply(symbol, function(x) {
+        str_sub(x, -6, -1) 
+      })
+
+print(head(symbol, 10))
##  /item/main.naver?code=005930 /item/board.naver?code=005930 
 ##                      "005930"                      "005930" 
 ##  /item/main.naver?code=000660 /item/board.naver?code=000660 
 ##                      "000660"                      "000660" 
 ##  /item/main.naver?code=035420 /item/board.naver?code=035420 
 ##                      "035420"                      "035420" 
-##  /item/main.naver?code=035720 /item/board.naver?code=035720 
-##                      "035720"                      "035720" 
 ##  /item/main.naver?code=207940 /item/board.naver?code=207940 
-##                      "207940"                      "207940"
+## "207940" "207940" +## /item/main.naver?code=005935 /item/board.naver?code=005935 +## "005935" "005935"

sapply() 함수를 통해 symbol 변수의 내용들에 function()을 적용하며, stringr 패키지의 str_sub() 함수를 이용해 마지막 6자리 글자만 추출합니다.

결과를 살펴보면 티커에 해당하는 마지막 6글자만 추출되지만 동일한 내용이 두 번 연속해 추출됩니다. 이는 main.nhn?code=에 해당하는 부분은 종목명에 설정된 링크, board.nhn?code=에 해당하는 부분은 토론실에 설정된 링크이기 때문입니다.

-
symbol = unique(symbol)
-print(head(symbol, 10))
-
##  [1] "005930" "000660" "035420" "035720" "207940" "051910" "005935" "006400"
+
symbol = unique(symbol)
+print(head(symbol, 10))
+
##  [1] "005930" "000660" "035420" "207940" "005935" "035720" "051910" "006400"
 ##  [9] "005380" "000270"

unique() 함수를 이용해 중복되는 티커를 제거하면 우리가 원하는 티커 부분만 깔끔하게 정리됩니다. 해당 내용을 위에서 구한 테이블에 입력한 후 데이터를 다듬는 과정은 다음과 같습니다.

-
table$N = symbol
-colnames(table)[1] = '종목코드'
- 
-rownames(table) = NULL
-ticker[[j]] = table
+
table$N = symbol
+colnames(table)[1] = '종목코드'
+ 
+rownames(table) = NULL
+ticker[[j]] = table
  1. 위에서 구한 티커를 N열에 입력합니다.
  2. 해당 열 이름을 종목코드로 변경합니다.
  3. @@ -926,90 +845,90 @@

    4.2.3 네이버 금융에서 주
  4. ticker의 j번째 리스트에 정리된 데이터를 입력합니다.

위의 코드에서 i와 j 값을 for loop 구문에 이용하면 코스피와 코스닥 전 종목의 티커가 정리된 테이블을 만들 수 있습니다. 이를 전체 코드로 나타내면 다음과 같습니다.

-
data = list()
-
-# i = 0 은 코스피, i = 1 은 코스닥 종목
-for (i in 0:1) {
-
-  ticker = list()
-  url =
-    paste0('https://finance.naver.com/sise/',
-             'sise_market_sum.nhn?sosok=',i,'&page=1')
-  
-  down_table = GET(url)
-  
-  # 최종 페이지 번호 찾아주기
-  navi.final = read_html(down_table, encoding = "EUC-KR") %>%
-      html_nodes(., ".pgRR") %>%
-      html_nodes(., "a") %>%
-      html_attr(.,"href") %>%
-      strsplit(., "=") %>%
-      unlist() %>%
-      tail(., 1) %>%
-      as.numeric()
-  
-  # 첫번째 부터 마지막 페이지까지 for loop를 이용하여 테이블 추출하기
-  for (j in 1:navi.final) {
-    
-    # 각 페이지에 해당하는 url 생성
-    url = paste0(
-      'https://finance.naver.com/sise/',
-      'sise_market_sum.nhn?sosok=',i,"&page=",j)
-    down_table = GET(url)
- 
-    Sys.setlocale("LC_ALL", "English")
-    # 한글 오류 방지를 위해 영어로 로케일 언어 변경
- 
-    table = read_html(down_table, encoding = "EUC-KR") %>%
-      html_table(fill = TRUE)
-    table = table[[2]] # 원하는 테이블 추출
- 
-    Sys.setlocale("LC_ALL", "Korean")
-    # 한글을 읽기위해 로케일 언어 재변경
- 
-    table[, ncol(table)] = NULL # 토론식 부분 삭제
-    table = na.omit(table) # 빈 행 삭제
-    
-    # 6자리 티커만 추출
-    symbol = read_html(down_table, encoding = "EUC-KR") %>%
-      html_nodes(., "tbody") %>%
-      html_nodes(., "td") %>%
-      html_nodes(., "a") %>%
-      html_attr(., "href")
- 
-    symbol = sapply(symbol, function(x) {
-        str_sub(x, -6, -1) 
-      })
-    
-    symbol = unique(symbol)
-    
-    # 테이블에 티커 넣어준 후, 테이블 정리
-    table$N = symbol
-    colnames(table)[1] = "종목코드"
-
-    rownames(table) = NULL
-    ticker[[j]] = table
- 
-    Sys.sleep(0.5) # 페이지 당 0.5초의 슬립 적용
-  }
-  
-  # do.call을 통해 리스트를 데이터 프레임으로 묶기
-  ticker = do.call(rbind, ticker)
-  data[[i + 1]] = ticker
-}
-
-# 코스피와 코스닥 테이블 묶기
-data = do.call(rbind, data)
+
data = list()
+
+# i = 0 은 코스피, i = 1 은 코스닥 종목
+for (i in 0:1) {
+
+  ticker = list()
+  url =
+    paste0('https://finance.naver.com/sise/',
+             'sise_market_sum.nhn?sosok=',i,'&page=1')
+  
+  down_table = GET(url)
+  
+  # 최종 페이지 번호 찾아주기
+  navi.final = read_html(down_table, encoding = "EUC-KR") %>%
+      html_nodes(., ".pgRR") %>%
+      html_nodes(., "a") %>%
+      html_attr(.,"href") %>%
+      strsplit(., "=") %>%
+      unlist() %>%
+      tail(., 1) %>%
+      as.numeric()
+  
+  # 첫번째 부터 마지막 페이지까지 for loop를 이용하여 테이블 추출하기
+  for (j in 1:navi.final) {
+    
+    # 각 페이지에 해당하는 url 생성
+    url = paste0(
+      'https://finance.naver.com/sise/',
+      'sise_market_sum.nhn?sosok=',i,"&page=",j)
+    down_table = GET(url)
+ 
+    Sys.setlocale("LC_ALL", "English")
+    # 한글 오류 방지를 위해 영어로 로케일 언어 변경
+ 
+    table = read_html(down_table, encoding = "EUC-KR") %>%
+      html_table(fill = TRUE)
+    table = table[[2]] # 원하는 테이블 추출
+ 
+    Sys.setlocale("LC_ALL", "Korean")
+    # 한글을 읽기위해 로케일 언어 재변경
+ 
+    table[, ncol(table)] = NULL # 토론식 부분 삭제
+    table = na.omit(table) # 빈 행 삭제
+    
+    # 6자리 티커만 추출
+    symbol = read_html(down_table, encoding = "EUC-KR") %>%
+      html_nodes(., "tbody") %>%
+      html_nodes(., "td") %>%
+      html_nodes(., "a") %>%
+      html_attr(., "href")
+ 
+    symbol = sapply(symbol, function(x) {
+        str_sub(x, -6, -1) 
+      })
+    
+    symbol = unique(symbol)
+    
+    # 테이블에 티커 넣어준 후, 테이블 정리
+    table$N = symbol
+    colnames(table)[1] = "종목코드"
+
+    rownames(table) = NULL
+    ticker[[j]] = table
+ 
+    Sys.sleep(0.5) # 페이지 당 0.5초의 슬립 적용
+  }
+  
+  # do.call을 통해 리스트를 데이터 프레임으로 묶기
+  ticker = do.call(rbind, ticker)
+  data[[i + 1]] = ticker
+}
+
+# 코스피와 코스닥 테이블 묶기
+data = do.call(rbind, data)
@@ -1083,20 +1002,6 @@

4.2.3 네이버 금융에서 주 }); - - diff --git a/index.Rmd b/index.Rmd index 04c2a940..11f09f1a 100644 --- a/index.Rmd +++ b/index.Rmd @@ -32,8 +32,12 @@ knitr::include_graphics('images/cover_2nd.jpg') 책 발간 이후 업데이트 내용은 다음과 같습니다. +- 2021년 12월 14일: 4장 [크롤링 이해하기]의 크롤링 예제 중 [기업공시채널에서 오늘의 공시 불러오기]에서 POST 부분의 url이 기존 *https://dev-kind.krx.co.kr/disclosure/todaydisclosure.do* 에서 *https://kind.krx.co.kr/disclosure/todaydisclosure.do* 로 변경되었습니다. + - 2021년 11월 5일: R을 사용하지 모르는 분들을 위해 [R 기초 배우기] 항목을 추가했습니다. +- **2021년 11월 1일: 개정판 2쇄에 아래 내용이 모두 적용되었습니다.** + - 2021년 5월 22일: 크롤링 관련 패키지가 업데이트 되면서, 테이블이 데이터프레임 형태가 아닌 티블 형태로 다운로드 됩니다. 이에 따라 6장 [재무제표 및 가치지표 크롤링] 부분을 수정하였습니다. - **2021년 1월 28일: 개정판이 발간되어 아래 내용이 모두 적용되었습니다.**