珠玉のエロ画像

メリークリスマス!よいこのみんなにサタンさんからプレゼントのワンライナーだよ!画像収集スクレイピングがこれではかどります。なお例示のURIは某所で教えてもらった佐野ひなこが殊の外かわいかったので採用しました。

佐野ひなこ
佐野ひなこ
URI=http://himasoku.com/archives/51933805.html ; DLBASEDIR=${HOME}/EROGAZOU ; DLTMPDIR=${HOME}/tmp ; SITEDIR=$(dirname ${URI} | sed -e "s/^http[s]*:\/\///g") ; DLDIR=$(basename ${URI} | sed -e "s/\.[[:alnum:]\?\=\&]*$//") ; ARCDIR=${DLBASEDIR}/${SITEDIR}/${DLDIR} ; mkdir -p ${DLTMPDIR} ; cd ${DLTMPDIR} ; rm -f ${DLTMPDIR}/*.[jJpPgG][pPnNiI][gGfF] ; curl -s ${URI} | egrep -i '([[:space:]]*h?[rs][er][fc]=\"https?:\/\/[[:alnum:]\.\/-_]*.[jpg][pni][gf])' | sed -e "s/<img[[:space:]]*src=\"/\n/g;s/\"/\n/g" | egrep -i '([jpg][pni][gf])$' | sed -e "s/^/curl -LO /g" | sh && mkdir -p ${ARCDIR} && cp -p ${DLTMPDIR}/*.[jJpPgG][pPnNiI][gGfF] ${ARCDIR} ; ls -l ${ARCDIR}/*

これは画像取得対象のWEBサイトから、curlでaタグまたはimgタグの画像を一撃ダウンロードします。wgetがインストールされていないマシンでもすぐに試すことができますね!

Hinako Sano
佐野ひなこ

画像は最初にホームディレクトリの下の tmp ディレクトリへ保存し、ここから最終保存先にコピーしていますが、これは私のPC環境  (ホームディレクトリ以下) がSSD、最終保存先のNASがSATAのHDDだからなのでこうしてるだけです。

皆さんよい夢を!

みなさんおはようございます。ゆうべ悶々としておりましたらこんな閃きが降臨してしまいまして。

突然ですが、水原さな、かわいいですよね。そんな彼女の連番JPG画像を保存したいとするじゃないですか。で、URLの構造ですが、女優名のディレクトリの配下に1から10のディレクトリがあって、その中に「女優名-1.jpg」〜「女優名-12.jpg」のファイルがあるとしましょう。

http://www.example.com/EROGAZOU/sana_mizuhara/1/sana_mizuhara-1.jpg
http://www.example.com/EROGAZOU/sana_mizuhara/1/sana_mizuhara-2.jpg
・・・
http://www.example.com/EROGAZOU/sana_mizuhara/1/sana_mizuhara-12.jpg
・・・
http://www.example.com/EROGAZOU/sana_mizuhara/10/sana_mizuhara-1.jpg
http://www.example.com/EROGAZOU/sana_mizuhara/10/sana_mizuhara-2.jpg
・・・
http://www.example.com/EROGAZOU/sana_mizuhara/10/sana_mizuhara-12.jpg

ディレクトリ名の数字もファイル名の数字もゼロパディングされていないので、seqコマンドを使わずにfor文でまわしてwgetできそうですね。しかし、画像を取得するときにディレクトリ別に保存しないと、ファイル名が重なってしまうので「女優名-1.jpg」「女優名-1.jpg.1」などのように嫌なことになってしまいます。というわけで以下のワンライナーです。

[ (っ´∀`)っ@友の会 ~]$ for A in {1..10}; do for B in {1..12} ; do mkdir -p ${A} ; cd ${A} ; wget http://www.example.com/EROGAZOU/sana_mizuhara/${A}/sana_mizuhara-${B}.jpg; cd ../ ; done ; done

さて次に、これらの画像URL一覧をテキストファイルで入手したとしましょう。テキストのファイル名は「LIST-jpg.txt」とします。この場合、ディレクトリ名の連番だけ意識すればよいのですが、ディレクトリ名の数字だけうまく抜き出したいですよね?幸いなことに、最下層のディレクトリが連番の数字となっています。そこでbasenameとdirnameの合わせ技です。大変満足、お見事、技有り一本!!

[ (っ´∀`)っ@友の会 ~]$ for A in $(cat LIST-jpg.txt); do mkdir -p $(basename $(dirname $A)) ; cd $(basename $(dirname $A)) ; wget $A ; cd ../ ; done

ね、簡単でしょう?

みなさま

こんばんは。(っ´∀`)っ ゃーです。2010/08/28に行われました、第一回いたこ会、無事終了いたしました。

講師のゆーすけべー様、高野光弘様、そしてご参加くださった皆様、本当に有難うございます。そして、不慣れな運営でご心配をおかけいたしまして申し訳御座いません。いたこ会の準備にあたりアドバイスいただきました法林さん、りゅうちさん、あらためてお礼申し上げます。

ゆーすけべー様の「PerlでCLI(くり)アプリ!」は、いかに効率よくOPPAI画像を収集するか、そしてYahooAPIを使う上での注意点などを非常に実用的な例を使って解説していただきました。

高野光弘様の「シェルスクリプトで頭の体操」ではbrainf*ckをshに食わせて1文字ずつHello Worldを表示させる過程を解説していただきました。

その後、鹿野さん、りゅうちさん、加藤さんと(っ´∀`)っ ゃーによるLT大会が行われ、本編が終了です。

懇親会は新橋の「かがや」で不思議な雰囲気の中行われ、マスターにはぁゃιぃ宗教団体と思われていたようですがこちらも童心に帰って非常に盛り上がりました。

