GooseはGravity Labsが開発・公開したScalaベースのHTMLコンテンツ抽出ライブラリです。ウェブページから記事本文、タイトル、画像、公開日時などを自動で抽出でき、データ収集やテキスト分析に最適です。ここでは、Scala未経験者でもすぐに使えるよう、環境構築から実行までの流れを解説します。
開発環境の準備
まず、JDK 8以上とScala 2.10系(推奨バージョン2.10.1)をインストールしてください。次に、以下のコマンドでリポジトリをクローンし、Mavenでビルドします:
git clone https://gitcode.com/gh_mirrors/goo/goose
cd goose
mvn clean package
正常にビルドされると、target/フォルダ内にjarファイルが生成されます。
シンプルな抽出例
以下のコードは、指定URLから記事情報を取得する最小限の実装です:
import com.gravity.goose.Goose
object ArticleExtractor {
def run(): Unit = {
val parser = new Goose()
val doc = parser.extractContent("https://example.com/news")
println(s"見出し: ${doc.title}")
println(s"本文: ${doc.cleanedArticleText.take(200)}...")
println(s"画像数: ${doc.topImage.map(_ => 1).getOrElse(0)}")
parser.shutdown()
}
}
主な抽出機能
- 本文抽出:
StandardContentExtractorがDOM構造を解析し、ノイズを除去して本文を特定します。 - メイン画像検出:
StandardImageExtractorが記事に関連する代表画像を選定します。 - 公開日推定:
PublishDateExtractorがメタタグや本文中の日付表記から公開時刻を推測します。
カスタム抽出器の設定
特定のサイト向けに抽出ロジックを変更したい場合は、設定オブジェクト経由でカスタム抽出器を注入できます:
import com.gravity.goose.{Configuration, Goose}
import com.gravity.goose.extractors.ContentExtractor
class CustomTextExtractor extends ContentExtractor {
override def extract(content: String): String = {
// 独自のクリーニングロジック
content.replaceAll("<aside>.*?</aside>", "")
}
}
val settings = new Configuration()
settings.setContentExtractor(new CustomTextExtractor())
val customParser = new Goose(settings)
テストの実行方法
プロジェクトには多数のユニットテストが含まれており、以下のように個別に実行可能です:
mvn test -Dtest=ImageExtractionSpec
主要なパッケージ構成
extractors/:テキスト・日付・著者情報などの抽出ロジックimages/:画像選定とメタデータ解析network/:HTTP通信とレスポンス処理text/:自然言語処理用の前処理ユーティリティutils/:汎用ヘルパー関数群