ラズベリーパイの操作では「シェル」の操作を知ることがとても重要です。LXTerminalというソフトと「シェル」についての違いはしっかり理解しておく必要があります。それについては以前の記事「ターミナルとシェルの違いについて」を以下のリンクからご覧ください。
通常インターネットから情報を得る場合はラズベリーパイにも搭載されているブラウザなどを通して視覚的に情報を取得していますが、シェルからデータとしてネット上の情報を取得するすることもできます。これにより、シェルでプログラムをしておくことで定期的にインターネットからデータを取得したりすることができます。
ラズベリーパイにはWiFiでの接続とEthernetの有線での接続でインターネットに接続できますので、ネットに接続できる環境にしておいてください。WiFiでの接続設定を行いたい方は以下の「ラズベリーパイをWiFiでインターネット接続」の記事をご覧ください。
【STEP-07】ラズベリーパイを無線LAN(WiFi)でインターネット接続
Curlコマンドでシェルからデータ取得
curlコマンドはネットワーク経由でのファイルの操作やアップロード・ダウンロードなどを行うためのコマンドです。ネットワークで利用される殆どのプロトコルに対応しているためインターネットからの情報収集に便利なコマンドとして利用できます。
早速このコマンドを使ってみます。Googleのウェブサイトから情報を取得してみます。以下のコマンドを入力します。
$ curl http://www.google.co.jp
すると画面には訳の分からない文字がたくさん表示されました。これはHTMLのソースコードと呼ばれるもので、インターネットのWebページはHTMLという形式で書かれており、この内容が表示されたことになります。このHTMLと呼ばれる形式のファイルをブラウザなどで開けばレイアウトされたいつものGoogleの画面が見れます。
今度はこのコマンドに「-I」というオプションを付けてコマンドを打ってみます。
$ curl -I http://www.google.co.jp
-I はcurlコマンドのオプションでGoogleのホームページのHeader情報を取得するコマンドです。
今度はHeaderだけの情報が表示されました。curlコマンドは付けるオプションによってその動作が変わります。
では次に他にはどのようなオプションがあるのかを–helpオプションを付けてみてみましょう。
$ curl –help
凄い量のオプションが出てきました。LXTerminalの画面で収まりきらなかったため、ちょっとコマンドに工夫をしてみます。
パイプを使ってコマンドを連結
シェル上で使うLinuxコマンドは、連結させることによってその機能を拡張することができます。1つ目のコマンドで出てきた出力を次のコマンドに渡して処理をする「パイプ」という機能です。コマンドを連結するパイプは「|」という縦の棒一本を使います。日本語キーボードではBackspaceの左側「¥」マークのキーと同じ場所をShiftを押して表示させます。
ここでは、$ curl –help コマンドで出てくる出力を more というコマンドに渡すことで、Enterキーを押して画面表示を少しずつずらしていく事が可能です。moreコマンドはファイルの中を表示させて閲覧したりする場合によく使われます。
$ curl –help | more
と入力するとEnterキーを押しながら徐々にCurlコマンドのヘルプを参照することが可能です。
コマンドの多くは–helpオプションでその使い方やオプションの内容が表示されます。
ウィキペディアから情報を収集する
では、curlコマンドを使ってウィキペディアから情報を収集することにします。今回は日本の各県の県庁所在地をウェブページ内から調べてみます。
Crulコマンドでは、ウェブページを構成しているデータを全て取ってくることができるため、その取得した内容の中から情報を探し、その部分だけを表示するようにしてみます。
ウィキペディアの構造を知る
ウィキペディアは検索した名称がそのままURL上に表示されるため、あとで同じことを処理させるのに簡単にできそうです。下の埼玉県を調べたときにはURL内に埼玉県が入るため、ここのURL末尾を東京都などに変えることで今度は東京都のデータを取り出すことができます。
試しに、Curlコマンドで埼玉県の情報を取得してみます。LXTerminalでは日本語が使えます。(まだ日本語環境が入っていない方は、日本語環境の設定をご覧ください。)
$ curl https://ja.wikipedia.org/wiki/埼玉県
するとすごい量のHTMLデータが流れてきたと思います。この中から「所在地」のデータを取り出すためにgrepコマンドでその部分を探します。grepコマンドはファイル内の文字列を検索したり、標準出力の中から文字列を検索したりすることができるもので、よく他のコマンドからパイプで出力を渡された後に使ったりします。
$ curl https://ja.wikipedia.org/wiki/埼玉県 | grep 所在地
この結果を見ると、このページ内には「所在地」という言葉が複数あるのがわかります。この中から最初の1個だけ取り出したい場合には -m1 とつけることで最初の1個を取り出します。
$ curl https://ja.wikipedia.org/wiki/埼玉県 | grep -m1 所在地
1個目の「所在地」の周辺の情報は取りだせたようですが、肝心の所在地の住所が取れていません。この場合grepコマンドのオプション -Aを付けることで、そのあとの行も取り出すというオプション機能を追加できます。とりあえず1行くらいつければ表示されると思いますので、-A1 とオプションをつけます。2行取り出したい場合は-A2とします。
$ curl https://ja.wikipedia.org/wiki/埼玉県 | grep -m1 -A1 所在地
これで県庁の住所が表示されました。しかしこれだと余計なものがまだまだ沢山表示されています。例えば一番最後の行にはcurlコマンドによるエラーのようなものが表示されています。これを表示しないようにするには-sオプションを付けてみます。
ひとつ前のコマンドを呼び出す場合はキーボードの矢印上「↑」キーを押すと呼び出せますので、そこにcurlの後に-sを入れてみましょう。
$ curl -s https://ja.wikipedia.org/wiki/埼玉県 | grep -m1 -A1 所在地
これで、上下のエラーみたいなのは消えましたが、まだまだタグが多いです。とりあえず、タグの><の並びを全て改行に変換してみようと思います。この場合trコマンドを使って、><の組み合わせを改行にすることで、先ほどのgrepコマンドの「-A」オプションを使って行を指定しやすくなりますので、これを実行してみます。さらにパイプを繋いでtrコマンドで置換を行います。改行は「\n」で改行を意味します。
$ curl -s https://ja.wikipedia.org/wiki/埼玉県 | grep -m1 -A1 所在地 | tr ‘><‘ ‘\n’
LXTerminalで少しスクロールさせて戻してみると大分住所の部分がはっきりしてきましたので、ここで「〒」マークから4行あとを表示させるgrepコマンドをさらにつなげれば見やすくなると思います。
$ curl -s https://ja.wikipedia.org/wiki/埼玉県 | grep -m1 -A1 所在地 | tr ‘><‘ ‘\n’ | grep -A4 〒
これでだいぶ見やすくなりました。このようにシェルでコマンドをつなげていく事で、自分に必要な情報をインターネットから取得できるようになるのですが、毎回このようにコマンドを売っていると大変です。他の県の県庁所在地を調べる場合には殆ど同じコマンドを打つわけですからこれをスクリプトにして自動化してみます。
スクリプトを作ってみる
ここでは先ほどまでのコマンドの組み合わせに「変数」を使って、このスクリプトと都道府県名を入力すれば、県庁所在地の住所を表示するスクリプトを作ってみます。スクリプトは先ほどのコマンド処理をファイルに落としてそれを実行するというものです。
スクリプトの名称はkencho としたいと思います。
catコマンドを使うとkenchoというファイルを作成できます。以下のようにcatコマンドで複数行に渡るファイルを出力する場合、<<EOSというヒアドキュメントを使用して作成していきます。これはEOSから次に1行まるごとEOSが入るまでを1つのまとまりにしてkenchoというファイルに書き込むというコマンドになります。今回のスクリプトの中では変数を利用するため、このヒアドキュメントEOSをシングルクォーテーション「’ ’」でくくります。
cat <<‘EOS’ >kencho
>name =$1
> curl -s https://ja.wikipedia.org/wiki/$name | grep -m1 -A1 所在地 | tr ‘><‘ ‘\n’ | grep -A4 〒
>EOS
name=$1 という指定で$nameという変数名にします。これによって、kenchoというスクリプト名の後に都道府県名を入力することで、$nameの位置に都道府県が入れ替わり、コマンドがスクリプトから実行されます。
入力できたら、lsコマンドでファイルが作成されているか確認します。
これでkenchoというファイルが出来ていることがわかりました。moreコマンドなどで中身を確認してみるのも良いと思います。
このファイルはkenchoというファイル内にスクリプトが書かれている単なるファイルになっていますので、このファイルに実行権限を付けてあげなければなりません。実行権限をつけるにはchmodコマンドで実行権限である「x」を足してあげます。
$ chmod +x kencho
これで、実行権限がつきましたので、以下のようにlsコマンドに-l オプションを付けて権限を確認するとxがついていることがわかります。
では、これでスクリプトを実行してみましょう。スクリプトを実行する場合は「./」という「現在のディレクトリにあるものを実行しますよ」という意味の記号を付けて実行します。これは、ls やcatなど他のコマンドとは違って、このコンピュータ内のどこの位置からも実行できるような状態になっていないため、つけるものです。
$ ./kencho 岩手県
今回は/span や br /などのようにHTMLの残骸をのこしたままちょっと雑に話を進めてしまいましたが、気になる方はこれらタグの残骸も綺麗に消してしまえば、より見やすいシェルスクリプトを完成できると思いますので、是非チャレンジしてみてください。trコマンドなどの文字の置換を丁寧に行えばよりきれいな形で表示が可能になります。
今回はコマンドを沢山パイプでつないでインターネット上からの情報を整形して表示しました。ほかにも様々な利用方法があるとおもいますが、シェル上で使うコマンドをいろいろ学ぶことで自分がやりたい処理を自動的に行わせることができることがわかっていただけたかと思います。
ほかにも便利なコマンドはたくさんありますので、是非便利なコマンドやそのオプションを覚えてシェルを上手に活用しましょう。