web-dev-qa-db-fra.com

wget web crawler récupère les fichiers d'index non désirés index.html

J'ai créé une fonction ~/.bashrc pour enregistrer certains répertoires Web sur mon disque local. Cela fonctionne bien sauf certains fichiers d’index indésirables qui ne sont pas présents sur le site. Je l'utilise comme

crwl http://ioccc.org/2013/cable3/  

mais il récupère également certains fichiers tels que index.html?C=D;O=A index.html?C=D;O=D index.html?C=M;O=A index.html?C=M;O=D index.html?C=N;O=A index.html?C=N;O=D index.html?C=S;O=A index.html?C=S;O=D

Liste complète des fichiers:

 kenn@kenn:~/experiment/crwl/ioccc.org/2013/cable3$ ls
 bios        index.html?C=D;O=A  index.html?C=S;O=A           screenshot_flightsim4.png
 cable3.c    index.html?C=D;O=D  index.html?C=S;O=D           screenshot_Lotus123.png
 fd.img      index.html?C=M;O=A  Makefile                     screenshot_qbasic.png
 hint.html   index.html?C=M;O=D  runme                        screenshot_simcity.png
 hint.text   index.html?C=N;O=A  sc-ioccc.terminal            screenshot_win3_on_macosx.png
 index.html  index.html?C=N;O=D  screenshot_autocad.png

Je souhaite exclure ces fichiers lors du clonage de ce répertoire avec wget Existe-t-il un commutateur ou une astuce wget permettant de cloner un répertoire Web tel quel?

Mon script fonctionne dans .bashrc:

crwl() {
wget --tries=inf --timestamping --recursive --level=inf --convert-links --page-requisites --no-parent "$@"

}

EDIT: j'ai trouvé deux solutions de contournement possibles

1) Ajout de -R index.html?* flag

2) Ajout du drapeau -R =A,=D qui rejette les fichiers index.html?C=D;O=A sauf index.html

Je ne sais pas lequel est approprié, mais les deux semblent dangereux.

3
kenn

Essayez ceci après le téléchargement, si vous ne voulez pas utiliser le mécanisme de suppression de wget ou si vous êtes sur un système ne supportant pas cette option.

FIND=$($WHICH find)
PWD2=$($WHICH pwd)
SH=$($WHICH sh)
ECHO=$($WHICH echo)
LESS=$($WHICH less)

Commander:

$FIND "$($PWD2)" -regextype posix-egrep -type f -regex '^(.*?html\?C=[DNSM];O=[AD])$' -exec "$SH" -c 'o="{}";$ECHO -f -v "${o}"' \; | $LESS

Lorsque vous êtes satisfait du résultat, procédez comme suit:

  1. Émettez la commande suivante (voir l'encadré ci-dessous)
  2. Remplacez $ ECHO par $ RM dans la commande ci-dessus.
  3. Retirez le tuyau (|) et le $ LESS pour obtenir la sortie réelle.

(Je ne suis pas responsable de la suppression de tout votre système de fichiers, donc de cette façon.)

RM=$($WHICH rm);export RM
$FIND "$($PWD2)" -regextype ... ;$RM -f -v "${xox}"' \; 

J'espère que cela t'aides.

1
Michael Grieswald

Pour exclure les fichiers de type index tels que ceux avec l'URL index.html?C=... sans exclure aucun autre type de fichier index.html*, il est en effet possible de spécifier une spécification plus précise. Essayez: -R '\?C='

Démo rapide

Configurer un autre répertoire vide, par exemple

$ mkdir ~/experiment2
$ cd ~/experiment2

Ensuite, une version plus courte de votre commande, sans la récursivité et les niveaux afin de faire un test rapide d’une page:

$ wget --tries=inf --timestamping --convert-links --page-requisites --no-parent -R '\?C=' http://ioccc.org/2013/cable3/

Une fois que wget est terminé, ~/experiment2 n'aura pas de fichiers index.html?C=...:

.
└── ioccc.org
    ├── 2013
    │   └── cable3
    │       └── index.html
    ├── icons
    │   ├── back.gif
    │   ├── blank.gif
    │   ├── image2.gif
    │   ├── text.gif
    │   └── unknown.gif
    └── robots.txt

4 directories, 7 files

Donc, il a en effet exclu ces répertoires redondants index-sort index.html?C=... tout en conservant tous les autres répertoires index.html, dans ce cas, il ne s'agit que de index.html

Mettre en place

Il suffit donc de mettre en œuvre le -R '\?C=' en mettant à jour votre fonction Shell dans ~/.bashrc:

crwl() {
  wget --tries=inf --timestamping --recursive --level=inf --convert-links --page-requisites --no-parent -R '\?C=' "$@"
}

Ensuite, n'oubliez pas de tester dans un nouveau terminal ou de re-source bash pour le rendre efficace:

$ . ~/.bashrc

Puis essayez-le dans un nouveau répertoire, pour comparaison:

$ mkdir ~/experiment3
$ cd ~/experiment3
$ crwl http://ioccc.org/2013/cable3/

Garantie

  • wget 1.14 et plus seulement. Donc, si votre wget -V indique qu'il s'agit de la version 1.13, cela risque de ne pas fonctionner et vous devez réellement supprimer ces satanés index.html?C=... ou essayer d'obtenir une version plus récente de wget.
  • fonctionne en spécifiant que vous voulez -R ou rejeter un motif, dans ce cas des pages avec ?C= motif typique des versions index.html?C=... de index.html.
  • cependant, ? se trouve être un caractère générique wget. Ainsi, pour correspondre à un littéral ?, vous devez l'échapper en tant que \?.
  • ne pas interrompre wget. Comme il semble que wget fonctionne avec des pages Web navigables, il faut d'abord télécharger, puis supprimer, comme s'il fallait vérifier si ces pages contiennent d'autres liens à explorer. Donc, si vous annulez à mi-chemin, vous allez toujours vous retrouver avec les fichiers index.html?C=. Seulement si vous laissez wget terminer, wget suivra votre spécification -R et supprimera tous les fichiers index.html?C=... téléchargés temporairement pour vous.
1
clarity123