スクレイピングな記事をみて、camelでもパラっとできそうだったので書いてみた。
書いてみたら色々前処理が必要だったけど、主要な部分はここ。
from("direct:start")
.to("http://dummy") // HTTPアクセス(HTTP_URI先にアクセスしている)
.unmarshal().tidyMarkup() // HTML-> XMLに変換
.setHeader("title_data").xpath("//title/text()");// XMLからtitleを取り出して保存
ここだけで、httpアクセスしてtitleのテキスト部分を取り出す処理が完了。
Webスクレイピング
http(s)アクセスして、情報を取得。必要なデータを読み込むという処理だそうだ。
camelとは?
色々なものにつながるライブラリ。
ルートと呼ばれる処理のストーリーっぽいのも書ける。RouteBuilderって所がそれ。
たくさんのコンポーネントがあって、コンポーネントを使って接続する。
今回使ったコンポーネントはhttpとtagsoup。
サンプルの内容
- 起動時に1回限り取ってくる
- https://www.google.co.jp にアクセス
- タイトルの内容を取って"title_data"に保存
- 保存されたtitle_dataを標準出力
- httpコンポーネントは動的にURLを変更してアクセスしている
Hello
package test.scraping;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.main.Main;
public class Hello {
public static void main(String[] args) throws Exception {
// camelの設定と起動
Main camel = new Main();
camel.addRouteBuilder(getTitleRoute);
camel.start();
// camelのルートに送るデータを作成
Exchange exchange = new DefaultExchange(new DefaultCamelContext());
exchange.getIn().setHeader(Exchange.HTTP_URI, "https://www.google.co.jp");
// camelのルートにデータを送る
camel.getCamelTemplate().send("direct:start", exchange);
// 結果を取得・表示
String title = exchange.getIn().getHeader("title_data", String.class);
System.out.println(title);
}
/** HTTP(s)アクセスしてタイトルを取ってくるシナリオ */
public static RouteBuilder getTitleRoute = new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.to("http://dummy")
.unmarshal().tidyMarkup() // HTML-> XMLに変換
.setHeader("title_data").xpath("//title/text()"); // XMLからtitleを取り出して保存
}
};
}
できたpomもついでに載っけておきます
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>test.scraping</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<camel-ver>2.12.2</camel-ver>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel-ver}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http</artifactId>
<version>${camel-ver}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-tagsoup</artifactId>
<version>${camel-ver}</version>
</dependency>
</dependencies>
</project>