Sc2009autumn s2robot

Post on 10-Jun-2015

3.031 views 1 download

Transcript of Sc2009autumn s2robot

Seasar Conference2009 Autumn

Copyright© 2002-2008 N2SM, Inc. All Rights Reserved

S2Robotで泳ぎませんか?~S2RobotとFessのご紹介~   

株式会社エヌツーエスエム菅谷信介

Seasar Conference 2009 Autumn

自己紹介 名前: 菅谷信介 所属: N2SM, Inc. オープンソース活動:

– Apache Portals (Jetspeed, Portals Bridges) コミッタ– Seasarプロジェクトコミッタ(S2Container, Teeda,

SAStruts, DBFlute, S2Portlet, S2Robot..)– Portal Application Laboratory(PAL)プロジェクト運

営– Fessプロジェクト運営などなど・・・

ブログ: http://d.hatena.ne.jp/shinsuke_sugaya/

Seasar Conference 2009 Autumn

Agenda S2Robot の概要 S2Robot の使い方 Fess の概要 Fess の特徴 Fess の使い方

Seasar Conference 2009 Autumn

S2Robot

Seasar Conference 2009 Autumn

Seasar2ベースのクローラフレームワーク「クローラ (Crawler) とは、ウェブ上の文書や画像などを周期的に取得し、自動的にデータベース化するプログラムである。「スパイダー」や「ロボット」などとも呼ばれ

る。」 出典: フリー百科事典『ウィキペディア(Wikipedia)』

コンポーネント化され、機能を柔軟にカスタマイズ可能

S2Robotとは

インターネットS2Robot

Seasar Conference 2009 Autumn

全文検索のインデックス作成→ 一番多いパターン(だと思う)

サイトの商品情報などを抜き出し→ ページ上の特定のデータを抜き出してDBに保存するなど

SEOチェックツール→ リンク切れとか、要素数を数えるなど

クローラを開発するというニーズは意外と多いHTTP通信やページ解析が面倒だから?

→実際に面倒でした…

クローラの利用場面

Seasar Conference 2009 Autumn

Webおよびローカルファイルシステムを対象 マルチスレッドクローリング 巡回する深さ、コンテンツ取得数を指定可能 巡回するコンテンツをURLでフィルタリング 柔軟に拡張可能なコンテンツ処理ルール 取得したコンテンツを指定した形式でDBに格納 画像や音声など様々なファイルから文字列抽出 robots.txt に従うクローリング

S2Robotの特徴

Seasar Conference 2009 Autumn

S2プロジェクトなら dicon に追加

S2Robotのセットアップ

<components> : <include path="s2robot.dicon"/> :</components>

備考: DBを利用する場合は s2robot_db.dicon を利用

簡単に使えます!

あとは、S2Robot を DI すれば利用可能

Seasar Conference 2009 Autumn

S2Robot のインスタンスを取得して実行

S2Robotの使い方(基本編)

// container から取得する場合S2Robot s2Robot = (S2Robot) container .getComponent(S2Robot.class);

// URL の追加 (この URL を起点にして巡回します)s2Robot.addUrl(url);// 巡回する深さを指定s2Robot.setMaxDepth(depth);

// クロールの実行 (実行時のセッション ID が返ります)String sessionId = s2Robot.execute();

カレントディレクトリに取得したものを保存

Seasar Conference 2009 Autumn

S2Robotの処理フロー

S2Robot

S2RobotThreadS2RobotThreadS2RobotThread S2RobotClient(Web,FS)

UrlFilter WebFS

execute()

start() Check the URL

Get the Content

ResponseData

RuleManagerRule

ResponseProcessor

process()

Transformer

ResponseData

ResultData

S2Robot DB

store()AccessResult

1

2

3

4

5

6

78

9

101112

WebFSWebFS

Seasar Conference 2009 Autumn

スレッド数の変更

巡回して取得するファイル数

URLキューが空のときに待つ回数

S2Robotの使い方(応用編 ~ その1)

