CloudGarageで「Heritrix」を動かす

この記事は、[CloudGarage Advent Calendar 23日目](https://adventar.org/calendars/2967)の記事です。
今回は表題の通りCloudGarageに「Heritrix」をインストールして動かしてみます。

#Heritrixって何ぞ？？
~~面倒くさい~~分かりやすくまとまっているので[国立国会図書館のページ](http://warp.da.ndl.go.jp/contents/reccommend/mechanism/mechanism_heritrix.html)を引用

> 「Heritrix」は数あるクローラの中の1つです。クローラは、「ロボット」や「ボット」と呼ばれることもあります。
> https://webarchive.jira.com/wiki/display/Heritrix/Heritrix
> クローラとはインターネット上のウェブページを巡回し、画像やPDFファイルなどを自動的に集めてくるプログラムのことをいいます。GoogleやBingなどの検索エンジンは独自に開発したクローラを使って、インターネット上の情報を収集し、それらを検索できるようにしています。
> 
> Heritrix は、インターネットアーカイブや国立国会図書館のWARPをはじめとして、大英図書館(British Library)、米国議会図書館(Library of Congress)など、世界中の国立図書館のウェブアーカイブ事業で使用されています。

と、まぁ一言でいうと「ウェブページを集めるボット」です。

で、特徴としては

> HeritrixはJava言語で開発されているオープンソースソフトウェアです。インターネットアーカイブによって開発されました。Apache License, Version 2.0 を採用していますので、ユーザはそのライセンスのもとで自由に修正、再頒布等を行うことができます。
> Heritrixにはウェブベースのインタフェースがありますの で、ブラウザを使っての設定や収集状況の確認ができます。
> また、Heritrixは収集したウェブコンテンツをウェブアーカイブの保存用ファイルフォーマットであるARC形式やWARC形式で保存します。 これらのフォーマットで保存されたコンテンツは、オープンソースソフトウェアwaybackを使って閲覧することができます。

Javaで動くWEBアプリらしいです。そして「Internet Archive (https://archive.org/) 」が開発しています。

詳しくは[国立国会図書館のページ](http://warp.da.ndl.go.jp/contents/reccommend/mechanism/mechanism_heritrix.html)を見てください。イラスト付きで結構詳しく書かれています。

# 動作要件
Javaが動く環境であれば、なんでも。
CloudGarageであればアプリケーションテンプレート**Java/Ubuntu**をそのまま使えます。

# セットアップ
公式Wikiに解説付きで手順が載ってます。
[Home ・ internetarchive/heritrix3 Wiki ・ GitHub](https://github.com/internetarchive/heritrix3/wiki)

注意点としては、CloudGarageに限らずJava8以上だとひと手間必要となります。

## インスタンスをつくる
まずはインストール先となるサーバを用意をします。

今回はCloudGarageの[ミドルウェアテンプレート](https://cloudgarage.jp/plan/)「Java/Ubuntu-16.04-64bit」を使用します。
必ず使うので8443番は開放しておいてください。（SSHを使う場合は22番も）
![alt](https://qiita-image.cloudremix.net/Heritrix-CloudGarage.jpg)
~~またUbuntu・・・。CentOSはないの...~~

##ミドルウェアのセットアップ
セットアップしていきます。
とはいっても、ダウンロードして展開、実行するだけですが

### お約束
まずはお約束のアップデート

```
apt-get update
apt-get -y upgrade
apt-get -y dist-upgrade
```

### モジュールのインストール
モジュールが不足しているため追加

```
apt-get -y install unzip
```

### 環境確認
Javaが入っていることはわかっているけど、念のため確認。
あと、パスを設定

```
root@heritrix:~# java  -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-8u131-b11-0ubuntu1.16.04.2-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)

root@heritrix:~# dirname $(readlink $(readlink $(which java)))
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin

root@heritrix:~# export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
```

## アプリケーションをセットアップ
ダウンロードして、環境変数を設定します。
※root直下にインストールしているので、パーミッションを付与

```
root@heritrix:~# wget http://builds.archive.org:8080/maven2/org/archive/heritrix/heritrix/3.1.1/heritrix-3.1.1-dist.zip

root@heritrix:~# unzip heritrix-3.1.1-dist.zip

root@heritrix:~# export HERITRIX_HOME=/root/heritrix-3.1.1

root@heritrix:~# chmod u+x $HERITRIX_HOME/bin/heritrix

root@heritrix:~# export JAVA_OPTS=-Xmx512M

root@heritrix:~# chmod 777 -R /root/heritrix-3.1.1
```

早速起動

```
root@heritrix:~# $HERITRIX_HOME/bin/heritrix -a admin:admin -b 0.0.0.0
Sun Dec 23 06:16:23 JST 2018 Heritrix starting (pid 14225)
ERROR: JVM terminated without running Heritrix.
This could be due to invalid JAVA_OPTS or JMX_PORT, etc.
See heritrix_out.log for more details.
Here are its last three lines:

        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 3 more
```

あれ？

```
root@heritrix:~/heritrix-3.1.1# less heritrix_out.log
Exception in thread "main" java.lang.NoClassDefFoundError: sun/security/tools/KeyTool
        at org.archive.crawler.Heritrix.useAdhocKeystore(Heritrix.java:438)
        at org.archive.crawler.Heritrix.instanceMain(Heritrix.java:319)
        at org.archive.crawler.Heritrix.main(Heritrix.java:189)
Caused by: java.lang.ClassNotFoundException: sun.security.tools.KeyTool
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 3 more
```

Google先生助けて
つ「[Kris's blog: Heritrix, Java 8 and sun.security.tools.Keytool](https://kris-sigur.blogspot.com/2014/10/heritrix-java-8-and-sunsecuritytoolskey.html)」

```
root@heritrix:~/heritrix-3.1.1# keytool -keystore adhoc.keystore -storepass password \
>     -keypass password -alias adhoc -genkey -keyalg RSA \
>     -dname "CN=Heritrix Ad-Hoc HTTPS Certificate" -validity 3650

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore adhoc.keystore -destkeystore adhoc.keystore -deststoretype pkcs12".
```

改めて起動

```
root@heritrix:~# $HERITRIX_HOME/bin/heritrix -a admin:admin --web-bind-hosts 0.0.0.0
Sun Dec 23 06:39:41 JST 2018 Heritrix starting (pid 15091)
Using ad-hoc HTTPS certificate with fingerprint...
SHA1:AA:CC:D3:EC:56:D8:AD:E9:59:9B:6F:65:A5:88:D1:F2:EA:87:C4:2F
Verify in browser before accepting exception.
engine listening at port 8443
operator login set per command-line
NOTE: We recommend a longer, stronger password, especially if your web
interface will be internet-accessible.
```

##動かす
ここからはブラウザに移ります。

`https://example.com:8443`にアクセス

起動時の設定した`admin``admin`でログイン
![alt](https://qiita-image.cloudremix.net/Heritrix-Authentication.jpg)

適当な名前でジョブを作成
※殺風景なのはCSSが読み込めてないからです。
![alt](https://qiita-image.cloudremix.net/Heritrix-TOP.jpg)

できたジョブをクリック
![alt](https://qiita-image.cloudremix.net/Heritrix-Create-Job.jpg)

`edit`をクリック
![alt](https://qiita-image.cloudremix.net/Heritrix-Job.jpg)

最低2箇所を変更して、左下にある`Save chanages`をクリック
![alt](https://qiita-image.cloudremix.net/Heritrix-Edit-Job.jpg)

ここと

```
metadata.operatorContactUrl=ENTER_AN_URL_WITH_YOUR_CONTACT_INFO_HERE_FOR_WEBMASTERS_AFFECTED_BY_YOUR_CRAWL
```

ここ

```
# URLS HERE
http://example.example/example
```


ジョプページに戻って`Build`をクリック
![alt](https://qiita-image.cloudremix.net/Heritrix-Build-Job.jpg)

そして`Launch`をクリック
![alt](https://qiita-image.cloudremix.net/Heritrix-Launch-Job.jpg)

収集開始～
![alt](https://qiita-image.cloudremix.net/Heritrix-Running-Job.jpg)

終わったぽい
![alt](https://qiita-image.cloudremix.net/Heritrix-Finished-Job.jpg)

集めたファイルはカレント配下の`jobs/ジョブ名/latest/warcs`にGZ圧縮され保存されている模様。

解凍するとwarcs形式になるので、適当なアプリで開く。とはいっても[IA's public Wayback Machine (moved from SourceForge) ](https://github.com/internetarchive/wayback)ぐらいしか思いつかないが....
一応、テキストファイルなので、そのままでもみれる

```
root@heritrix:~/heritrix-3.1.1/jobs/test/latest/warcs# head -n 100 test
WARC/1.0
WARC-Type: warcinfo
WARC-Date: 2018-12-22T22:11:20Z
WARC-Filename: WEB-20181222221120289-00000-15091~localhost.localdomain~8443.warc.gz
WARC-Record-ID: <urn:uuid:bc768e71-fe5e-499d-9f97-b7231d1ebb02>
Content-Type: application/warc-fields
Content-Length: 349

software: Heritrix/3.1.1 http://crawler.archive.org
format: WARC File Format 1.0
conformsTo: http://bibnum.bnf.fr/WARC/WARC_ISO_28500_version1_latestdraft.pdf
isPartOf: basic
description: Basic crawl starting with useful defaults
robots: obey
http-header-user-agent: Mozilla/5.0 (compatible; heritrix/3.1.1 +https://twitter.com/cloudremix)
```

と、まぁ殴り書きになっているので後で誤字とか表記ゆれとかは直します。
以上

#参考
[GitHub - internetarchive/heritrix3: Heritrix is the Internet Archive's open-source, extensible, web-scale, archival-quality web crawler project.](https://github.com/internetarchive/heritrix3)