Se você usar a expansão entre chaves wget
, poderá buscar imagens numeradas em seqüência com facilidade:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Ele busca os 10 primeiros arquivos numerados 90.jpg
para 99.jpg
ficarem bem, mas 100.jpg
retorna um erro 404: Arquivo não encontrado (tenho apenas 100 imagens armazenadas no servidor). Esses arquivos inexistentes se tornam mais "um problema" se você usar um intervalo maior, como {00..200}
, com 100 arquivos inexistentes, aumenta o tempo de execução do script e pode até se tornar um pequeno fardo (ou pelo menos aborrecimento) em o servidor.
Existe alguma maneira de wget
parar depois de receber seu primeiro erro 404? (ou melhor ainda, duas em uma linha, caso haja um arquivo ausente no intervalo por outro motivo) A resposta não precisa usar a expansão entre chaves; loops também são bons.
fonte
1, 2 or even n failures
não é o caminho certo quando você conhece[begin .. end]
índices. Por que você especificaria o[1..200]
alcance quando sabe que existem apenas 100 imagens[1..100]
? Eu acho que você pode tentar o GNUparallel
para solicitações simultâneas para acelerar o processo.Respostas:
Se você está feliz com um loop:
Isso será executado
wget
para cada URL da sua expansão até que ela falhe ebreak
saia do loop.Se você deseja duas falhas consecutivas, fica um pouco mais complicado:
Você pode diminuir um pouco com
&&
e em||
vez deif
, mas fica bem feio.Eu não acredito que
wget
tenha algo embutido para fazer isso.fonte
elif
para tornar o segundo exemplo mais claro? Algo assim talvez? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (ele só adiciona uma linha extra, não incluindo colocando asthen
s na mesma linha que oif
s)Você pode usar a
$?
variável para obter o código de retorno do wget. Se for diferente de zero, significa que ocorreu um erro e você o contabiliza até atingir um limite, e pode sair do circuito.Algo assim em cima da minha cabeça
O loop for pode ser um pouco limpo, mas você pode entender a ideia geral.
Mudar
$threshold -eq 16
para-eq 24
significa que falhará três vezes antes de parar, no entanto, não ocorreria duas vezes seguidas, seria se falhasse duas vezes no loop.A razão pela qual
16
e24
são usados é que é o total dos códigos de retorno.O wget responde com um código de retorno
8
quando recebe um código de resposta que corresponde a um erro do servidor e, portanto,16
é o total após 2 erros.É possível parar quando as falhas ocorrem apenas duas vezes seguidas, redefinindo o limite sempre que
wget
bem-sucedido, ou seja, quando o código de retorno é 0Uma lista de códigos de retorno do wget pode ser encontrada aqui - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html
fonte
8
, portanto, os números mágicos de16
e24
.$?
! Muito útil!Com o GNU Parallel, isso deve funcionar:
Na versão 20140722, você quase pode ter o seu "dois em fila" - falha: --halt 2% permitirá que 2% dos trabalhos falhem:
fonte
A IMO, focando no
wget
código / status de saída da saída, pode ser muito ingênua para alguns casos de uso, então aqui está um que considera o Código de Status HTTP e também para algumas tomadas de decisão granulares.wget
fornece um-S/--server-response
sinalizador para imprimir os cabeçalhos de resposta HTTPSTDERR
do comando - sobre os quais podemos extrair e agir.fonte
Em python você pode fazer
Confira a documentação do subprocesso, se você quiser fazer mais https://docs.python.org/2/library/subprocess.html
fonte
check_output
que haja alguma mágica por pertowget
para detectar uma404
- eu não acredito que haja verificações adequadas aqui e, portanto, realmente não responda à pergunta.