Comment puis-je télécharger une image à partir d'un site Web à l'aide de Rails?
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?
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.