Project

General

Profile

Crawline (crawline)

Build Status license GitHub release Website Website standard-readme compliant

クローラー向けのクラス・ライブラリ

クローラー向けにクローリング・エンジン、キャッシュ管理、パーサーのベース・クラスを提供します。パーサーを実装してクローリング・エンジンに登録することで、簡単にクローリングを行うことができます。

Table of Contents

Background

クローラーのライブラリやフレームワークはいくつもありますが、これらは私がほしい要件を満たしませんでした。私は次の要件を満たしたく、そのために当ライブラリを実装しました。

  • Webページのダウンロード可否を複雑なルールで制御したい
    • 前回のダウンロードが1日前以上で、ページ内のデータが1年以内の場合、など
  • ダウンロードしたデータはS3ストレージに格納したい
    • 既存のクローラーは、ほとんどの場合、ローカル・ストレージに格納する機能を持っています
  • Webページを解析して次にダウンロードするURLを構築したい
    • 単純にWebページのaタグを辿るのではなく

クローリングをどのように実行するのか(CLIアプリケーション、Webアプリケーション、など…)は、当ライブラリを実装する側の責務とします。

Install

gem 'crawline', :git => 'git://github.com/u6k/crawline.git'

Usage

S3をセットアップする

ダウンロードしたWebデータは、S3互換ストレージに格納します。あらかじめ、Amazon S3のバケットを作成して、アクセス・キーなど必要情報を入手してください。

ローカル環境のみで実行したい場合、S3互換ストレージとして minio などを利用することができます。実際、当プロジェクトもテスト実行の場合はminioを利用しています。詳細は、 docker-compose.yml を参照してください。

パーサーを実装する

テスト用に簡単なパーサーを実装してあります。 spec/test_parser.rb を参照してください。

クローリングを開始する

クローリングはCrawline::Engineが行いますので、これを初期化します。

Crawline::Engineは、Crawline::DownloaderCrawline::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 を参照してください。

Other

最新の情報は、 Wiki - crawline - u6k.Redmine を参照してください。 Wiki - crawline - u6k.Redmine は常に編集しており、バージョン・アップのときにREADMEに反映します。

API

APIリファレンス を参照してください。

Maintainer

Contribute

当プロジェクトに興味を持っていただき、ありがとうございます。 新しいチケットを起票 していただくか、プルリクエストをサブミットしていただけると幸いです。

当プロジェクトは、 Contributor Covenant に準拠します。

License

MIT License