見出し画像

決算速報をスクレイピングしてみた [ Web Scraping for R]

やりたいこと

①決算情報をスクレイピングし, 銘柄番号と更新時間を持ってくる.
②更新時間と現在時刻を照らし合わせ, 同じであればファイルを指定した部分に作成する.

今回はあるWebサイトの記事が更新しているかどうかを確認するコードを作成します.

今回も例によって株探からとってきます.

手段

ファイルを起動して情報を受け取るまでの過程.
①taskshedulerからbatファイル(自分が作成したファイル)を起動.
②batファイルからR.exeとRscript(自分が作成したファイル)を起動.
③Rscriptが実行され, 情報を受け取る.

batファイル内での作業.
①作業ディレクトリをRスクリプトの存在するディレクトリに変更.
②RScriptをR.exeを使って実行.

Rscript内での作業.
①必要なパッケージを起動する.
②保存するディレクトリを設定する.
③関数に入れるデータをスクレイピングする.
④関数を定義.
⑤関数にデータを入力し実行.

過程ははっきりしたので早速ファイルを作成していきましょう.
※taskschedulerってなんぞって人はコチラを参考にしてください.

ファイルを作成

​①必要なパッケージを起動する.

library(rvest)
library(dplyr)
library(magrittr)
library(stringr)

前回と同じペッケージを利用します.
R言語を弄ったことのある人であれば割かし見たことのあるパッケージだと思います.

②保存するディレクトリを設定する.

setwd("~/株情報")

忘れがちですがファイルの保存場所はきちんと決めておきましょう.


③関数に入れるデータをスクレイピングする.

data<-read_html("https://kabutan.jp/news/")

dataにはHTML要素すべてが入ってしまっていますが, これは関数内で処理することにしました.

④関数を定義.

kabu<-function(data){

 kessan<-data %>% html_nodes(".s_news_list") %>% html_table
 
 kessan.df<-kessan[[1]]
 kessan.df<-kessan.df %>% select(c(1,4))
 kessan.df<-kessan.df[-11,]
 
 X<-kessan.df$X1 %>% str_extract_all("\\d{2}[:]\\d{2}")
 X<-unlist(X)
 X<-as.data.frame(X)
 
 time<-format(Sys.time(),"%H:%M")
 key<-X %>% str_which(time)
 
 if(key>0){
   print("決算速報チェックして下さい")
   write.table (head(kessan.df),"決算速報.txt", sep = "\t",
                quote = FALSE, row.names = FALSE)
 }
}

長いので少しづつ解説します. 以下の部分はデータフレームとして抽出する部分を設定しています.

今回は「kessan(リスト)から第一要素(データフレーム)の1,4列, ただし11行目以外」をデータフレームとして設定しています.

※データフレームの処理が苦手な人は以下の記事を参考にしてください

 kessan<-data %>% html_nodes(".s_news_list") %>% html_table
 
 kessan.df<-kessan[[1]]
 kessan.df<-kessan.df %>% select(c(1,4))
 kessan.df<-kessan.df[-11,]

次に記事の更新時間をstrパッケージを利用しながら作っています.
strパッケージの使い方は次のサイトを参考にするとよいと思います.

 X<-kessan.df$X1 %>% str_extract_all("\\d{2}[:]\\d{2}")
 X<-unlist(X)
 X<-as.data.frame(X)

そして現在の時間を持ってきます. 先ほど型を「○○:○○」に設定したのでそれに合わせます.

 time<-format(Sys.time(),"%H:%M")
 key<-X %>% str_which(time)

最後にif文を入れれば完成です.

 if(key>0){
   print("決算速報チェックして下さい")
   write.table (head(kessan.df),"決算速報.txt", sep = "\t",
                quote = FALSE, row.names = FALSE)}


⑤関数にデータを入力し実行.

関数を定義できたので実行させます. データはスクレイピングしてきたものを利用します.

kabu(data)

実行してみる

#RScript

library(rvest)
library(dplyr)
library(magrittr)
library(stringr)

setwd("~/株情報")

data<-read_html("https://kabutan.jp/news/")

kabu<-function(data){
 
 kessan<-data %>% html_nodes(".s_news_list") %>% html_table
 
 kessan.df<-kessan[[1]]
 kessan.df<-kessan.df %>% select(c(1,4))
 kessan.df<-kessan.df[-11,]
 
 X<-kessan.df$X1 %>% str_extract_all("\\d{2}[:]\\d{2}")
 X<-unlist(X)
 X<-as.data.frame(X)
 
 time<-format(Sys.time(),"%H:%M")
 key<-X %>% str_which(time)
 
 if(key>0){
   print("決算速報チェックして下さい")
   write.table (head(kessan.df),"決算速報.txt", sep = "\t",
                quote = FALSE, row.names = FALSE)
 }
}
kabu(data)

X1	X4
09/25<U+00A0>17:30	日精化、上期経常を一転8%増益に上方修正・最高益、通期も増額
09/25<U+00A0>17:30	カワセコンピ、非開示だった今期経常は黒字浮上へ
09/25<U+00A0>17:10	アドバネクス、4-6月期(1Q)営業は赤字転落で着地
09/25<U+00A0>17:00	三菱電、未定だった上期配当は4円減配
09/25<U+00A0>17:00	水道機、4-6月期(1Q)経常は赤字縮小で着地
09/25<U+00A0>17:00	アルプスアル、上期経常を赤字縮小に上方修正

終わりに

今回は記事をスクレイピングすることに成功したが, 正直後日更新するPythonでのスクレイピングの方がお勧め.

理由はそちらで解説するが, 簡単いうとスクレイピングする際の見やすさとバグの少なさが挙げられる.

次はwindowsのバルーン(お知らせ欄)で自動的にお知らせしてくれるようにしたいと考えている.(近いうちにその記事も公開します.)

参考文献


この記事が気に入ったらサポートをしてみませんか?