Comment puis-je télécharger une image à partir d'un site Web à l'aide de Rails?


Joe Morano

J'utilise Selenium-Webdriver, OpenUri et Nokogiri pour gratter un site Web. Je souhaite télécharger une image particulière dudit site Web sur mon ordinateur Ubuntu. J'ai essayé quelques méthodes différentes mais chacune d'elles donne un message d'erreur différent.

Voici mon code de base, qui ouvre le site Web et obtient l'url de l'image (tout après cela, j'ai couru dans ma console pry):

require 'open-url'
require 'selenium-webdriver'
require 'nokogiri'
require 'uri'

url = "https://www.google.com/"
browser = Selenium::WebDriver.for :chrome
document = open(url).read
parsed_content = Nokogiri::HTML(content)
image = "https://www.google.com" + parsed_content.css('#hplogo').attr('src').value
binding.pry

1) Voici la première chose que j'ai essayé de télécharger l'image:

download = open(image)
IO.copy_stream(download, '~/image.png')

Pour cela, j'ai eu l'erreur suivante:

Errno :: ENOENT: aucun fichier ou répertoire de ce type @ rb_sysopen - ~ / image.png de (pry): 44: dans 'initialize'

Selon cette question , j'ai essayé d'ajouter un répertoire dans le code:

FileUtils.mkdir_p(image) unless File.exist?(image)

Mais j'ai eu la même erreur.


2) Ensuite, j'ai essayé ceci:

open('image.png', 'wb') do |file|
  file << open(image).read
end

et cela revient

#<File:image.png (closed)

mais le fichier n'est nulle part sur mon ordinateur et je ne peux pas comprendre ce que signifie ce message.


3) Ensuite, j'ai essayé

IO.copy_stream(open(image), 'image.png')

qui a simplement renvoyé ceci:

5482

mais encore une fois, je n'ai aucune idée de ce que cela signifie et le fichier n'est nulle part.


4) Enfin j'ai essayé

read_image = open(image).read
File.open(image, 'image.png') do |file|
  file.puts read_image
end

quelles sorties

ArgumentError: mode d'accès non valide image.png from (pry): 53: in 'initialize


Qu'est-ce que je fais mal? Étais-je proche de l'une de mes approches?

Artem Dorodovskyi

Le deuxième argument d'ouverture de fichier est le mode d'ouverture de fichier.

read_image = open(image).read
File.open('image.png', 'w+') do |file|
  file.write read_image
end

Votre troisième variante fonctionne bien. 5482 - longueur du fichier. Fichier 'image.png' dans le même répertoire que votre fichier .rb.

Articles connexes