それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

はじめてのおっぱいダウンロード。プログラミング男子応援イベント。

男子高校生いや中学生か。円グラフをパイチャート呼んだり、円周率πが2πで360度で、2πが一個で妙に納得したり。1/6 πとか美乳ですよね。とか。積分のデルタが密林でΔだとか。数学とか楽しめます。

そんな男子高校生に送る「おっぱい」

見たくてたまらない君たちに、とりあえず、飽きるまで見ることをおすすめする。飽きたら、現実を見ような。いろいろな意味で。

ゆーすけさんのをRubyで描いてみた。

Perlなんてアレだよね。PyPiPythonが一番向いている気がするけど、Pypiネタはすでにある。じゃぁRubyでエロくダウンロードしてみるか。

rubyでゆるく、エロくダウンロード

rubyにはMechanizeという、最凶ツールと、Nokogirlという無敵ツールがあってWEBからぶっこ抜きに、至高ツールなのです。

おっぱいをダウンロードする方法。

  1. rubyをインストールする。
  2. ツールをインストール
  3. スクリプトを動かす。
  4. ワクワクしながら待つ。

rubyのインストールは簡単。

Macなら初めから入ってるよ。Macを買ったきみはついてる。
Windowsな君は。http://www.ruby-lang.org/en/downloads/ からダウンロードしてインストール。


rubyが実行できるようになると、いよいよ、プログラミングで魔法の時間だ。

ツールを入れる

rubyで使う、Rubyで書かれた、Rubyのためのツールをインストール。

gem install mechanize

スクリプトを動かす

ruby oppi.rb

oppi.rb

プログラミングの本体。

##リクエストを投げる。
require "rubygems"
require "json"
require 'mechanize'
$app_id = "35A40D6D57F***********"
$start  = "http://api.bing.net/json.aspx"
$offset = 0;
$params ={ 
        'Appid'     => $app_id,
        'Version'   =>'2.2',
        'Markert'   =>'ja-JP',
        'Sources'   =>'Image',
        'Image.Count'=> 50,
        'Image.Offset'=> $offset,
        'Adult' => 'off',
        'Query'=> 'おっぱい'
}
$mech = Mechanize.new
$mech.get $start, $params
$ret = JSON.load($mech.page.body)
$ret["SearchResponse"]["Image"]["Results"].each{|e|
  $mech.get e["MediaUrl"]
  $mage.page.save
}

これでおっぱいがいっぱい。

うむ。それでは一気にダウンロード。

なんか楽しいけど、萌えない。

ファイル名がエロくないんだ。ファイル名を、検索結果からつけてみた。


(スクリーンショット 2012-03-05 21.50.16)


ダウンロードを複数起動するとあれなのでスレッドする。

一本ずつダウンロードを待ってられないのが男子中学生。

複数スレッドでのダウンロードのプログラムを参考に書いておきます。
*1

require "rubygems"
require "json"
require 'mechanize'
require 'thread'

$image_url_list = Queue.new
$app_id = "35A40D6D57FEB804B1E1AAD*****************E2B"
$start  = "http://api.bing.net/json.aspx"
$mech = Mechanize.new
$offset = 0;
$params ={ 
        'Appid'     => $app_id,
        'Version'   =>'2.2',
        'Markert'   =>'ja-JP',
        'Sources'   =>'Image',
        'Image.Count'=> 50,
        'Image.Offset'=> $offset,
        'Adult' => 'off',
        'Query'=> 'おっぱい'
}

def oppi_search(n=1000)
  Thread.new{
    $mech.get($start, $params)
    #1000ページまで行こうか。
    n.times{|i|
        #1ページからNページまでの遷移
        $offset = i * $params["Image.Count"]
        $params["Image.Offset"] = $offset
        $mech.get $start, $params
        #
        ret = JSON.load($mech.page.body)
        pp ret["SearchResponse"]["Image"]["Results"].size
        ret["SearchResponse"]["Image"]["Results"].each{|e|
            #ダウンロードリストに追加する。
            $image_url_list.push( { "img_title" => e["Title"], "img_url" => e["MediaUrl"]})
        }
    }
  }
end
#ダウンロードするだけの娘
def download_thread
    t = Thread.new{
        m = Mechanize.new
        m.max_history = 1
        loop {
            begin 
              task = $image_url_list.pop 
              file = m.get task["img_url"]
              #拡張子判別
              ext_name = file["content-type"].split(%r"/").last
              file.save( task["img_title"]+".#{ext_name}"  )
            rescue => e
              puts e
              m = Mechanize.new #エラーがでたらMechanize再起動
            end
        }
    }
    return t
end

##Bing検索スレッド
t = oppi_search()
workers = []
##画像のダウンロードは5スレッドで。
workers << download_thread()
workers << download_thread()
workers << download_thread()
workers << download_thread()
workers << download_thread()

#無限ループ
workers.first.join

*2

励めよ。うむ

他の蒐集も、基本は同じです。検索先がBing→ニコニコになったり、取得対象がJPG→FLVになるだけです。がんばってね。

AmazonでエロDVDが1円

1円で買える時代なのに、エロ画像ってのもの無いと思うんだ。DVDを簡単にMP4にする方法がいいかな?

↓ほらね


rubyを動かしたい人は

初めてのプログラミング をかいなさい。

2012/03/08追記;さらなる高速化へ

更に我慢出来ない人に高速化のヒントを書いておきます。

  • HTTPのKeepAliveが働くように書きなおす
  • DNSルックアップを一括で処理する。

HTTP1.1はKeepAliveで一回の接続で複数回ダウンロードできます。TCP/IPのコネクションのオーバーヘッドがもったいないのでIPアドレス毎に接続を切り分けて、一回のコネクションで複数回ダウンロードすれば高速化できます。取得相手が同じサーバーならそのほうが速い。(特にHTML/JPEGの場合は効果的、FLVのような大きいファイルだとファイルのダウンロード時間のほうが長いのであまり変わらないと思う)

*1:Rubyのスレッドとかプリエンプションが・・・ノンプリとかいうけど、ネットワークIO待ちだと別スレッドに切り替わるしそれなりに効果ある。

*2:15分程度で適当に書いたので、マルチスレッドちゃんと動いてるかなぁ。。まぁいいけど。