Webクローラを作ってみよう(本編?)

Webクローラを作ってみよう(本編?)

どうもこんばんにちは.うぃるです.
前回の記事では前提条件としてWgetについて若干触れたところで切ってしまったので今回はしっかりとクローリングできるように改良しておきたいと思います.
前回記事:Webクローラを作ってみよう(前提編)

その前に!
このブログの内容では以下のサイトを参考にしております.
無断且つ一方的にリンクを張らせていただくので是非そちらを読んでください.(この記事が必要なくなるくらい参考になります.)
リンク1:wgetが超絶便利なwebクローラー、クローリングツールだとは知らなかった・・・! | ばうあーろぐ
リンク2:シェルスクリプト入門 書き方のまとめ | Memo on the Web

せっかくなので最初に宣言しておきます.
この記事によって出た損害は当ブログでは一切責任をおえませんのでよろしくお願いします.(要約すると自己責任でお願いします.)

目次

今回使うオプションをまとめてみる

いきなりですが,前回色々とやったのでwgetコマンドのちょこっとした使い方は問題ないと思います.
と,言うことで,タイトルあたりに書いてあるwgetのページを参考にしながら(丸ぱくり...),wgetのオプションをつけて実行させてみたいと思います.

cdmkdirlsコマンドを使い,homeディレクトリのDocumentsにwebpageと言うディレクトリを作成しました.
enter image description here

ここで,オプションと言う名の装飾をつけます.

wget --recursive --level inf --no-clobber --random-wait --restrict-file-names=windows --convert-links --no-parent --adjust-extension example.com
wgetが超絶便利なwebクローラー、クローリングツールだとは知らなかった・・・! より引用

ちょっとどころでは無く長いです.
とりあえず,解説は上記ページに書いてあるので参照お願いします.

今回はこのコマンドをベースに,新しくLinuxのコマンドを作っていきたいと思います.(毎回こんなに入力するのは酷なのです...)

引用のオプションでも良いのですが,自分はあと2つ追記します.
一つ目はwaitオプションです.
wget の次に-w5と書いておきます.これは,-w数値とすることで,数値分の間隔を開けてくれるコマンドです.もちろん,指定しなくても問題は無いと思うのですが,安全を取って5秒~10秒取っておくのがベターと考えました.

次に-- no-check-certificateオプションです.
これは主にSSL周りのエラーを防止するためのやつです.本来であれば,合ってはならないのですが,たまに俺俺証明書でサーバを運営している方がいたりします.(本当に100年に1度のレベルです.)また,証明書の情報が・・・ってた時にエラーが出るのを防ぐためにとりあえずつけておきます.(多分必要が無かった気がする・・・)

これらを含めて再度コマンドを構成します.

wget -w5 --recursive --level inf --no-clobber --random-wait --restrict-file-names=windows --convert-links --no-parent --adjust-extension -- no-check-certificate example.com

そして,このexample.comのところにURLが入ります.
これでwgetを装飾できました.

次の章ではコマンドを作ります.

Linuxのコマンドを作ろう

Linuxのコマンドを作る.これは多分敷居が高いのではと思う方もいらっしゃると思いますが,作ってしまえば案外簡単に作れます.(むしろこんな事が簡単にできることがLinuxの一つの醍醐味だと思われます.)

ここでは余り深く詮索しませんが,簡単に説明したいと思います.
Linuxは様々な種類があるのですが,大本は1つなので一般的には.という体でさらに今回はUbuntuでは.と言う体で説明させていただきます.

Linuxにはwhichと言うコマンドがあります.これは,そのコマンドがどこにあるかを教えてくれる便利なコマンドです.which wgetなどとして使います.
そして,Ubuntuでは主に/usr/bin/の中にコマンドのシェルスクリプトが格納されています.
つまり,この場所にコマンドを作ってあげれば,通常のターミナルで使用しているような状態でコマンドが使える訳です.

早速作りましょう.
今回は,色々と誤爆するといけないので,home->Documents->command とDocumentsにcommandというファイルを作りそこで主に作業をしていきたいと思います.

ターミナルで作業ディレクトリに到達したら,エディタを使用するので,エディタのコマンドを打ってください.
私は,emacs派なのでemacsを使用していますが,vimでもnanoでも良いのでとりあえずエディタを起動します.

