なんちゃってだよ

見習いデータアナリストになった元SE→元コンサルによるなんちゃってデータ分析

R言語のrvestパッケージでWebスクレイピングしてみた素人

久しぶりすぎてスイマセン。
 

Webページの情報を自動で取得したいなーと昔から思ってた訳ですが、、、
仕事で、「できます?」と聞かれることが増えたので調べてみました。

 
今回はR言語で、Webページ(今回はJSP)の情報を取得してみました。
(別に次回に予定はない)
 

<必要なもの>

・ネットにつながるパソコン
R言語でインストールされたパソコン
・妻と子供が寝静まった部屋とYシャツと私
・手ごろなサイト(以下で記載)

<スクレイピングするサイト>

テーブルだけ書いてあるHTMLとして、こんなの見つけました。
https://www.jnss.or.jp/jns_web/jsp_pub/map.jsp
f:id:grarara:20180318204206p:plain


北海道のボタンを押下すると
https://www.jnss.or.jp/jns_web/meib_ken.do?ken=1
f:id:grarara:20180318204326p:plain


 さらに施設を選択すると、
f:id:grarara:20180318204410p:plain

最後のページのURLはどの施設も
https://www.jnss.or.jp/jns_web/meibo.do
でした。

 

<やりたいこと>

都道府県の、全施設の、医師の名前を取得する。
その医師の名前に、最後ページの一つ目のテーブルの情報を紐付ける。
(イメージ)
f:id:grarara:20180318205117p:plain

<作業ログ>

1.調査

(特段何の理由も無く新卒入社したSE会社から転職してコンサル目指してるのに、時々技術的なことしたくなる中途半端野郎)
かすかな記憶で「Node.js」という単語から、「スクレイピング」という単語にたどり着き、「rvest」をはじめて知る。
このとき初めてRでWebスクレイピングできることを知る。
Google先生と一緒にネットサーフィンして、rvestパッケージを知らべる。
https://qiita.com/rmecab/items/9612f55097fa2f6701d8
このページを参考にしました。ありがとうございました。

2.コーディング(お試し)

最初に言っておくと、全ソースコードは載せません。エンジニアではなく、汚いので(`・ω・´)((キリッ)
(いいときだけエンジニアではないという剣を振る)
とりあえず、各都道府県のページから情報を取得

get_html <- function(num) {
  # 特定の都道府県のページ情報取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meib_ken.do?ken=%s", num), encoding = "SJIS")
}
res <- get_html(i)
shisetsu_num <- res %>% html_nodes("a") %>% html_attr("href")


これで施設番号がとれた模様。
"javaScript:doSubmit('1');"という文字列なので、いい感じで番号だけ取得。

ここで、各施設のページに行きたいが、URLがすべて同じ。。
(筆者にはJSPの知識は無いのだ。叩かないでくれ!しょげるから)

HTMLを眺めること数分。。。

	<input type="button" name="back" value="戻る" onclick="JavaScript:history.back()"><br>
	<form name="MeiboShisetsuForm" method="post" action="/jns_web/meibo.do" id="meibo"><input type="hidden" name="shisetsu" value="0">

というコードを見つけ、shisetsu=pekepekeでいけることを知る。
https://www.jnss.or.jp/jns_web/meibo.do?shisetsu=1

あとはこのページから情報を取得。

get_html_s <- function(num) {
  # 特定の施設のページ取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meibo.do?shisetsu=%s", num), encoding = "SJIS")
}
res_s <- get_html_s(1)
shisetsu_table <- res_s %>% html_nodes("td") %>% html_text


なぜhtml_tableで取得しないかというのを書こうとしたが、忘れたので許してほしい。
あとはいい感じに加工したら終わり。。。。と思いきや、ここではまる。

詳細は書かないが、Google先生と二度目のサーフィンをして、以下のサイトのお世話になる。
notchained.hatenablog.com

そのまま拝借すると、以下関数をかませて、HTMLエスケープを元に戻す

unescape_html <- function(str){
  purrr::map_chr(
    sprintf("<x>%s</x>", str),
    ~xml2::xml_text(xml2::read_html(.)))
}


あとは、全都道府県をループしよ~っとしたら、にっくき大阪府のページでエラーが起こる

三度目の波乗りで以下のサイトにたどり着く。

ja.stackoverflow.com

コード変更して難を逃れる

get_html_CP932 <- function(num) {
  # 特定の都道府県のページ情報取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meib_ken.do?ken=%s", num), encoding = "CP932")
}
get_html_s_CP932 <- function(num) {
  # 特定の施設のページ取得
  read_html(sprintf("https://www.jnss.or.jp/jns_web/meibo.do?shisetsu=%s", num), encoding = "CP932")
}


これで無事にループ、、、、
でも、このサイトはそもそもそんなことをやっていいサイトなのかしら。
Sys.sleep(pekepeke)かませながらやっても、、、まぁ怪しいから止めておこう。

今は知らないけど、気象庁のサイトではクローラー禁止という言葉がありましたね。
(今みたら、そんな記載ないから、やってもいいのかな??)


とりあえず、今回はこんな技術が身についたよというところでお終い。

次回は無いけど、ログインしないと見れないページはどうするのかなと思い検索したらこんなサイトも
qiita.com
また、遊んでみよう。


以上、またいつかここで会える日まで