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

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

ただいまの
回答率

90.33%

  • Ruby

    8206questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Rubyでweb上の画像を保存したいのですができません

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,385
退会済みユーザー

退会済みユーザー

web上の画像を保存するために次のプログラムを書きました
require "open-uri"

def save_image(url)
  # ready filepath
  fileName = File.basename(url)
  dirName = "./img/"
  filePath = dirName + fileName

  # write image data
  open(filePath, 'wb') do |output|
    open(url) do |data|
      output.write(data.read)
    end
  end
end

url = "http://dcimg.awalker.jp/img2.php?sec_key=y6CO4PhcIzJAn7zLeUgMyK7iVVkSDq6Qzl1GWrIX5Lwmccd3UfejNMyXQxcRqJtbJhYfWHrdKjyA6TcBV4viAlKdxFNAe3VAogmse0L4MdpTgARlSmyoHIB8MAJQkmttNpFMQwUgCBSh3hEgsFvUuDLRNMujZ2hTdwAtOSnr3WavqiTO9Ii6LgxV6MnGtZtw4UwbjTZ9"
save_image(url)
しかしこれを実行しても下記のエラーがでます
/Users/a/.rbenv/versions/2.2.1/lib/ruby/2.2.0/open-uri.rb:36:in `initialize': No such file or directory @ rb_sysopen - ./img/img2.php?sec_key=y6CO4PhcIzJAn7zLeUgMyK7iVVkSDq6Qzl1GWrIX5Lwmccd3UfejNMyXQxcRqJtbJhYfWHrdKjyA6TcBV4viAlKdxFNAe3VAogmse0L4MdpTgARlSmyoHIB8MAJQkmttNpFMQwUgCBSh3hEgsFvUuDLRNMujZ2hTdwAtOSnr3WavqiTO9Ii6LgxV6MnGtZtw4UwbjTZ9 (Errno::ENOENT)
原因はおそらくこの特殊なURLにあると思うのですが自分では解決できませんでした
また、URLはブラウザからは見れます
他のURL(たとえば"http://upload.wikimedia.org/wikipedia/commons/5/58/Shiba_inu_taiki.jpg")にすると画像を保存できます

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • gouf

    2015/05/22 21:00

    URL 中のsec_key... secret key と思しきKey 値ですが、公開しても問題ないものなのでしょうか

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2015/05/22 21:02

    http://blog.nogizaka46.com/miona.hori/2015/05/023883.php
    このブログにある画像なので問題無いと思います

    キャンセル

回答 2

checkベストアンサー

+1

今回の例では、

* id 値を渡しつつページにアクセス
* sec_key を渡して画像のリクエスト(保存)

を行わなければならないようですね

(いちど、Web ブラウザで、目的達成までの手順を再現してみると良いと思います)

require 'bundler'
require 'pp'
Bundler.require

m = Mechanize.new

url = 'http://dcimg.awalker.jp/img1.php?id=T1wtqGZzbfPSkcuKyhdPRsBIEZktJKxJeaFdneuFC28KsaPh6rxGofeMdGihkGdMIme34lBg0rq3fK6TXOdeodlMnlfF1OmY9g5roD1AtQmnG8OKeuUlR9SOcL4cuAqKsLeUHi4nsYVlQB0vbTkgM8KbZ3PzPrYQdi6N9qhFZFrEIqbe10llDz4UuGwXTZ33eNXtUf01'

page = m.get(url)

# 複数ヒットする検索条件の場合
#
# path = File.expand_path('~/imgload')
# pp page.image_with(src: /img2\.php/).each do |img|
#   img.fetch.save_to path
# end

pp page.image_with(src: /img2\.php/).fetch.save_as('img.jpg')

Gemfile:
source 'https://rubygems.org'

gem 'mechanize'

Mechanize を利用すると、比較的簡単にWeb ページの情報を収集することができます
この、「画像にアクセスするためのURL」の収集も、同様に実現できるかもしれませんね

何か参考になれば幸いです

## Links

Web開発でよく使う、特に使えるChromeデベロッパー・ツールの機能 - Build Insider
mechanize-2.7.0 Documentation
Bundler: The best way to manage a Ruby application's gems
qiita mechanize - Google Search
Ruby - Yasuriでお手軽スクレイピング - Qiita

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/23 14:14

    リンクまで貼っていただきありがとうございます
    なるほど、idとsec_keyを渡せねばならなかったのですね
    無事解決しました、ありがとうございました

    キャンセル

0

No such file or directory @ rb_sysopen 

カレントディレクトリに、img というディレクトリが無いというエラーです。ありますか?

追記:
すいません。
他のURL(たとえば"http://upload.wikimedia.org/wikipedia/commons/5/58/Shiba_inu_taiki.jpg")にすると画像を保存できます 
だとすると、imgはありますね。

手元の環境では、
Linux: 
  問題なし。ただし、そのURLは404 Not Foundで、open(url)のところでエラー
Windows: 
 下記のエラー。
(中略)/open-uri.rb:36:in `initialize': Invalid argument @ rb_sysopen - ./img/img2.php (中略) (Errno::EINVAL)

と、そのエラーは出ません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/05/23 14:21

    すみません、私の記述の「他のURLにすると保存できます」というのはimgディレクトリがある状態でのことでした
    その後一度imgディレクトリを消したのを忘れて、元のURLでプログラムを実行していました
    そのため、otnさんの回答は正しかったです
    imgを作ったあとは、今回ベストアンサーに選ばせていただいた方のプログラムを実行することにより、うまく画像を取得することができました
    回答ありがとうございました

    キャンセル

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

  • Ruby

    8206questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。