Wget est un outil de téléchargement très commun sous les systèmes type Linux. Il s'utilise en ligne de commande. L'outil a des paramètres d'utilisation qui le rendent assez puissant, mais dans les cas où il ne se suffit pas à lui-même, on peut écrire des mini scripts en shell ou python si l'on a la chance de connaître un peu ces langages. Wget dispose aussi d'interfaces graphiques (front-end) comme gwget, qui peuvent simplifier l'ajustement de ses options si la ligne de commande vous rebute.
Un peu de documentation:
Par exemple, avec les sites mentionnés dans l'article Trouver et écouter de la musique sans P2P.
Tout télécharger sans se prendre la tête:
wget -mc "http://rob1.j92.free.fr/Musique"
wget 'http://foetusparty.free.fr/demo%20k7.htm' -A '*.mp3' -r -l 1
Le -A signifie Accept, c'est la liste des extensions de fichiers que l'on conserve.
Le -r signifie récursif, et le -l limite le niveau de récursivité de façon à ce qu'il ne fouine pas tous les autres liens html de la page.
Admettons qu'on tombe sur un site avec des mp3 dont on peut retrouver les liens mais dont le téléchargement n'est pas évident. On peut utiliser un gestionnaire de téléchargements, un aspirateur de sites web, ou bien wget avec un script.
Le Terrier est un site un peu rigolo avec plein de trucs dedans qu'on prend pas forcément le temps de mater mais où on voit que ça a l'air intéressant, direction sa page «musique».
Matons les sources HTML (CTRL+U), car pour tout site web qui joue de la musique, il y a forcément référence aux fichiers sons quelque part. Ici on a de la chance, le code est plutôt clair à lire. Il n'y a pas les liens mp3 directement dedans, mais ils sont dans un fichier .js à part, on click sur tracks.js
.
var tracks = [ {"url": "http://www.le-terrier.net/albums/arbag/soir1/sons/mp3/donner-le-ton.mp3", "title": "Donner le ton", "artists": ["L.L. de Mars", "François Coquet"], "sections": ["composition", "concert", "poésie"]}, {"url": "http://www.le-terrier.net/musique/lldm/sonnets/01.mp3", "title": "Sonnet étriqué I", "artists": ["L.L. de Mars"], "sections": ["lectures", "poésie", "solo", "expérimentation"]}, {"url": "http://www.le-terrier.net/musique/lldm/sonnets/02.mp3", "title": "Sonnet étriqué II", "artists": ["L.L. de Mars"], "sections": ["lectures", "poésie", "solo", "expérimentation"]},
La liste des fichiers est bien là, mais il faut épurer cette liste pour qu'elle soit exploitable par wget, on va donc écrire un petit script en shell. En fait, ça tiendra en une ligne.
On enregistre la liste complète dans un fichier que l'on a qu'a nommer listejs.txt.
Ça, ça balance dans le terminal le contenu du fichier.
cat listejs.txt
Le caractère '|' indique qu'on passe le flux vers la commande qu'on indique après, plutôt que vers le terminal.
Ici, la commande qui suit le '|' est grep
, qui permet de filtrer selon le motif que l'on a indiqué.
cat listejs.txt | grep mp3
Résultat:
{"url": "http://www.le-terrier.net/albums/arbag/soir1/sons/mp3/donner-le-ton.mp3", {"url": "http://www.le-terrier.net/musique/lldm/sonnets/01.mp3", {"url": "http://www.le-terrier.net/musique/lldm/sonnets/02.mp3",
A partir de là, on a une ligne par mp3, mais toujours du code javascript qu'on doit nettoyer. Le nettoyage va se faire avec cut
, qui permet de tailler une chaîne de caractères en plusieurs champs selon un critère de séparation.
Les 2 options de cut
que l'on utilise ici sont: -d
, pour préciser quel caractère délimiteur, et -f
, pour indiquer le numéro de la section que l'on va conserver.
cat listejs.txt| grep mp3 | cut -d '"' -f 4
Résultat:
http://www.le-terrier.net/albums/arbag/soir1/sons/mp3/donner-le-ton.mp3 http://www.le-terrier.net/musique/lldm/sonnets/01.mp3 http://www.le-terrier.net/musique/lldm/sonnets/02.mp3
Et là, on a fini. Pour chaque ligne, on a le lien http:// du mp3. On va donc enregistrer le résultat dans un fichier. On peut faire cela en redirigeant le résultat avec '>'.
cat listejs.txt| grep mp3 | cut -d '"' -f 4 > mp3terrier.txt
On peut ensuite donner à wget le résultat contenu dans le fichier mp3terrier.txt
.
On invoque wget avec -c
pour dire “continue”, c'est à dire reprise si l'on a interrompu le téléchargement ; -x
demande à wget de recréer l'arborescence de répertoires tels qu'il les trouve dans les liens ; et -i
comme “input” sert à indiquer le nom du fichier dont on lira les URLs.
wget -c -x -i mp3terrier.txt
Bon le hic apparemment c'est que sur le terrier ça télécharge à 2 à l'heure… mais c'est pas grave, on aura nos mp3s !
edmc73 nous fait part d'une commande qui remplace l'usage des cut
et grep
du script ci-dessus.
sed -e '/url/!d' -e 's/^\s*{"url": "\(.*\)",/\1/' tracks.js
edmc73 a encore frappé, ce motif devrait convenir à bon nombre de cas d'extration d'URLs de MP3, éventuellement avec des adaptations mineures:
Pour traiter une donnée ayant chaque ligne du type:
dublablacodecode<a href="/chemin/bien/precis/fichier.xyz">OnSenFoutDuNom</a>dublablacode
… et en extraire la partie fichier.xyz, on pourra utiliser:
sed -r 's/.*href=".*[$/](.*)".*/\1/' tonFichier.html
Des explications simples sur sed sur son wiki.
-e robots=off
nécessaire): http://blog.archive.org/2012/04/26/downloading-in-bulk-using-wget/ ; idem ici: http://codenimbus.com/2010/08/02/override-robots-txt-with-wget/