👙

けしからん画像分類器を作ってみる (4) データ収集 その3

2021/03/01に公開

目次

続 データ収集について

前回、クローラ実装に関する7トピックのうち、3トピックについて紹介しました。今回は後半4トピックについて紹介したいと思います。

クローラの実装に関して、工夫した点、上手くいった点などは以下の通りです。(再掲)

  • クローラはRubyで実装しました
  • wgetcurlを活用しました
  • MQTT経由でクローラの状態を観察できるようにしました
  • メタ情報はJSON形式のファイルとして出力しました
  • URLの正規化を頑張りました
  • HTMLもすべて保存しました
  • データベースは使用しませんでした

メタ情報はJSON形式のファイルとして出力しました

収集したページ(HTML)、画像のメタ情報を、データと同じディレクトリにJSON形式で保存しました。
foo.htmlfoo.html.jsonbar.jpgbar.jpg.jsonみたいな感じで。

ページの解析結果には、ページのタイトル、含まれる画像のリストなどが含まれていますが、何度も解析しなくて済むように、解析済みのデータをメタ情報として出力しました。

画像については、画像の高さ、幅など一般的な情報をメタ情報として保存しました。画像のファイル自体を読まなくてもサイズが分かるのは、周辺ツールを作る時には地味に便利でした。

・・・あれ?なんでこのトピックを紹介したかったのか分からなくくらいに当たり前のことしか書いていないですね。トピックを準備した理由を思い出したら追記したいと思います。

URLの正規化を頑張りました

残念ながらインターネット上のURLは綺麗なものばかりではありません。
できるだけ重複したページを排除したかったため、URLの正規化(Canonicalization)を頑張りました。

<link rel="canonical" href="..." />タグが指定されていればその値も参照しつつ、以下の処理を行いました。

  • フラグメント部分(#より後)を削除しました。
  • クエリ文字列はキーでソートしました。
  • 不要なクエリ文字は削除しました。

データを収集したサイト毎に様々な癖があったため、それぞれに泥臭い処理を書いています。
特に、日本語のタグ名をURLに含んでいるサイトの処理に手こずりました。URLエンコードするかしないか、どっちかにしてよ!💢

HTMLもすべて保存しました

収集したデータは、画像、動画だけでなくHTMLも含めてすべて保存しました。
HTMLから抽出した必要な情報はメタ情報として出力していますが、再抽出が必要になった時のためにHTMLも保存しました。
現代においてストレージはとても安いリソースであるため、富豪的に使いました。

データベースは使用しませんでした

「大量のデータを収集する」となると、ついデータベースを使いたくなりますが、クローラの実装では使いませんでした。(後段の処理では使っています)

「JSON形式の10万ファイルを舐める」みたいな操作も、現代のコンピュータでは比較的短時間で行うことができるため、単純化のためにファイルシステムだけで管理することにしました。(PCIe 4.0のSSD、おすすめです!)

この辺りは「データ管理編」で書きたいと思っています。

番外編: HTTPプロキシに色々任せたかったけれど結局使いませんでした

ホスト毎の最小アクセス間隔の制御、再取得時の負荷軽減、キャッシュの失効管理などは既存のHTTPプロクシソフトウェア(Squidなど)に任せたかったのですが、結局、調べ終わる前にデータ収集が終わってしまいました。
次にクローラを実装する時には使ってみたいと思います。餅は餅屋!あるものは使わないと。

今日はここまで

今回は、クローラの実装に関する残りの4トピック+番外編について書いてみました。
書き終えてみると、ほとんど内容がないですね。すみません。まあ、初心者なのでお手柔らかに。

次は「データ管理」について書こうかと思っています。今日はここまで!

けしからん画像分類器を作ってみる (5) データ管理 その1」に続く。

Discussion