// デフォルトのスレッド数: 10s2Robot. setNumOfThread(20);

// デフォルトの巡回取得数: 0 (無制限)s2Robot. setMaxAccessCount(10000);

// デフォルトの待つ回数: 20s2Robot. setMaxThreadCheckCount(30);

Seasar Conference 2009 Autumn

バックグラウンドで実行

バックグラウンド実行後、終了を待つ

セッションIDの指定 (再実行するときなどに利用)

S2Robotの使い方(応用編 ~ その2)

// デフォルト: false (execute() した後に待つ)s2Robot. setBackground(true);

// デフォルトの待ち時間 (ms): 0 (無制限)s2Robot. awaitTermination(60000);

// デフォルトのセッションID: yyyyMMddHHmmssSSSs2Robot. setSessionId(“200909120123456”);

Seasar Conference 2009 Autumn

アクセスするURLを制限することが可能 S2Robot 内の UrlFilter がアクセス先の URL を制御 アクセスできる URL を指定: addIncludeUrl()

アクセスしない URL を指定: addExcludeUrl()

デフォルトの実装 UrlFilterImpl を dicon で差し替えも可能

URLフィルタ

// 例: http://www.n2sm.net/ 以下だけにするs2Robot. addIncludeFilter(“http://www.n2sm.net/.*”);

// 例: jpg ファイルをアクセスしないs2Robot. addExcludeFilter(“.*\\.jpg”);

Seasar Conference 2009 Autumn

指定されたコンテンツの取得 CommonsHttpClient: http/https からコンテンツを取得 FileSystemClient: ローカルファイルシステムから取

得 S2RobotClientFactoryがS2RobotClientを管理

clientFactory は S2Container から取得可能 client.doGet(uri) でコンテンツを ResponseData で返

す 拡張は S2RobotClient を実装して s2robot_client.dicon

で addClient に加える

S2RobotClient

// url を元に適切なクライアントを判別 (http:,https:,file:)S2RobotClient client = clientFactory.getClient(url);

Seasar Conference 2009 Autumn

RuleManager: 取得したコンテンツの処理ルールを決定

Rule: コンテンツの処理内容を定義 RuleManager から Rule を取得

RuleManagerは S2Container からは取得できない (prototypeでS2Robotにセットされるため)

拡張は s2robot_rule.dicon で定義することが可能

RuleManager & Rule (その1)

// responseData を元に適切なルールを判別Rule rule = s2Robot. getRuleManager() .ruleManager.getRule(responseData);

Seasar Conference 2009 Autumn

addRule で複数ルールを追加することが可能

RuleManager & Rule (その2)

<components> <include path="s2robot_transformer.dicon"/>

<component name="ruleManager" class="org.seasar.robot.rule.impl.RuleManagerImpl" instance="prototype"> <initMethod name="addRule"> <arg>fileRule</arg> </initMethod> </component>

<component name="fileRule" class="org.seasar.robot.rule.impl.RegexRule"> <property name="defaultRule">true</property> <property name="responseProcessor"> <component class="org.seasar.robot.processor.impl.DefaultResponseProcessor"> <property name="transformer">fileTransformer</property> </component> </property> </component></components>;

Seasar Conference 2009 Autumn

ResponseDataを処理する DefaultResponseProcessor: 保持するTransformerを実

Transfomerは s2robot_rule.dicon で指定される NullResponseProcessor: 何もしない

ResponseProcessor

// RuleからResponseProcessorを取得 ResponseProcessor processor = rule.getResponseProcessor();processor.process(responseData);

Seasar Conference 2009 Autumn

ResponseDataをResuleDataに変換する ResultDataは取得データを加工したものを保持

例: 画像のメタデータから文字列を取得して保存など s2robot_transfomer_basic.dicon に基本的なものを定

保存データを復元も可能

Transfomer (その1)

// ResponseDataをResuleDataに変換 ResultData resultData = transformer.transform(responseData);

