NOTE: 本プロジェクトはアーカイブしました。Scrapyを使うことにしたため、本プロジェクトを使わなくなったためです。
クローラー向けのクラス・ライブラリ
クローラー向けにクローリング・エンジン、キャッシュ管理、パーサーのベース・クラスを提供します。パーサーを実装してクローリング・エンジンに登録することで、簡単にクローリングを行うことができます。
Table of Contents
クローラーのライブラリやフレームワークはいくつもありますが、これらは私がほしい要件を満たしませんでした。私は次の要件を満たしたく、そのために当ライブラリを実装しました。
- Webページのダウンロード可否を複雑なルールで制御したい
- 前回のダウンロードが1日前以上で、ページ内のデータが1年以内の場合、など
- ダウンロードしたデータはS3ストレージに格納したい
- 既存のクローラーは、ほとんどの場合、ローカル・ストレージに格納する機能を持っています
- Webページを解析して次にダウンロードするURLを構築したい
- 単純にWebページのaタグを辿るのではなく
クローリングをどのように実行するのか(CLIアプリケーション、Webアプリケーション、など…)は、当ライブラリを実装する側の責務とします。
gem 'crawline', :git => 'git://github.com/u6k/crawline.git'
ダウンロードしたWebデータは、S3互換ストレージに格納します。あらかじめ、Amazon S3のバケットを作成して、アクセス・キーなど必要情報を入手してください。
ローカル環境のみで実行したい場合、S3互換ストレージとして minio などを利用することができます。実際、当プロジェクトもテスト実行の場合はminioを利用しています。詳細は、 docker-compose.yml を参照してください。
テスト用に簡単なパーサーを実装してあります。 spec/test_parser.rb を参照してください。
クローリングはCrawline::Engine
が行いますので、これを初期化します。
Crawline::Engine
は、Crawline::Downloader
、Crawline::ResourceRepository
、そしてパーサー配列を必要とします。
# User-Agentを渡して、Crawline::Downloaderを初期化する。
downloader = Crawline::Downloader.new("test/0.0.0")
# S3認証情報を渡して、Crawline::ResourceRepositoryを初期化する。
repo = Crawline::ResourceRepository.new(access_key, secret_key, region, bucket, endpoint, force_path_style)
# 正規表現とパーサーの配列を構築する。
# URLが正規表現にマッチしたパーサーを使用して、ダウンロードしたデータをパースする。
parsers = {
/https:\/\/blog.example.com\/index\.html/ => BlogListTestParser,
/https:\/\/blog.example.com\/page[0-9]+\.html/ => BlogListTestParser,
/https:\/\/blog.example.com\/pages\/.*\.html/ => BlogPageTestParser,
}
# Crawline::Engineを初期化する。
engine = Crawline::Engine.new(downloader, repo, parsers)
クローリングは、Crawline::Engine#crawl
メソッドにURLを渡すことで行います。
engine.crawl("https://blog.example.com/index.html")
クロールは、実際は「Webからデータをダウンロード」しています。パースはこの後にCrawline::Engine#parse
メソッドにURLを渡すことで行います。
result = engine.parse("https://blog.example.com/index.html")
パースは、実際は「各パーサーのparse
メソッドを呼び出し、context
に設定された値を返す」を行います。
テスト用に簡単なクロール & パースを実装してあります。 spec/crawline_spec.rb を参照してください。
最新の情報は、 Wiki - crawline - u6k.Redmine を参照してください。
APIリファレンス を参照してください。
当プロジェクトに興味を持っていただき、ありがとうございます。 新しいチケットを起票 していただくか、プルリクエストをサブミットしていただけると幸いです。
当プロジェクトは、 Contributor Covenant に準拠します。