9月10日、11日はOSCです。こちらも張り切っていきますよー (`・ω・´)

前回のこのエントリーの続きといいますか、シリーズになっちゃってる感が否めないですがw

珠玉のエロ画像でbashのお勉強です。井上和香、唇がエロくて大好きです。そんな (っ´∀`)っ ゃー が寝ながら画像getして翌朝ムフフと楽しみたいという動機で今回はワンライナーで連番のエロ画像を取得します。

今回のターゲットはココ。

ttp://intervalues6.com/w/waka.html
ttp://intervalues6.com/w/waka2.html
ttp://intervalues6.com/w/waka3.html
ttp://intervalues6.com/w/waka4.html

これらにリンクされている画像を普通にwgetで

$ for i in `echo {1..100}`; do sudo wget http://intervalues6.com/w/waka$i.jpg; done

なんてダウンロードしようと思ったのですが、ここのサーバはちゃんとリファラ対策をしています。
なので、wgetでリファラくっつけてダウンロードするには

$ for i in `echo {1..100}`; do wget --referer=http://intervalues6.com/w/waka.html http://intervalues6.com/w/waka$i.jpg; done

こうします。waka[2-4].htmlからリンクされている画像であっても、サーバサイドでは
「どこぞのドメインからのリファラを許可するか」しか見ていないので、すべてwaka.htmlからのリファラでいけます。なお、実際にダウンロードしてみるとわかるのですが、waka92.jpg以降が404なので、idol.htmlにリダイレクトされていますので、適宜これを削除します。

$ rm -f idol.html*

================================================================================
今日のワンポイント

wgetコマンドで画像直getできなかったら、同じドメインの適当なURL(存在するファイルで)で
リファラをくっつけてやろう
================================================================================

次に、curlコマンドで同じことをやってみます。curlコマンドの -e オプションで、リファラをくっつけてやります。-O オプションがないと、ファイルとして保存できません。

$ for i in `echo {1..100}`; do curl -e http://intervalues6.com/w/waka.html -O http://intervalues6.com/w/waka$i.jpg; done

さてこれだと

$ ls
waka100.jpg  waka18.jpg  waka26.jpg  waka34.jpg  waka42.jpg  waka50.jpg  waka59.jpg  waka67.jpg  waka75.jpg  waka83.jpg  waka91.jpg  waka9.jpg
waka10.jpg   waka19.jpg  waka27.jpg  waka35.jpg  waka43.jpg  waka51.jpg  waka5.jpg   waka68.jpg  waka76.jpg  waka84.jpg  waka92.jpg
waka11.jpg   waka1.jpg   waka28.jpg  waka36.jpg  waka44.jpg  waka52.jpg  waka60.jpg  waka69.jpg  waka77.jpg  waka85.jpg  waka93.jpg
waka12.jpg   waka20.jpg  waka29.jpg  waka37.jpg  waka45.jpg  waka53.jpg  waka61.jpg  waka6.jpg   waka78.jpg  waka86.jpg  waka94.jpg
waka13.jpg   waka21.jpg  waka2.jpg   waka38.jpg  waka46.jpg  waka54.jpg  waka62.jpg  waka70.jpg  waka79.jpg  waka87.jpg  waka95.jpg
waka14.jpg   waka22.jpg  waka30.jpg  waka39.jpg  waka47.jpg  waka55.jpg  waka63.jpg  waka71.jpg  waka7.jpg   waka88.jpg  waka96.jpg
waka15.jpg   waka23.jpg  waka31.jpg  waka3.jpg   waka48.jpg  waka56.jpg  waka64.jpg  waka72.jpg  waka80.jpg  waka89.jpg  waka97.jpg
waka16.jpg   waka24.jpg  waka32.jpg  waka40.jpg  waka49.jpg  waka57.jpg  waka65.jpg  waka73.jpg  waka81.jpg  waka8.jpg   waka98.jpg
waka17.jpg   waka25.jpg  waka33.jpg  waka41.jpg  waka4.jpg   waka58.jpg  waka66.jpg  waka74.jpg  waka82.jpg  waka90.jpg  waka99.jpg

おや?実は100個jpgがあった?

$ for i in `echo {90..100}`
> do
> file waka$i.jpg
> done
waka90.jpg: JPEG image data, JFIF standard 1.01
waka91.jpg: JPEG image data, JFIF standard 1.01
waka92.jpg: HTML document text
waka93.jpg: HTML document text
waka94.jpg: HTML document text
waka95.jpg: HTML document text
waka96.jpg: HTML document text
waka97.jpg: HTML document text
waka98.jpg: HTML document text
waka99.jpg: HTML document text
waka100.jpg: HTML document text

はい、やっぱりwaka92.jpg以降は404でリダイレクトされた後のhtmlファイルを拾ってきています。それでは、92から100までのファイルを削除したいのですが、ここではfileコマンドでJPEGじゃないファイルを拾って削除することにします。

$ for i in `ls`; do for f in `file $i | grep -v "JPEG image data" | awk '{print $1}' | sed s/:$//g`; do rm -f $f; done; done

これでOKです。for文の入れ子で、削除するファイルを指定してやります。外側のfor文は、カレントディレクトリ全体をlsし、内側のfor文で、うそんこJPEG(拡張子は.jpgなんだけど中身がJPEGじゃない)なデータをとっ捕まえて、出力結果をawkとsedで整形し、削除してやります。

上記の例だと、たまたま92から100まで連続してうそんこJPEGだってわかってるからいいようなものの、連番のファイルじゃなかったり、連番のファイルであっても、飛び飛びにうそんこJPEGが混じっているようなときに楽してファイル整理をすることができます。

ね、簡単でしょ?