よく分からない人は次のコマンドを打つと幸せになれます.
sudo apt-get install emacs->パスワード入力後 yを押してインストールを完了させてください.
インストールが終わったら,次のコマンドを打ってください.
emacs wgets
そうするととりあえずemacsが起動するので,これで行きましょう.(詳しい操作方法はググってください.)

言い忘れていましたが,今回のコマンドはwgetsとする予定です.
名前が気にくわない場合は他の名前でも結構です.

エディタを開いたら次のようにしてコマンドを作ります.
#!/bin/sh
read -p "Prease getting URL: " url
wget -w5 --recursive --level inf --no-clobber --random-wait --restrict-file-names=windows --convert-links --no-parent --adjust-extension -- no-check-certificate $url

enter image description here

ここでちょこっと解説を入れておきます.
1行目の#!/bin/shはシェルスクリプトであることの宣言です.こいつがあるとシェルだ!と言うことです.
2行目のread -p "Prease getting URL :" urlではユーザから任意の文字列を読み取るやつです.
このPlease getting URL :は自分の好きなように変えてもらって構いません.その後のurlはユーザが入力した文字列を格納する変数です.今回のコマンドの場合はサイトのURLを入力するので,URLの文字列が変数に入ります.
そして最後に先ほどカスタムしたwgetのコマンドを入れます.
ここで1つ注意点なのですが,前章で装飾したwgetコマンドの最後はexample.comとなっていますが,今回はユーザから入力を受け付けた変数をコマンド内に格納しているので,その変数を参照するために$urlとなっています.ここをミスるとクローラとして動作しないので注意しましょう.

間違える事無く,エディタに入力できたら保存して閉じましょう.参考までにemacsの場合は[CTRL + X] + [CTRL + S]で保存,[CTRL + X] + [CTRL + C]で終了できます.

ここまで来たらあと少し.
この自作じたコマンドに実行権限をあげましょう.
ターミナルでしっかりファイルが保存されている事を確認したら,sudo chmod a+x wgetsでこのwgetsコマンドに実行権限を与える事ができるのです.

最後に,作業ディレクトリで作ったwgetsのコマンドを,実行できる場所にコピーしてあげましょう.
cp wgets /usr/bin
これで多分完成となります.

実際に動かしてみる

早速動作テストです.

/home/Documents/websiteと適当に作ったディレクトリ上でコマンドを打ち込みます.
wgetsと打ち込むと,Prease getting URL:と出てくれるので,とりあえずhttp://yahoo.co.jpと打ち込んでおきましょう.

ダーっと色々ターミナルに流れたら,lsコマンドでダウンロードできているか確認し,実際にブラウザでダウンロードができているか確認してみます.

enter image description here

こんな感じでyahooさんのページをクローリングしてみたいと思います.

enter image description here

クローリングしてきたhtmlファイルをブラウザで開くとこんな感じになりました.
環境が環境なので正しく表示されているとは言えませんが,ダウンロード自体はできているようです.

最後に

今回は大分長い記事になってしまいました.
本当であれば途中で切るべき記事だったのですが,気合い入れて書き切りました.(この時点で投稿日の午前4時)
一応これでクローラを作る事ができたので目標の1つはクリアです.本当にwgetを使用したクローラが真価を発揮するのは,もう少し後になりそうですね.(これだと1回のみのクローリングなので単発利用しかできない)
これからはクローラを少し改善しつつ,情報を集約して見れる形までにしたいですね.
このままだとただローカルに落とし込んだだけなので,ここから必要な情報のみを抽出できるようにしていきたいと思います.

後,最近急激にアクセス数が増えてきた気がします.今までは月500pv行けばいいかなーなんて思っていましたが,先月は1000pv行きました.一日あたりで見ていくと,始めた頃は20pv/日くらいだったのが,今だと50pv/日くらいになっています.slack関連の記事が伸びてきているので,またslackの記事でも書きますかな.(最近slackを使用していないので状況がよく分からない...)

長編になりましたが,最後までお付き合いいただきありがとうございました.

0 件のコメント :

コメントを投稿