電車の時刻になったら通知を飛ばすシステム Rubyでウェブスクレイピング編
お久しぶりです、かささぎです。
就活やら、テストやらで忙しく更新できない状態が続いてました。
まあなんやかんや無事(?)に終わらせることができたので、ブログの更新を再開します。
週1くらいで更新していきたいです。
「Rubyで何か作りてー」となり、ありがちではありますが、電車発車時間の数分前にwindowsに通知を行うシステムを作ることにしました。
作った過程をWriteUPしようとしたのですが、一度にまとめるととても長くなりそうなので、今回は前半です。
今回は電車の時刻表をWebから取ってくる過程をお伝えします。
ウェブスクレイピングとは
ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。 - wikipeida
つまりそういうことです。
なおスクレイピングは著作権的にどうなんだという声があると思います。
調べたところ会員制サイトでなければあまり問題はなさそうです。
こちらの方の記事でわかりやすくまとめられています。
Webスクレイピングの法律周りの話をしよう!
まあ今回はだれでも閲覧可能なHPで、また取得するものは時刻表の時間という、数値のデータであり著作物ではないので大丈夫でしょう。問題があれば対応します。
スクレイピングツール
スクレイピングには、HTMLをパースして情報を取得できるスクレイピングツールを用います。
RubyではNokogiriというライブラリを使います。
以下のコマンドでNokogiriをインストールします。
gem install nokogiri
ちなみにスクレイピングにはこする、削るといった意味があるそうです。
Nokogiriというネーミングセンスいいですね、好きです。
HTML解析
私が利用している駅・路線である、津幡駅富山方面の時刻表をスクレイピングします。
始めはIRいしかわ鉄道のHPにしようかと思ったのですが、開発者ツールでHTMLを見ているとなかなか面倒くさそうな構文をしていたので、駅から時刻表さんのHPを利用させていただくことにしました。
NokogiriではHTMLタグを指定してその中身を取得する処理で情報を得るため、HTMLと格闘する必要があります。
この時点でスクレイピングするより手入力したほうが早いと気づいたのですが、まあそれはご愛敬で。
実装
時刻表をCSVファイルとして出力するプログラムです。
<ソースコード>
gist7ce5da620acdc7a28be48d2b47d2e8cd
解説します。
charsetには文字コードを格納し、データが文字化けしないようにしています。
xpathやcssはHTMLタグ内のデータを取得する関数です。
xpathは中身のHTMLタグごと、cssは中身の文字データのみを取得しているんだと思います。
正直詳しい文献が少なく、なんとなくな実行で動いてしまったので理解が追い付いていません。
xpath一つ目では時間、二つ目では分のデータを格納しています。
ここらへんはHTMLの構造によって違いますので、ホームページによってやり方を変える必要があります。
取得したtableの情報をCSVで出力して終了です。
<実行結果>
いやー田舎ですね。
各行の最初のデータが時間、それ以降が分の情報です。
あまり良いデータ構造ではないかもしれませんが、それは利用時にカバーします。
今回はここまでです。次回はこの情報をもとにWindowsに通知を飛ばします。
それでは。