web-dev-qa-db-fra.com

CURL pour télécharger un répertoire

J'essaie de télécharger un répertoire complet de sites Web à l'aide de CURL. La commande suivante ne fonctionne pas:

curl -LO http://example.com/

Il renvoie une erreur: curl: Remote file name has no length!.

Mais quand je fais ceci: curl -LO http://example.com/someFile.type cela fonctionne. Une idée sur la façon de télécharger tous les fichiers du répertoire spécifié? Merci.

33
Foo

HTTP n'a pas vraiment de notion de répertoires. Les barres obliques autres que les trois premières (http://example.com/) n'ont aucune signification particulière, sauf en ce qui concerne .. dans les URL relatives. Donc, à moins que le serveur suive un format particulier, il n’ya aucun moyen de “télécharger tous les fichiers du répertoire spécifié”.

Si vous souhaitez télécharger tout le site, le mieux est de parcourir tous les liens de la page principale de manière récursive. Curl ne peut pas le faire, mais wget le peut. Cela fonctionnera si le site Web n'est pas trop dynamique (en particulier, wget ne verra pas les liens construits avec du code Javascript). Commencez par wget -r http://example.com/ et reportez-vous aux rubriques "Options de récupération récursive" et "Options d'acceptation/rejet récursives" du manuel wget pour obtenir des options plus pertinentes (profondeur de récursivité, listes d'exclusion, etc.).

Si le site Web tente de bloquer les téléchargements automatisés, vous devrez peut-être modifier la chaîne de l'agent utilisateur (-U Mozilla) et ignorer robots.txt (créer un fichier vide example.com/robots.txt et utiliser l'option -nc de sorte que wget n'essaie pas de le télécharger depuis le serveur. ).

31
Gilles

Travaille toujours pour moi, sans parent et récursif pour obtenir uniquement le répertoire souhaité.

 wget --no-parent -r http://WEBSITE.com/DIRECTORY
26
stanzheng

Dans ce cas, curl n'est PAS le meilleur outil. Vous pouvez utiliser wget avec l'argument -r, comme ceci:

wget -r http://example.com/ 

C'est la forme la plus basique et vous pouvez également utiliser des arguments supplémentaires. Pour plus d'informations, voir manpage (man wget).

13
moroccan

Ce n'est pas possible Il n’existe pas de méthode standard, généralement implémentée, permettant à un serveur Web de vous renvoyer le contenu d’un répertoire. La plupart des serveurs génèrent un index HTML d'un répertoire, s'il est configuré pour le faire, mais cette sortie n'est ni standard ni garantie par tous les moyens. Vous pouvez analyser ce code HTML, mais gardez à l'esprit que le format changera de serveur à serveur et ne sera pas toujours activé.

5
Brad

Vous pouvez utiliser l'extension Firefox DownThemAll! Il vous permettra de télécharger tous les fichiers d’un répertoire en un clic. Il est également personnalisable et vous pouvez spécifier les types de fichiers à télécharger. C'est le moyen le plus simple que j'ai trouvé.

2
Asdf

Vous pouvez trouver ici une utilisation pour un extracteur de site Web, cela téléchargera tout et modifiera le contenu/les liens internes pour une utilisation locale. Un bon peut être trouvé ici: http://www.httrack.com

0
Gaurav Joseph