Chapter 09

おわりに

Shotaro Tsuji
Shotaro Tsuji
2020.12.08に更新

最後に今回やったことをまとめておきましょう。

  • reqwestクレートを使って、HTTPサーバにGETリクエストを送信してウェブページを取得しました。レスポンスからボディ、ステータスコードやリダイレクト後のURLを取り出しました。
  • selectクレートを使って、HTML文書から<a>要素を抜き出し、そのhref属性の値を取り出しました。
  • urlクレートを使ってURLをパースしました。パースしたURLが相対URLだった場合にはリダイレクト後のURLをベースにして絶対URLに変換しました。
  • logクレートを使って、ログを記録するようにしました。ログの表示にはenv_loggerクレートを使いました。
  • thiserrorクレートを使って独自のエラー構造体を実装しました。呼び出し側でのエラー処理にはeyreを使いました。
  • 幅優先探索をイテレータとして実装しました。
  • structoptクレートを使ってコマンドライン引数のパース機能を作りました。

以上のステップを踏んで、最低限の機能をもったウェブクローラを作ることができました。この冊子で知ったことを読者のみなさんが作るプログラムに役に立つことを願います。また、mini-carwlerにさらに機能を付け加えてみたい人は、どうぞご自由に改造してみてください。完成版のソースコードは https://github.com/ShotaroTsuji/mini-crawler にMIT Licenseで公開しています。

使用したクレートに関する補足

コマンドラインプログラムを作成するために使用するクレートについて少し補足をしておきます。

手続きマクロを使ってコマンドライン引数を処理するクレートは現在のところstructoptを使うのがベストだと思いますが、将来的にはclapに同等の機能が実装されるようです[1]

ロギングに関しては、シングルスレッドのプログラムを実装するのであればlogクレートで十分なように思います。しかし、マルチスレッドや非同期のプログラムに対しては不十分でしょう[2]。より高機能なクレートとしてslogがありますが、筆者は使ったことがないのでこれに対してコメントはできません。

この冊子で作ったプログラムを実際に動かした方の中には、env_loggerが色付けして文字を表示していることが気になった方もいるでしょう。ターミナルにエスケープシーケンスを使って文字を色付けするためのクレートとして、ansi_termがあります。また、出力がターミナルか否かを判別するにはattyを使います。

エラー処理に関しては、ライブラリではthiserrorを使い、アプリケーションではanyhowを使うのが標準的なようです。ただし、今回はanyhowの代わりにそのフォークであるeyreを使いました。これは筆者が普段、エラー表示のためにcolor-eyreを使っていて、eyreの方に慣れているからです。

参考文献

脚注
  1. https://qiita.com/watawuwu/items/a6cbcd92dfb5336b9a01#引数処理c ↩︎

  2. logクレートにおいて排他処理は行われています。ただしlog::debug!などのマクロを呼ぶたびにenv_loggerなどのクレートが登録したロガー(Logトレイトを実装したオブジェクト)が呼び出されます。env_loggerのロガーは呼び出されるとそのスレッドで印字処理が行われるようなので、おそらくログを記録するたびにブロックしてしまいます。また、非同期プログラミングにおいては、どのタスクを実行している時のログなのかも記録しないと、後から解析するのが困難になります。 ↩︎