Rubyで画像収集を行う【2】検索結果の取得


目次

1:検索条件の入力 
2:検索結果の取得 ←いまここ
3:画像の取得と保存
つづく

前回のおさらい

【1】検索条件の入力 では、検索ワード、初めのページ数、終わりのページ数を入力した。
今回はそれらをもとに、リクエストクエリ(urlに含まれる?以降のq=XXXXとかのやつ)を
いじって検索結果を取得する

早速始めよう


def i_search(start, ender)
    i=start.to_i #開始するページ数をstringからintに変換

    while i <= ender.to_i do #終了するページ数までの間、以下をループ
        url = "https://www.bing.com/images/search?q=#{$escaped_keyword}" #検索文字列を入れたurlを作る
        url = url + "&first=" + ((i-1)*29).to_s #何番目の画像を最初に表示するかを追加 ※後述
        $doc = Nokogiri.HTML(open(url)) #作成したurlでアクセスした結果をhtmlで取得
        j=0 #画像のカウンタ
        $doc.css('div.item > a').each do |a| #HTML内のdiv内のitemのaタグに関して以下をする
            $result[j]=a[:href] #aタグのhref(画像のリンク)を取得
            puts $result[j] #画像のurlを画面に出力
            save_image($result[j]); #画像を保存する関数へ画像のリンクを渡す
            j=j+1; #画像のカウンタを増やす
        end

        p j #画像のカウンタを画面に出力
    i=i+1 #ページ数を増やす
    end

    p "i="+i.to_s #ページ数を画面に出力
end

コメント

やってることを軽く解説する。
まずurlは検索ワードと何枚目の画像を先頭に表示するかをリクエストクエリに含める。
bingが返すhtmlは、画像が28枚(たしか)含まれているので、2ページめの検索結果が
欲しい場合にはfirst=29とすることで、これが実現できるというカラクリ。

htmlはNokogiriというライブラリで解析して、その中の画像のリンクを抽出する。
bingの返すhtmlの中身を見たところ、div内のitem内のaタグに画像のオリジナルの
リンクを含んでいるので、それぞれのurlを取り出してresult[]配列に格納する。
それをsave_image()関数に投げて、保存する、という流れ。

次回はsave_image関数で画像を保存する部分を書きます。