画像を「ぶっこ抜く」ための
「画像ぶっこ抜き.in」なんだけど、何かmixiで公開されていた開発日記ぽいのを超斜め読みしたら、「ページの本文を探して、そこの中の画像を抽出するにはどうしたら良いか」「それ難しいよね」とかいう会話がなされていたんだが、そんなことをする必要はないんじゃないか?と思う。
「本文の部分を抽出する」というのは、ここでは省略するが、たしかに重要なテーマだ。が、「画像」に関しては別に不要だ。なぜなら、「欲しい画像を抽出する」というテーマでは
- 2ちゃんねる画像スレまとめブログの記事ページ
- リアディゾンギャラリー
が並列だから。そして後者にはそもそも「本文」というもの自体が存在しないから(少なくとも、後者にも対応させようとすると、本文抽出のロジックが無駄に抽象化/複雑化するはず)。
「本文とそれ以外を区別する」という方法論は、それ自体が例えば「ブログ」とか「ニュースサイト」とかいう、ウェブにおけるある集合にとって重要なものであるのであって、それは唯一の切り方ではない。
で、ここから書くことは、なんて言うか、「何でローカルツールも含めて皆やらないんだろう」と思っていたんだけど、しかし実際に試していないので、ひょっとしたら俺の脳内でしか成立しない(実際に作ったところでマトモに狙い通りの動作をしない)かもしれない、という話なんだけど……。
まず、ブラックリストは使おう。ブラックリストだと、例えばそれこそこのページ左上のtokix.netロゴ画像とかを消せない訳だけど、少なくとも広告系はある程度消せる。バナー広告CGI、つまり「?」付きのアドレスとか、「banner」が含まれるアドレスとか、その手のブラックリスト(Adblockのデフォフィルタは普通に何からでも取得できるからそれを併せても良い)を使ってある程度の除外を行い、その上で、と。
その上で、「画像をアドレスをベースにしてグルーピングする」ということを行う。そして、もっとも多くの画像が含まれる「グループ」を「欲しい画像」と見なす。「グルーピング」というのは、単純に言えば、「連番アドレス」というものなんだけど。
ttp://www.tokix.net/img/nurse_white_001.jpg
ttp://www.tokix.net/img/nurse_white_002.jpg
(略)
ttp://www.tokix.net/img/nurse_white_999.jpg
これらは、ほぼ同じだ。
で、それと同じページ内にある無駄な画像は、例えば
ttp://adv.com/adbanner.jpg
だったり
ttp://www.tokix.net/img/sitebunner.png
だったりする訳だ。
それこそ「2ちゃんねる画像スレまとめ」とか「リアディゾンギャラリー」とかが流行り始めた頃くらいから、この手のツールが出てこないかなぁ、と思っていたりする。……正直ウェブサービスよりツールの方が良い気はしなくもない話なんだけど、まぁ、ちょうどこのテーマを振るのに適したサービスが出たので、「そろそろアウトプットして聞いてみるか」ということで……。
□1:ディレクトリベースの抽出
画像を「それが含まれるディレクトリ」によって分類し、もっとも多くの画像が含まれるディレクトリを探して、そのディレクトリの画像のみを表示する。
少なくとも
ttp://adv.com/adbanner.jpg
は消せる。
□2:数字部分によるグルーピング
と、いうことで、同じディレクトリ内の不要画像を消す方法論が必要になるんだけど、まず出てくるのは、「連番って数字だよね」という話だろう。
ttp://www.tokix.net/img/nurse_white_(数字).jpg
というようなグルーピングを行い、最も多くの画像が含まれるグループを抽出すれば良い訳だ。
うろ覚えなので「実際試してみたら全然違った」となったら申し訳ないが、「Firefoxで共有動画&画像を落とす「Video DownloadHelper」 :教えて君.net」は上記のような方法を使っているはず(アドオン名に反して動画周りより画像周りの処理の方が面白い)。
ただ、問題なのは、「連番」のように動作する部分が数字とは限らないこと。
ttp://www.tokix.net/img/nurse_white_a.jpg
ttp://www.tokix.net/img/nurse_white_b.jpg
ttp://www.tokix.net/img/nurse_white_c.jpg
これだけでも対応できなくなってしまう。「グルーピング」というものを、もう少し柔軟に行う必要があるはずだ。
そして、何より、その「グルーピング」を、ある程度階層的に行う(AとBは完全に同じグループ、CとDは別のグループ、でも少し上の階層からみるとA〜Dが全て同じグループ、というような階層化)必要があるはずなんだ。上記「Video DownloadHelper」には「階層」という概念がなくて、故に「ベスト」という形で抽出が行われなかったページでは、即全ての画像を落とさなくてはならない。「間」がないんだ。
□3:URLの一致度によって階層構造を構築する
モデルとして言うと、「画像アドレスの一致」によってグルーピングを行い、それをツリー的な階層構造で捉える。「階層」といってもディレクトリベースではない。あくまで「アドレス」という文字列に関する階層化だ。
もう少し具体的に書くと、画像間のアドレスの一致度を調べていくわけだ。このケースでは、画像間のアドレスの「最大一致」が
ttp://www.tokix.net/img/nurse_white_00?.jpg
で、これに対して
ttp://www.tokix.net/img/nurse_white_0??.jpg
な画像も存在し
ttp://www.tokix.net/img/nurse_white_???.jpg
な画像も存在し、しかし
ttp://www.tokix.net/img/nurse_white????.jpg
な画像は存在しない(という日本語は変だけど、つまり「ttp://www.tokix.net/img/nurse_white_???.jpg」による抽出結果数と変わらない)訳だ。と、いう、ここまでを「一番下の階層において同じグループ」として抽出する。
……別に
ttp://www.tokix.net/img/nurse_white_99?.jpg
から始めて
ttp://www.tokix.net/img/nurse_white_???.jpg
に至っても良い訳で(つまりプログラム的には「ソース中に先に出てきた方で処理を進める」とか適当にすれば良い)。
これだと、例えば同じページに
ttp://www.tokix.net/img/nurse_red_???.jpg
があると問題なんだけど、少なくとも上記を「最有力候補」として「提示」し、「そうではなくて」という形の第二候補として「ttp://www.tokix.net/img/nurse_」による抽出を「提示」し、最後に「全部落とす」という選択肢も用意すれば良いと思うんだ。つまり、「階層化」を行っていれば、そのような提示が可能だ、と。
ttp://www.tokix.net/banner/ban01.jpg
ttp://www.tokix.net/banner/ban02.jpg
みたいな連番バナーがあると「繋がる」画像が複数パターン存在する訳だけど、それは単純に総数を比較して多い方を採用すれば良い。ツリーの各分岐(全てのアドレスは、言ってしまえば「ttp://」という一致部分を持っている訳で)において多数決を行い、多い方→多い方……を「本流」と見なせば良いだろう(「ツリー」をユーザーに見せると、多分使い勝手が悪くなるだけな気がする)。
連番バナーが100もあったらアウトだが、そんなことは現実的に、まぁあり得ないだろう。もしくは「繋がる」欲しい画像が少ないケースだが、そうしたページではそもそもこのツールなりサービスなりを使う必要自体がないはず(「普通に一つずつ落とせよ」という)。
例えば実際の表示で言えば、
- 「ttp://www.tokix.net/img/nurse_red_」な30ファイルを抽出中
- 「ttp://www.tokix.net/img/nurse_」な40ファイルを抽出する
- 「ttp://www.tokix.net/img/」な60ファイルを抽出する
- 全ての80ファイルを抽出する(これが「画像ぶっこ抜き.in」やIrvineリンク抽出の拡張子フィルタと同じ)
みたいな。
何で「最大一致」かというと、そもそもフルサイズ画像自体のアドレスがランダムなケースがあるから。
ttp://www.tokix.net/img/ar7g3fsa.jpg
ttp://www.tokix.net/img/kko64xka.jpg
ttp://www.tokix.net/img/aw3bghr.jpg
最大一致は「ttp://www.tokix.net/img/a」で、しかし「ttp://www.tokix.net/img/」までが一致する画像もある、訳だ。
ソース解釈よりは、こんな感じに画像アドレスベースで抽出を行うべきなんじゃないかと思うんだ。
ブラックリストを使ってある程度の除外を行い、その上で上記のような処理を行えば、大体のケースで上手く動くと思うんだ。Irvineのリンク抽出とかって、まだこの手のやり方で進化させられると思うんだ。
と、いうような案なんだけどどうなんでしょうか?(この手のノウハウがある方の見解を素で知りたい)

Comment