質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.58%

Ruby 教師あり学習用データ画像スクレイピング

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 544

score 10

前提・実現したいこと

Ruby初学者です。
RubyでMicroSoft社の検索エンジンBingのAPIを使用し「dog」のワードで検索時の画像データをクロールしてきて、PCへ保存したいと考えています。
以下のコードを実行すると、エラーが表示されました。

該当のコード

require "open-uri"
require "FileUtils"
require 'net/http'
require 'json'

# 保存先ディレクトリ
@dirName = "./dog_image/"
# 保存用ディレクトリを作る(ディレクトリがない場合は新たにディレクトリを作成)
FileUtils.mkdir_p(@dirName) unless FileTest.exist?(@dirName)

# 画像URLから指定フォルダに画像を保存する関数
def save_image(url, num)
  filePath = "#{@dirName}/dog#{num.to_s}.jpg"
  open(filePath, 'wb') do |output|
    open(url) do |data|
      output.write(data.read)
    end
  end
end

# 検索ワード
search_word = 'dog'
# 保存する枚数(APIの仕様上一気に150枚が限界)
count = 10

# Bing Search API(公式のコードをそのまま使用)
# https://dev.cognitive.microsoft.com/docs/services/56b43f0ccf5ff8098cef3808/operations/571fab09dbe2d933e891028f
uri = URI('https://api.cognitive.microsoft.com/bing/v7.0/images/search')
uri.query = URI.encode_www_form({
    'q' => search_word,
    'count' => count
    # 'offset' => 150(指定した数だけ検索結果をスキップ)
})
request = Net::HTTP::Post.new(uri.request_uri)
request['Content-Type'] = 'multipart/form-data'
request['Ocp-Apim-Subscription-Key'] = "自分のAPIキー" # Fix Me
request.body = "{body}"
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
  http.request(request)
end

# searchwordの検索画像をcountの枚数だけ保存する
count.times do |i|
  begin
    image_url = JSON.parse(response.body)["value"][i]["thumbnailUrl"]
    save_image(image_url, i)
  rescue => e
    puts "image#{i} is error!"
    puts e
  end
end

発生している問題・エラーメッセージ

image0 is error!
undefined method `[]' for nil:NilClass
image1 is error!
undefined method `[]' for nil:NilClass
image2 is error!
undefined method `[]' for nil:NilClass
image3 is error!
undefined method `[]' for nil:NilClass
image4 is error!
undefined method `[]' for nil:NilClass
image5 is error!
undefined method `[]' for nil:NilClass
image6 is error!
undefined method `[]' for nil:NilClass
image7 is error!
undefined method `[]' for nil:NilClass
image8 is error!
undefined method `[]' for nil:NilClass
image9 is error!
undefined method `[]' for nil:NilClass
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る