Transfomer transfomer = container .getComponent(“fileTransfomer”);// getData() で返されるものは各Transformerで定義Object obj = transformer. getData(accessResultData);

Seasar Conference 2009 Autumn

BinaryTransformer: バイナリデータをResultDataに格納

FileTransformer: カレントディレクトリにファイルとして保存

し、ResultDataにパスを格納 HtmlTransformer:

HTMLのバイナリデータと次のリンク先をResultDataに格納 XpathTransformer:

上記の拡張。指定したノードデータをXML形式で保存 TextTransformer:

文字列をResultDataに格納。Extractor機能を利用して様々な形式に対応。

Transfomer (その2)

Seasar Conference 2009 Autumn

様々なファイルから文字列を取得 対応フォーマットはMS Office, pdf, zip など多数 ExtractorFactoryがExtractorを管理

extractorFactoryはS2Containerから取得可能 Extractorの単体利用も可能 (s2robot_extractor.dicon)

Extractor

Extractor extractor = extractorFactory.getExtractor(mimeType);ExtractData extractData = extractor.getText(inputStream);String content = extractData.getContent();// content に inputStream のデータ本体の文字列だけ入るfor (String key : extractData.getKeySet()) { String[] values = extractData.getValues(key); // values にはメタ情報が入る}

Seasar Conference 2009 Autumn

データ格納用エンティティ AccessResult: アクセス結果のパラメータ AccessResultData: 加工後のコンテンツデータ ResponseDataとResultDataからAccessResultと

AccessResultData を生成 DataService インターフェース経由でアクセス 現在、オンメモリまたはDBに保存することが可能

AccessResult & AccessResultData

Seasar Conference 2009 Autumn

AccessResultとAccessResultDataの取得や保存など S2Containerから取得することが可能 AccessResultの取得

あるセッションIDのAccessResult群を取得

DataService

// セッションIDとURLをキーにして取得AccessResult accressResult = dataService .getAccessResult(sessionId, url);

