Webクローリングとスクレイピングを行う基盤アプリケーション
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bin
docs
lib
spec
.gitignore
.rspec
.travis.yml
CHANGELOG.md
Dockerfile
Gemfile
LICENSE
README.md
Rakefile
crawline.gemspec
docker-compose.yml

README.md

crawline

Travis license GitHub release 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に反映します。

Maintainer

Contribute

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

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

License

MIT License