Ruby : open-uri
Par RaphAstronome le dimanche, 27 mai 2007, 16:53 - Programmation - Lien permanent
Voici le problème qui pourrait vous arriver si vous avez comme moi une base de milliers de liens à vérifier. Dans ObjectFinder il y a 2706 : vous comprendrez que les vérifier tous à la main serait pour le moins ennuyeux, il y a même un fort risque de devenir fou avant d'avoir terminé la vérification. Heureusement on peut tout a fait faire un programme qui vérifie les liens pour vous.
Vous vous êtes sûrement demandé comment faire un programme qui télécharge des fichiers, pour ça il existe de différents moyens :
- Coder un client HTTP avec les sockets : c'est pas hyper dur mais c'est long pour pas grand chose.
- Utiliser un programme externe comme wget sous Linux mais il faut écrire dans un fichiers puis le lire, pas très propre.
- Utiliser une librairie : libcurl et autre.
Ruby à en standard une librairie qui permet de charger un fichier distant : 'open-uri'. Bien sur il serait dommage de ne pas l'utiliser.
Son utilisation est simple. Une fonction "open" appelle un bloc où on récupère le flux :
require 'open-uri' open(adresse) {|f| f.each_line {|ligne| # ligne est la valeur de la ligne # qui est actuellement lue puts ligne } }
Une exception est susceptible d'être levée si le fichier n'existe pas ou que le serveur est indisponible.
Donc on oublie pas de le vérifier :
require 'open-uri' begin open(adresse) {|f| f.each_line {|ligne| # ligne est la valeur de la ligne # qui est actuellement lue puts ligne } } rescue puts "Erreur" end
Attention toutefois ! Quelques précautions doivent êtres prises si vous envoyez beaucoup de requêtes :
- Le plus important : ralentissez vos requêtes, par exemple une par seconde. Si vous avez beaucoup de liens vous pouvez faire un système qui envoie 1 requête par secondes par serveur (on envoie plusieurs requêtes par seconde mais pas au même serveur).
- Ne pas charger des fichiers trops gros (éviter de faire les vérifications de téléchargement comme ça).
- Si vous êtes sur un mutualisé ne lancer pas votre script à partir du serveur mais téléchargez la liste sur votre ordi et exécutez le programme sur votre ordi.
- Faites un système qui permet de reprendre là où le programme c'est interrompu pour éviter d'avoir à tout refaire en cas de pépin.
- Soyez patients : ça peut durer un peu de temps mais au moins vous pouvez faire autre chose pendant que le programme tourne (a peu près 1h pour la base d'ObjectFinder).
- Ne pas recommencer sans arrêt : une fois par mois devrait être largement suffisant.
Commentaires