CUIから実行できるリンクチェッカーの比較

* 公開しているサービスにリンク切れが無いかを定期的に調べたいと思ったので、Jenkinsでの実行を前提にCUIから実行できるリンクチェッカーを調べてみた
 * 便利な使い方がある/使い方間違ってるなどあればコメントいただけるとうれしいです
 
----
比較するのは以下の2つ

* [rawler](https://github.com/oscardelben/rawler)
 * ruby製ツール
 * gemコマンドで入れられる
 * 本記事記述時点のバージョンは 0.1.8
* [LinkChecker](http://wummel.github.io/linkchecker/)
 * python製ツール
 * pipコマンドで入れられる
  * python2.7.2以上が必要なので注意
 * 本記事記述時点のバージョンは 9.2

## まとめ

|   | rawler | LinkChecker |
|:--|:-------|:------------|
| **インストールの容易さ** | ◎ | ◎ |
| **実行速度** | △ | ○|
| **プロキシ対応** | ○ | × |

* インストールはどちらもgem/pipで一発なので非常に簡単
* プロキシあり環境を強いられている場合はLinkCheckerはここで候補から外れる
 * 私はプロキシありの環境だと動かせませんでした
 * 対応してないわけじゃなさそうなので設定をうまくできれば動くのかも
* rawlerはシングルスレッドで動くため速度に難あり
 * ただ構成がシンプルなので自分好みに弄るのは楽そう
 * ログもシンプルなのでパースや加工はLinkCheckerよりも楽
* 個人的には速度がほしいのでLinkCheckerが使いたい

## 詳細

### rawler
##### インストール

> &#035; gem install rawler

* 詳しくは [こちら](https://github.com/wummel/linkchecker/blob/master/doc/install.txt)

##### 使い方
```
Usage:
      rawler http://example.com [options]
```
* 詳細は rawler --help
 * -wオプションでリクエスト毎の間隔を設定できるので、この数字を小さく(0とかに)しとかないととても遅い
 * -cオプションでcssのリンクも調べられるのでやっとくといいと思う

##### 実行結果
例

```
$ rawler -w 0 https://hogehoge.com/
I, [2014-06-12T17:50:17.368385 #52688]  INFO -- : 200 - https://hogehoge.com/hoge
I, [2014-06-12T17:50:18.474254 #52688]  INFO -- : 200 - https://hogehoge.com/fuge
W, [2014-06-12T17:50:21.110804 #52688]  WARN -- : 301 - https://hogehoge.com/hagehage - Called from: https://hogehoge.com/hage - Following redirection to: http://hogehoge.com/hagehage/
...<省略>
```

##### 注意点
* 30x系のレスポンスでもリダイレクトなどはしない、ログに30xであることが残るだけ


### LinkChecker#
##### インストール

> &#035; pip install LinkChecker

* python2.7.2以上が必要なのでご注意ください
 * CentOSだと最初から入っているのは2.6系なので別途入れる必要があります

##### 使い方
* 詳細は同じく linkchecker --help
 * -t NUMBER オプションでスレッド数を変更可能
 * リソースに余裕がある場合はスレッドを増やして高速化すると良いと思う
```
usage: linkchecker [-h] [-f FILENAME] [-t NUMBER] [-V] [--list-plugins]
                   [--stdin] [-D STRING] [-F TYPE[/ENCODING[/FILENAME]]]
                   [--no-status] [--no-warnings] [-o TYPE[/ENCODING]] [-q]
                   [-v] [--cookiefile FILENAME] [--check-extern]
                   [--ignore-url REGEX] [--no-follow-url REGEX] [-N STRING]
                   [-p] [-r NUMBER] [--timeout NUMBER] [-u STRING]
                   [--user-agent STRING]
                   [url [url ...]]
```

##### 実行結果
例

```
$ linkchecker http://hogehoge.com/
LinkChecker 9.2              Copyright (C) 2000-2014 Bastian Kleineidam
LinkChecker comes with ABSOLUTELY NO WARRANTY!
This is free software, and you are welcome to redistribute it
under certain conditions. Look at the file `LICENSE' within this
distribution.
Get the newest version at http://wummel.github.io/linkchecker/
Write comments and bugs to https://github.com/wummel/linkchecker/issues
Support this project at http://wummel.github.io/linkchecker/donations.html

Start checking at 2014-06-17 06:33:07+000
10 threads active,    96 links queued,  120 links in   3 URLs checked, runtime 1 seconds
10 threads active,   262 links queued,  516 links in  16 URLs checked, runtime 6 seconds

URL        `../../img/hoge.png'
Parent URL http://hogehoge.com/common/css/index.css, line 309, col 17
Real URL   http://hogehoge.com/img/hoge.png
Check time 4.211 seconds
Size       1KB
Result     Error: 404 Not Found

...<省略>

Statistics:
Downloaded: 1.52MB.
Content types: 641 image, 5903 text, 0 video, 0 audio, 0 application, 1 mail and 2012 other.
URL lengths: min=21, max=156, avg=47.

That's it. 8557 links in 356 URLs checked. 0 warnings found. 4 errors found.
Stopped checking at 2014-06-17 06:35:43+000 (2 minutes, 36 seconds)
```

##### 注意点
* 環境変数にhttp_proxy,https_proxyなど定義してもプロキシが超えられなかった
 * 正しくは、プロキシを使用した場合に名前解決ができなかった
 * 何か設定が間違ってたのかも？
```
Info       Using proxy `http://localhost:8080'.
Result     Error: ConnectionError: HTTPSConnectionPool(host='hogehoge.com', port=443): Max retries exceeded with url: / (Caused by <class 'socket.gaierror'>: [Errno -5] No address associated with hostname)
```

* 自己証明書でのSSL接続は不可らしい
```
Result     Error: SSLError: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
```