dataService.iterate(sessionId, new AccessResultCallback() { public void iterate(AccessResult accessResult) { // accessResult の処理… }});

Seasar Conference 2009 Autumn

マルチスレッドクローリング→ 同期を最低限にしたり、結構がんばりが必要

壊れた HTML→ nekohtml が結構吸収してくれるけど→ 大手サイトのページでもおかしいものがあったりする…

コンテンツ取得数の指定→ マルチスレッドなので上限で止めるのが大変…

S2Robotのスレッドセーフ→ 複数のS2Robotのインスタンスを同時実行

H2Databaseのパラメータ→奥深い・・・(よくわからん)

S2Robotの苦労話 (おまけ?)

Seasar Conference 2009 Autumn

データベース周りの整理 metaタグの robots に従う 壊れたURL対応(不正な文字とかを除外するフィ

ルタ) サイトマップを読む OpenOffice 系ファイル対応

S2Robotの今後

Seasar Conference 2009 Autumn

Fess

Seasar Conference 2009 Autumn

Javaフレンドリーな全文検索システム「全文検索(ぜんぶんけんさく、Full text search)とは、コ

ンピュータにおいて、複数の文書(ファイル)から特定の文字列を検索すること。」 出典: フリー百科事典『ウィキペディア(Wikipedia)』

Apacheライセンスのオープンソースプロダクト ちなみに Full tExt Search System → Fess

Fessとは

Fessサーバファイルシステム インターネット

Seasar Conference 2009 Autumn

Namazu, Hyper Estraier, Senna, Rast, Nutch, Google Mini, FAST ESP, ConceptBase...

Namazu→スケールしない

Google Mini→ブラックボックス→入れ替え作業が発生する

世の中の検索システム

Seasar Conference 2009 Autumn

Java (Seasar2) ベースの検索システムFessの特徴 (その1)

S2ChronosS2Container SAStruts S2Robot

DBFlute

用途に応じて柔軟に対応可能な設計

Seasar Conference 2009 Autumn

標準でオールインワンで提供 Tomcat の起動で利用可能!

Fessの構成図

Tomcat

SAStruts Solr

S2Robot

H2Database

S2Chronos

Seasar2

DBFlute

fess.war solr.war

Seasar Conference 2009 Autumn

S2Robot で Web とファイルシステムをクロール

様々なファイルフォーマットをサポート→テキスト(HTML,XML含む)、MS Office関

連、PDF、zipなどの圧縮ファイル、画像ファイル、音楽ファイル

ブラウザ上でクロール対象設定 検索結果のパス変換 (ローカルパスの変換と

か) クロール情報のサマリー表示

Fessの特徴 (その2) ~ S2Robotなど

Seasar Conference 2009 Autumn

Luceneベースのオープンソース検索サーバー XML/HTTP や JSON の API Fess のUI から SolrJ で接続 ファセット検索 検索結果の強調表示 SHOOTIで約2億のWebページをインデックス

Fessの特徴 (その3) ~ Apache Solr

Fess ではSolrサーバーをグループ化して状態管理(ハイエンドユースを視野に入れた設計)

Seasar Conference 2009 Autumn

検索サーバ・更新サーバ交換方式Solrサーバ構成例1

Fess

Solr Group 1

Solr Group 2

検索

更新

Seasar Conference 2009 Autumn

レプリケーション方式Solrサーバ構成例2

Fess

Solr Group 1

Solr Group 2

検索

更新

インデックスコピー

Seasar Conference 2009 Autumn

分散クロール方式Solrサーバ構成例3

Fess

Solr Group 1

Solr Group 2

検索

更新

インデックスコピー

Fess DB

Seasar Conference 2009 Autumn

携帯向けアプリ構築のオープンソースフレームワーク→ 3キャリアの絵文字に対応→ 3キャリアの絵文字入りメール/添付メール/デコメールの

送信に対応→ 画像を動的にリサイズ表示→ 端末プロファイル情報などを取得可能→ GPS/GoogleMapインターフェースを提供

Fessの特徴 (その4) ~ mobylet

Fessでは各端末に最適な表示を実現

Seasar Conference 2009 Autumn

検索語を入力

Fess のUI (検索結果)

Seasar Conference 2009 Autumn

管理者でログイン クロール時刻、インデックス操作、モバイル変換

を設定

Fessの管理UI (クローラ設定)

Seasar Conference 2009 Autumn

クロールするウェブ情報の設定管理

対象URLとフィルタ 各種パラメータ ユーザーエージェント名 ブラウザタイプ

Fessの管理UI (ウェブクロールの設定)

Seasar Conference 2009 Autumn

クロールするファイルシステム情報の設定管理

対象パスとフィルタ 各種パラメータ ブラウザタイプ

Fessの管理UI (ファイルシステムクロールの設定)

Seasar Conference 2009 Autumn

検索結果のリンクを書き換えるクロールした結果がファイルシステムの場合にブラウザか

らアクセスできるように書き換えるなどで利用

Fessの管理UI (パスマッピング設定)

Seasar Conference 2009 Autumn

検索結果表示時にブラウザの種類で表示を切り替え

モバイルでアクセスした場合はモバイルページに移動

Fessの管理UI (ブラウザタイプ設定)

Seasar Conference 2009 Autumn

Solrの状態と設定管理 グループ化された Solr に対して、コミット、最適

化、削除を実行可能

Fessの管理UI (Solr設定)

Seasar Conference 2009 Autumn

クロール結果の情報表示

クロール時間 インデックス数

Fessの管理UI (セッション情報)

Seasar Conference 2009 Autumn

プロジェクトサイト:http://fess.sourceforge.jp/ja/

Fess Server 1.0.0 が利用可能

Fess の情報

要望などあればお知らせください

Seasar Conference 2009 Autumn

認証サイトへのアクセス ログファイルのダウンロード リクエストヘッダーの付加 重複ドメインの除外 ロールによる検索結果の出しわけ ラベル付け Solr のアップグレード

Fess の今後

Seasar Conference 2009 Autumn

ありがとうございました