wget o crawler da web recupera arquivos de índice index.html indesejados

2

Eu fiz uma função ~/.bashrc para salvar alguns diretórios da web em meu disco local. Ele funciona bem, exceto alguns arquivos de índice indesejados que não estão presentes no site. Eu uso como

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

mas também recupera alguns arquivos, como 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

Lista completa de arquivos:

 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

Desejo excluir esses arquivos ao clonar esse diretório com wget Existe alguma mudança% wget ou truque para clonar um diretório web como é?

Minha função de script em .bashrc :

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

}

EDIT: eu encontrei duas soluções possíveis

1) Adicionando -R index.html?* flag

2) Adicionando -R =A,=D flag que rejeita index.html?C=D;O=A arquivos, exceto index.html

Eu não sei qual é o melhor, mas ambos parecem inseguros.

    
por kenn 10.01.2016 / 12:31

2 respostas

2

Para excluir arquivos de classificação de índice, como aqueles com URL index.html?C=... sem excluir nenhum outro tipo de arquivos index.html* , há, de fato, uma especificação mais precisa possível. Experimente: -R '\?C='

Demonstração rápida

Configure um diretório vazio diferente, por exemplo

$ mkdir ~/experiment2
$ cd ~/experiment2

Em seguida, uma versão mais curta do seu comando, sem a recursão e os níveis, a fim de fazer um teste rápido de uma página:

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

Depois que o wget estiver pronto, ~/experiment2 não terá arquivos 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

Por isso, excluiu os diretórios redundantes index-sort index.html?C=... , mantendo todos os outros diretórios index.html, neste caso apenas index.html

Implementar

Portanto, basta implementar o -R '\?C=' , atualizando a função do shell em ~/.bashrc :

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

Depois, lembre-se de testar em um novo terminal ou recomprar o bash para torná-lo efetivo:

$ . ~/.bashrc

Em seguida, experimente em um novo diretório, para comparação:

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

Garantia

  • wget 1.14 e apenas para cima. Então, se o seu wget -V disser que é 1,13, isso pode não funcionar e você precisa realmente deletar os traços desagradáveis doindex.html?C=..., ou tentar obter uma versão mais recente do wget.
  • funciona especificando que você deseja -R ou rejeitar um padrão, neste caso, páginas com ?C= padrão típico das index.html?C=... versões de index.html .
  • no entanto, ? é um curinga wget, portanto, para corresponder a um literal ? , você precisa escapar como \?
  • não interrompa o wget. Porque parece que a maneira como o wget funciona com páginas da Web navegáveis é fazer o download primeiro, excluir depois, como se ele precisasse verificar se essas páginas têm links adicionais para rastrear. Então, se você cancelar isso no meio do caminho, ainda vai acabar com index.html?C= arquivos. Somente se você deixar o wget terminar, então o wget seguirá a sua especificação -R e excluirá os arquivos index.html?C=... transferidos temporariamente para você
por clarity123 12.01.2016 / 20:24
1

Tente isso após o download, se você não quiser usar o mecanismo de remoção do wget ou se estiver em um sistema que não suporta essa opção.

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

Comando:

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

Quando estiver satisfeito com a saída, faça o seguinte:

  1. Emita o seguinte comando (veja a caixa abaixo)
  2. Substitua $ ECHO por $ RM no comando acima.
  3. Remova o pipe (|) e o $ LESS para obter a saída real.

(Eu não sou responsável por quando você exclui todo o seu sistema de arquivos, portanto, desta forma.)

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

Espero que isso ajude.

    
por Michael Grieswald 16.08.2017 / 10:21