画像掲示板をみていたら面白そうな写真を多数発見。でもひとつひとつ保存なんてやってられない。そんなときに重宝するページ上の画像を一括ダウンロードするツールをつくってみました。

まず目的の画像が貼っているurlを入力。するとHTMLソースを解析してjpgファイルへのリンクを探して保存するというものです。

まず入力されたurlからHTMLソースを取得します。

これでHTMLソースは取得できるので、これを解析して画像をさがします。

リンクは

という形になっています。xxxxxx.jpgはサムネイルの小さな画像で目的の画像のurlはXXXXXXX.jpgの部分です。

ただ

のような形になっている場合もあります。aのあとにhrefがすぐにくるとは限りません。それ以外にもrel=”nofollow”というタグが入っていることもあります。ほしいのは<a href=”XXXXXXX.jpg”>の部分だけです。それから<a href = “XXXXXXX.jpg”>と=の前後にスペースが入っている場合もあります。

ではどうするか? まずGetHtmlTextメソッドで取得したテキストを分解してしまいましょう。

これで分解された文字列の先頭は
“~”
という形になっているはずです。そして”~”の間を抜くことができればリンク先を取得することができそうです。

ただリンク先はjpgファイルとは限りません。そこで

最初にみつかった「”」から2番目の「”」の間を抜き出し(「”」が2つ以上存在しない文字列は捨てる)、抜き出した文字列の先頭が「http」であるかどうか調べます。httpでもhttpsでも先頭の4文字はhttpです。

次に文字列の最後に着目します。「.jpg」で終わっているかどうか。

String.LastIndexOf(“.jpg”);
String.LastIndexOf(“.”);

両方を調べて値が同じなら抜き出したurlの最後は.jpgになっていると考えてよさそうです。

そこでhtmlソースからjpgファイルのurlを抜き出すメソッドとして以下のようなものを作りました。

jpgのurlがわかったらダウンロードしてファイルとして保存します。

string GetHtmlText(string url)
List<string> GetJpgUrls(string htmlText)
public bool SaveFileFromUrl(string filePath, string url)

この3つがあればサイト上の画像を一括ダウンロードできそうです。

あとはボタンを押したら処理を開始できるようにするだけです。

ファイルは連番になるようにしています。またダウンロードしようとしているファイルのurlとどこまで処理が完了したかわかるようにプログレスバーを表示させています。

それからサーバーに負荷をかけないように10個ダウンロードしたら3秒間停止するようにしています。