brown water

ゲームやアニメの感想とかプログラムとか

Bashで画像ダウンロード

スクレイピングして画像をゲット

適当に選んだサイトから画像をダウンロードしてみたいと思います。

【最新】乃木坂46 衛藤美彩の水着グラビア画像集【みさみさ、みさ先輩】 - NAVER まとめ

水着画像ですが、たまたまこのサイトになっただけです。

ソースから画像の場所を探す

このサイトのソースを見て、画像にリンクされている箇所を探します。

どれでもいいので画像のサムネイルをクリックすると元の大きい画像が出てきて、さらにその画像をクリックするとURLが出ると思います。
色々な所からリンクされていたりするので全部がこの方法ではいかないかもしれないが。

とにかく元画像(JPGファイル)のURLを見つけたらサイトのソースでそれを検索。
複数出るけど、Aタグで囲まれている箇所を特定。
そしてAタグを囲んでいるclassを見つける。
というわけで、「mdMTMWidget01ItemCite01Value」でした。
このクラス名がある行からURLを抜き出していきます。


ソースの取得と抽出

wgetでファイルを取得していきます。
O(大文字のオー)のオプションで出力先を標準出力にすると、ソースコードが出力されます。
パイプラインで繋げてgrepを使い、ここから先ほどのクラス名の行を抽出する。

wget https://matome.naver.jp/odai/2149130246521074801 -O- | grep 'class="mdMTMWidget01ItemCite01Value"'

これで必要な行のみを抽出できました。
ここからさらに画像URLを絞り込んでいきます。
先ほどのコマンドにさらにパイプラインで繋げます。

grep -oP 'http.*.jpg'

正規表現を使ってhttpから続くjpgファイルのURLだけを抜き出しました。

ファイルをひとつずつダウンロードしていく

先ほどのコマンドを変数に入れ、その画像URLをひとつずつ配列に入れて、それを繰り返し処理していきます。
wgetのPオプションで保存先を指定。
サーバーの負担を減らすためにsleepで遅延しておきます。

#!/bin/bash

SRC=https://matome.naver.jp/odai/2149130246521074801

declare -a imgs=()

imgs=$(wget $SRC -O- | grep 'class="mdMTMWidget01ItemCite01Value"' | grep -oP 'http.*.jpg')
for file in ${imgs[@]}; do
    wget $file -P ~/Downloads/img
    sleep 1
done

これでとりあえず完成。
wgetの保存先は好きな場所に変えましょう。
=の前後はスペースを空けるとエラーになります。
上記をtest.sh等の名前で保存。

chmod +x test.sh

で実行権を付け、

./test.sh

で実行します。
これでどんどん画像がダウンロードされてきました。


Udemy売れ筋「実践 Python データサイエンス」

次のページも欲しい

サイトには複数ページがあるので、出来れば全てDLしたいのが人情です。
2ページ目へ行くと分かりますが、URLに?page=2というのが付くだけなので、URLをそれに直せばいいだけ。

しかし手動で全部やるのは面倒!
というわけで、自動でやる手がかりを。

総ページ数さえ取得出来れば後はpageを変えながら同じことをするだけ。
このサイトですが、「MdPagination03」というクラスの所に全ページが集まっているようです。
よって、

wget $SRC | grep -B 1 '/MdPagination03' | grep -v '/MdPagination03' | perl -pe 's/.*>(\d+)<\/a>.*/$1/'

で最終ページを取得することができました。
何かスマートにいかず冗長になってしまった。
SRCは先ほど入れておいたやつ。
後はこれを使って、1から最終ページまで繰り返せば良いだけです。

まぁ、目視で最終ページを入力した方が早いかも(笑)