Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)

Tâche

Que faire si je souhaite utiliser Ruby pour télécharger un fichier sur Internet et l'enregistrer localement?

Solution

Le premier est un exemple de fichier texte. Si vous souhaitez télécharger Wikipedia --HyperText Markup Language sous forme de fichier HTML, écrivez comme suit.

require 'open-uri'

uri_str = 'https://ja.wikipedia.org/wiki/HyperText_Markup_Language'
URI.open(uri_str) do |res|
  IO.copy_stream(res, 'HyperText_Markup_Language.html')
end

La même chose est vraie pour les binaires comme les images. Téléchargez l'image donnée comme exemple d'un fichier PNG dans Wikipedia --Portable Network Graphics.

require 'open-uri'

uri_str = 'https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png'
URI.open(uri_str) do |res|
  IO.copy_stream(res, 'PNG_transparency_demonstration_1.png')
end

Mise en garde

La bibliothèque ʻopen-uri est un wrapper tel que Net :: HTTP Net :: HTTPS Net :: FTPqui vous permet de traiter les URL http et https comme des fichiers normaux. Cette bibliothèque redéfinitKernel # open`, vous pouvez donc également écrire:

require 'open-uri'

uri_str = 'https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png'
open(uri_str) do |res|
  IO.copy_stream(res, 'PNG_transparency_demonstration_1.png')
end

Cependant, à partir de Ruby 2.7, l'ouverture des URI en utilisant Kernel # open, qui est étendu par ʻopen-uri`, est obsolète. Lorsque j'exécute le code ci-dessus sur Ruby 2.7, j'obtiens l'avertissement suivant:

warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open

Cela ne veut pas dire que cela ne s'arrête pas juste à cause de l'avertissement, mais il est recommandé d'utiliser ʻURI # open ou ʻOpenURI # open_uri.

Informations environnementales

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18

Recommended Posts

Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
Je souhaite ajouter une fonction de navigation avec ruby on rails
Je veux créer un fichier de guerre Servlet avec OpenJDK sur CentOS7. Sans mvn. Sans connexion Internet.
Je souhaite surveiller un fichier spécifique avec WatchService
[Rubiy] Je veux créer un tableau à partir d'une chaîne de caractères avec la méthode split. Et vice versa.
Je veux accéder à l'API avec Rails sur plusieurs docker-composes configurés localement
Je souhaite l'implémenter en plus lors de l'utilisation de kotlin sur un site exécutant Java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Je veux créer un fichier Parquet même en Ruby
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
Créez un grand nombre d'enregistrements avec une seule commande à l'aide du fichier seeds.rb Ruby on Rails
[Spring Boot] Je veux ajouter mon propre fichier de propriétés et obtenir la valeur avec env.getProperty ().
Convertissez Excel en Blob avec java, enregistrez-le, lisez-le à partir de DB et exportez-le sous forme de fichier!
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.
UnsupportedClassVersionError a été généré lorsque j'ai placé le fichier .war construit avec Eclipse sur EC2 et l'ai exécuté.
Mémorandum: Quand j'ai essayé TensorFlow avec Tribuo, cela n'a pas fonctionné, alors je suis parti en voyage pour retrouver le chef de famille et je me suis perdu.
Lors de l'installation d'un gem avec l'extension C dans Ruby, je veux le terminer rapidement en utilisant plusieurs cœurs de processeur comme make -j4
Java: Téléchargez le fichier et enregistrez-le à l'emplacement sélectionné dans la boîte de dialogue [Utiliser HttpClient]
[Ruby] Je veux faire un saut de méthode!
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Je veux obtenir la valeur en Ruby
J'ai fait un portfolio avec Ruby On Rails
Je souhaite lire le fichier de propriétés avec un nom de fichier autre que application.yml ou application- [nom du profil] .yml avec Spring Boot
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
Lorsque j'appelle le fichier avec la classe # getResource à partir du fichier jar, il devient Not Found et c'est un mémorandum merdique
Je souhaite établir une connexion lorsqu'une base de données est créée à l'aide de Spring et MyBatis
Je souhaite analyser morphologiquement le journal stocké dans la base de données et le stocker dans la base de données pour classer les messages 1
[AWS Lambda] Redimensionner l'image enregistrée dans S3 et l'enregistrer dans un autre S3 (à l'aide de Ruby)
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration
Le fichier CSV que j'ai pu télécharger a soudainement commencé à apparaître sur la page.
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
Je veux utiliser NetBeans sur Mac → Je peux l'utiliser!
Je veux juger la gamme en utilisant le diplôme mensuel
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
Je veux faire des transitions d'écran avec kotlin et java!
21 Lire et exécuter le script à partir du fichier
Je veux appeler la méthode principale en utilisant la réflexion
Je souhaite simplifier la sortie du journal sur Android
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
Après avoir publié un article avec Rails Simple Calendar, je souhaite le refléter dans le calendrier.
Je souhaite utiliser l'applet Java facilement sur la ligne de commande sans utiliser l'IDE
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Je veux amener Tomcat sur le serveur et démarrer l'application
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3