スクレイピングとは?curlで簡単なスクレイピングを試す。

スクレイピングとは?curlで簡単なスクレイピングを試す。

仕事で気象庁のデータを扱うことになった。
基本的に利用・加工は自由(ただしその旨をしっかり記載すること)ということなので、
スクレイピングして加工して必要なデータを用意してあげることになった。

では、スクレイピングとは?実際やる際の簡単な方法は?解説してみた。

そもそもスクレイピングって何?

スクレイピングとは
https://developer.ntt.com/ja/blog/e007f5ca-292b-48b6-9fcb-e8051a1f9889
こちらのサイトによると、

スクレイピングはサーバサイドのプログラミング言語を使って外部サーバへアクセスし、そのコンテンツから自分たちの欲しい情報を引き出す手法です

とのことである。
要は、何らかの方法であるサイトの画面をコピペしてきて加工する。という感じである。

人力以外でサイトの画面をコピペする方法は多分無いかあってもかなり難しいと思うので、
多くの場合はHTML情報を落としてきて正規表現等で必要なところの情報を取り出すなどして加工する。

スクレイピングのメリット・デメリット

メリット

API等が提供されていない情報を取得することができる
たったこれだけです。
ですが、特に日本の公共機関はAPIを提供していないことが多いです。
でも公共機関なのでそこの情報は皆喉から手が出るほど欲しい。
でも人力で管理するのは厳しい。
だからスクレイピングするしかねぇ!って感じです。

デメリット

沢山あります。

  • 法的にアウトな可能性がある
  • 法的にアウトじゃなくてもグレーな手法
  • サイトのリニューアルがあった場合データが取得できなくなる

順番に解説していきましょう。

法的にアウトな可能性がある

まず、あえてAPI化していない情報というものもあります。
その情報で稼いでいる人等は特に、
サイトの規約などで「二次配布・利用禁止」等と書かれている可能性があります。
そういったものをスクレイピングして自分のサービスで利用したらアウトです。
気を付けましょう

法的にアウトじゃなくてもグレーな手法

スクレイピングは特定のサイトにアクセスして情報を引っ張ってくることになるので、
そのサイトの負荷を高めます。
自分のサービスで情報を展開して、ユーザーのアクセスごとに叩くような方法の場合、
自分のサイトへのアクセスがそのままスクレイピング対象に乗っかります。
そうすると対象のサイトとしては、負荷が上がるけど収益は上がらないし全くいいことがありません。
絶対にそういう利用はやめましょう。
最低でも毎日一回情報を取ってくるとか、そのくらいの利用に留めておくのが良識的です。
可能なら毎月とか、毎年とか、データの更新頻度は出来るだけ低くするべきです。

サイトのリニューアルがあった場合データが取得できなくなる

HTML構造を引っ張ってきて、正規表現などを使ってデータを取得するので、
サイトリニューアルで構造が変わったり、
文言が変わるとデータが取得できなくなります。

その度に修正を入れるなど対応が必要になってきます。

スクレイピングを実際にやってみる。

散々やるなと書いておいてなんですが、
それでもAPI化されてない情報が必要な時はあります。
国のデータは特に宝の山です。正確性・情報量全てにおいてTOPクラスですからね。

というわけで、簡単にできるスクレイピングを実装していきます。

HTMLデータを取ってくる。

まずはサイトのHTMLデータを取ってきましょう。
https://www.data.jma.go.jp/obd/stats/etrn/view/monthly_h1.php?prec_no=40&block_no=00&year=2017&month=1&day=&view=
茨城県の気象データに犠牲になって頂きます。

これはcurlを使えば一発です。

curl 'https://www.data.jma.go.jp/obd/stats/etrn/view/monthly_h1.php?prec_no=40&block_no=00&year=2017&month=1&day=&view=' > hoge

これで帰ってきたデータを一旦hogeというファイルに吐き出しました。
これを加工していきます。

データを加工する。

まずはなんらかのエディタを使ってhogeの中身を確認しましょう。
お勧めはvimです。

中身を見ると昔ながらのtable構造になっている模様。
欲しいデータ部分はこんな感じのidとclassを持っている模様。

<table id=.tablefix1. class=.data2_s.>

なので、サクッとこのtableタグの中身を正規表現使って取っちゃいましょう。これでfugaの中にはtableの中身が入っています。

cat hoge | tr -d '\n' | sed -e 's/.*<table id=.tablefix1. class=.data2_s.>//g' | sed -e 's/<\/table>.*//g' > fuga

後はそれをさらに正規表現などを使って加工していきます。
まずタグが邪魔なので全部削除しちゃいましょう。

cat fuga | sed -e 's/<[^>]*>/ /g' | tr -s ' ' > hogefuga 

これでデータが空白区切りになりました。後は数値が出現した行を取得して、
その行ごとに折り返すみたいなことをすれば茨城県の各都市の気象データを取得できますが、
それは次回。