curl+pup+Dockerを使ってシェルスクリプトでスクレイピング

はじめに

コマンドラインあるいはシェルスクリプトでスクレイピングするときに pup というツールを使っていましたが、1から環境構築する場合を考え Docker を利用する方法を整理してみました。

検証環境

1
2
3
4
5
$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.0.11(1)-release (x86_64-apple-darwin18.6.0)

前提

以下のツールがインストールされていること

早速試してみる

ちょうど良さそうなサイトを探したところ、以下のサイトを見つけました。 表示されているイメージを収集してみます。

まずはページのHTMLを取得してみます。

1
$ curl -s https://itstudio.co/sample/flex-gallery/index.html

これを pup ツールに食わせてパースしたいのですが、今回はローカルPCに pup をインストールせず、 pup インストール済みの Docker イメージを利用してみます。 ( ※初回はDockerイメージを取得するため遅いです。 )

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ curl -s https://itstudio.co/sample/flex-gallery/index.html \
  | docker run -i --rm sheogorath/pup-docker ".gallery-img img attr{src}"
images/gallery_1.jpg
images/gallery_2.jpg
images/gallery_3.jpg
images/gallery_4.jpg
images/gallery_5.jpg
images/gallery_6.jpg
images/gallery_7.jpg
images/gallery_8.jpg
images/gallery_9.jpg
images/gallery_10.jpg

もし pup がインストールされている場合は、以下のコマンドと同義です。

1
2
$ curl -s https://itstudio.co/sample/flex-gallery/index.html \
  | pup ".gallery-img img attr{src}"

pup は引数で抽出するDOM要素を指定できます。 今回はHTML内の以下の要素を取り出そうとしています。

attr{src} で要素の src 属性が抽出できます。

最後に相対パスを絶対パスに変換します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ curl -s https://itstudio.co/sample/flex-gallery/index.html \
  | docker run -i --rm sheogorath/pup-docker ".gallery-img img attr{src}" \
  | sed 's@^@https://itstudio.co/sample/flex-gallery/@'
https://itstudio.co/sample/flex-gallery/images/gallery_1.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_2.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_3.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_4.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_5.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_6.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_7.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_8.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_9.jpg
https://itstudio.co/sample/flex-gallery/images/gallery_10.jpg

ひとこと

~/.bashrc に以下の設定を加えれば、 pup がローカルPCにインストールされているかのように使うことができます。

1
alias pup='docker run -i --rm sheogorath/pup-docker'