golangでシンプルクローラ gocrawsanを作ってみました。ということでツールの紹介です。
機能
- 設定ファイルベースでURLを指定して、対象URLに対するステータスコードを標準出力に出力
- ステータスコードを標準出力に表示する以外に、CSSセレクタを使って属性、テキスト値の抽出
- クローラーらしくリンクを辿って再帰的にURLにアクセスする
- gocrawsanっていう名前だけどコマンド名はgocという矛盾(短くしたかったけどご苦労さんって言いたかっただけ)
インストール
$ curl -sL http://install.freedom-man.com/goc.sh | bash
でOK。zsh補完関数もインストールしたい場合はオプションを付けてください
$ curl -sL http://install.freedom-man.com/goc.sh | bash -s -- --zsh-completion
使い方
以下のようなconfigファイルをtomlで書いてクローリング対象のURLを指定します。urls = [
"http://example.com",
"http://freedom-man.com/blog",
]
設定ファイルを書いたら、以下のコマンドでURLに対して
$ goc --config {CONFIG FILE PATH}
–configを指定しない場合は~/.config/gocrawsan/config.toml
をデフォルトで読み込みます。
対象URLのリンクを辿りたい場合は、depthオプションを使って辿る回数を指定できます。デフォルトは1で対象URLしかクローリングしない仕様になっています。
gocrawsanの基本の動作は各URLのステータスコードを出力します。
CSSセレクタを使って要素の属性値やテキストを抜き出したい場合は、以下のようなオプションを付けて実行すればOKです。
$ goc --selector a --extract-type attr --attribute href
extract-typeオプションにはattrかtextを指定します。attrの場合は属性値を抜き出し、attributeオプションで属性を指定します。textを指定するとタグ内のテキスト値を抜き出します。
タイムアウト値(秒)を–timeoutオプションで指定できたり、UserAgentを–useragentオプションで偽装できたりします。
技術的な話
golangっぽくgoroutine使って並列にリクエストを出してます(基本的な使い方をしているので割愛)また、zsh補完関数のインストールもオプションに入れてみました。こんな感じ↓
...
COMP_PREFIX="/usr/local/share/zsh/site-functions"
...
function parse_options() {
for OPT in "$@"
do
case "$OPT" in
"--zsh-completion" )
ZSH_COMPLETION="t"
;;
-* )
echo "$PROGRAM: illegal option -- '$(echo $1 | sed 's/^-*//')'" 1>&2
exit 1
;;
esac
shift
done
}
...
parse_options $@
...
if [ -d ${COMP_PREFIX} ]; then
if [ "${ZSH_COMPLETION}" == "t" ]; then
mv ${OS}-${ARCH}/_${BIN_NAME} ${COMP_PREFIX}/_${BIN_NAME}
fi
fi
macOSとUbuntuでzshを入れた環境では/usr/local/share/zsh/site-functionsがあったので決め打ちでmvしてます
クローラって呼んで良いのかわかりませんが、URLに対する死活監視としてはシンプルに実行できるので、よろしければお使いください〜