R言語のrvestパッケージでWebスクレイピングしてみた素人
久しぶりすぎてスイマセン。
Webページの情報を自動で取得したいなーと昔から思ってた訳ですが、、、
仕事で、「できます?」と聞かれることが増えたので調べてみました。
今回はR言語で、Webページ(今回はJSP)の情報を取得してみました。
(別に次回に予定はない)
<スクレイピングするサイト>
テーブルだけ書いてあるHTMLとして、こんなの見つけました。
https://www.jnss.or.jp/jns_web/jsp_pub/map.jsp
北海道のボタンを押下すると
https://www.jnss.or.jp/jns_web/meib_ken.do?ken=1
さらに施設を選択すると、
最後のページのURLはどの施設も
https://www.jnss.or.jp/jns_web/meibo.do
でした。
<やりたいこと>
全都道府県の、全施設の、医師の名前を取得する。
その医師の名前に、最後ページの一つ目のテーブルの情報を紐付ける。
(イメージ)
<作業ログ>
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(.))) }
あとは、全都道府県をループしよ~っとしたら、にっくき大阪府のページでエラーが起こる
三度目の波乗りで以下のサイトにたどり着く。
コード変更して難を逃れる
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
また、遊んでみよう。
以上、またいつかここで会える日まで