2015-02-14 3 views
0

Я пытаюсь сделать рубиновую программу, которая автоматически загрузит последнюю Penny-Arcade. Вот код, у меня есть:Ошибка при попытке изображения scrape

require 'mechanize' 

agent = Mechanize.new 
date_string = Date.today.to_s 

page = agent.get('http://www.penny-arcade.com/comic/') 
puts page 

art_link = page.at('div#comicFrame > a > img')['src'] 

    File.open(date_string, 'wb') do |fo| 
    fo.write open(art_link).read 
    end 

И выход я получаю от запуска программы является:

$ ruby grab_PA.rb 
#<Mechanize::Page:0x007f38bc743af0> 
grab_PA.rb:12:in `initialize': No such file or directory @ rb_sysopen - http://art.penny-arcade.com/photos/i-QpzhbpN/0/1050x10000/i-QpzhbpN-1050x10000.jpg (Errno::ENOENT) 
     from grab_PA.rb:12:in `open' 
     from grab_PA.rb:12:in `block in <main>' 
     from grab_PA.rb:11:in `open' 
     from grab_PA.rb:11:in `<main>' 

Но если я копирую эту точную ссылку и поместить его в Firefox, он открывает изображение. Что тут происходит? Программа записывает файл изображения в каталог программы с сегодняшней датой, но файл пуст.

ответ

0

open принимает аргумент, который является именем файла, а не URL-адресом. Если вы хотите получить доступ к URL-адресу, вам обычно нужно сделать намного больше, чем просто открыть файл.

К счастью, Ruby обеспечивает хороший wrapper для Net::HTTP, называемый open-uri.

Просто поместите следующую строку в верхней части вашей программы, и он должен работать нормально:

require 'open-uri' 
0

Получить art_link SRC (что-то вроде art_link.attributes [ 'SRC']). А не agent.get из источника.

После того, как у вас будет только изображение на странице agent.page. Просто сохраните его с помощью agent.page.save ('image_path_and_name').

Смежные вопросы