Journal Télécharger tous les fichiers PDF d’un site web

Posté par (page perso) . Licence CC by-sa
15
5
avr.
2018

Il y a quelque temps j'ai eu besoin de télécharger tous les PDF d'un gros site web, et puis d'un autre…

J'ai cherché un moment comment obtenir ce que je voulais avec wget mais sans grand succès, soit wget explore récursivement le site en téléchargeant toutes les pages, soit il ne récupère que les fichiers voulus, mais je n'ai pas trouvé comment associer les deux comportements (et il serait logique que wget ait besoin de télécharger les pages du site exploré pour savoir où aller ensuite). Du coup, j'ai bidouillé un truc en Python dans l'urgence, et puis, ayant à nouveau un exercice similaire, j'ai pu raffiner. Ça donne aujourd'hui : doc_crawler.py.

L'idée est simple, sans autre arguments le logiciel explore le site web pointé et liste les URL des fichiers croisés (PDF, ODT, ZIP…). On peut alors rediriger cette liste dans un fichier, puis demander, dans un deuxième temps (typiquement la nuit suivante) à doc_crawler.py de télécharger ce qui est listé dans le fichier. Ça permet de vérifier que la liste a la bonne tête avant de passer aux choses sérieuses, sans changer d'outil. Par défaut, doc_crawler.py attendra un nombre aléatoire de secondes (de 0 à 5) entre chaque téléchargement histoire de rester discret.

Enfin, il est possible de passer une URL en argument et de préciser qu'il faut juste télécharger ce fichier pour finir le boulot à la main sans changer d'outil, en cas de besoin.

doc_crawler.py [--accept=jpe?g$] [--download] [--single-page] [--verbose] http://…
doc_crawler.py [--wait=3] [--no-random-wait] --download-files url.lst
doc_crawler.py [--wait=0] --download-file http://…

Tout est précisé dans le README sur (Github et Pypi, et illustré sur Grimoire-Command.es (wget, doc_crawler.py)).

  • # torsocks

    Posté par (page perso) . Évalué à 3 (+2/-0).

    Et j'ai oublié de préciser que doc_crawler.py fonctionne très bien avec torsocks, pour les cas où il y a besoin de rester très discret.

    La liberté ne s'use, que si on ne s'en sert pas.

  • # wget quand même

    Posté par . Évalué à 10 (+9/-1).

    Mes quelques tests montrent que wget --recursive --level=1 --accept "*.pdf" "http://mydomain.org/folder/with/pdf/documents/" a bien le comportement escompté.

    • [^] # Re: wget quand même

      Posté par (page perso) . Évalué à 3 (+2/-0).

      doc_crawler.py permet (par défaut) un --level=∞ tant-que-ça-ne-sort-pas du site.

      La liberté ne s'use, que si on ne s'en sert pas.

      • [^] # Re: wget quand même

        Posté par . Évalué à 4 (+2/-0).

        Pareil pour wget, par défaut 5 mais tu peux mettre --level=inf.

        Mais tu disais

        soit wget explore récursivement le site en téléchargeant toutes les pages, soit il ne récupère que les fichiers voulus

        Et bien l'option "level" permet de limiter la portée.

    • [^] # Re: wget quand même

      Posté par (page perso) . Évalué à 2 (+2/-1).

      Ça ne marche pas sur tout le site mais seulement pour les fichiers du dossier /folder/with/pdf/documents/

  • # Est-ce bien légal tout ça ?

    Posté par (page perso) . Évalué à 10 (+11/-0).

    Attention, Certains ce sont fait arrêter pour ce genre de choses.
    https://fr.wikipedia.org/wiki/Aaron_Swartz#Affaire_JSTOR

  • # Petite requête

    Posté par . Évalué à 2 (+0/-0).

    Sympa comme petit script.

    Je n'ai pas encore eu le temps de le tester mais en survolant ton code et sauf erreur de ma part, si un fichier se retrouve plusieurs fois avec le même nom dans l'arborescence initiale, tu le téléchargeras autant de fois et la dernière version écrasera les précédentes.

    Il serait pas mal de détecter ces doublons en stockant un dir de tous les noms et le cas échéant hasher les fichiers et s'ils sont différents et introduire ce hash dans le nom du fichier.

    Ou alors peut-être une option pour refléter l'arborescence du serveur …

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.