LoginSignup
37
37

More than 5 years have passed since last update.

Camelを使ったJavaスクレイピング

Posted at

スクレイピングな記事をみて、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>
37
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
37