Baixar fotos de um site com o wget

Olá,

Não tenho muita experiência com o wget e estou precisando de uma ajuda!

Como posso baixar as imagens de um site com a seguinte estrutura: https://exemplo.com.br/public/files/2024/07/15/exemplo.jpg

Como se pode notar a cada dia é criado uma pasta. Preciso pegar especificamente o arquivo ‘exemplo.jpg’ desde o ano de 2016, ou todos os ‘exemplo.jpg’ dentro das subpastas da pasta ‘files/’.

Desde já agradeço!!

Sem saber o site não dá pra saber se dá pra fazer exatamente o que você quer mas uma forma genérica é espelhar o site:

wget                      \
     --recursive          \ # Recursivo, faz o que você quer
     --no-clobber         \ # Não baixa 2x o mesmo arquivo
     --page-requisites    \ # Baixa tudo que é necessário para exibir a página (é oque baixa as imagens)
     --adjust-extension   \ # Adiciona extensões
     --span-hosts         \ # Necessário se os arquivos não estiverem no mesmo servidor
     --no-parent          \ # Evita voltar nívesis
     --accept "x.jpg"     \ # Baixa apenas arquivos com x.jpg no nome
     "https://exemplo.com.br/public/files/2016/" \
     "https://exemplo.com.br/public/files/2017/" \
     "https://exemplo.com.br/public/files/2018/" \
     "https://exemplo.com.br/public/files/2019/" \
     "https://exemplo.com.br/public/files/2020/" \
     "https://exemplo.com.br/public/files/2021/" \
     "https://exemplo.com.br/public/files/2022/" \
     "https://exemplo.com.br/public/files/2023/" \
     "https://exemplo.com.br/public/files/2024/"

Mas preciso que baixe o mesmo arquivo, pois todos tem o mesmo nome em diretórios diferentes. Creio que seja só eliminar essa opção… Porém, ele tem que salvar todos, como exemplo1.jpg, exemplo2. jpg… Mas acho que isso o wget já faz por padrão, não?

Mesmo arquivo == mesma hash

Você vai precisar por --no-directories sem essa flag ele baixa na subpasta

Testei aqui e deu:

OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Isso significa que o site não usa SSL (o que é bem estranho) --no-check-certificate deve resolver

Já tentei, não mudou nada

tenta tirar o https mas é improvável que funcione, sem saber o site é difícil ajudar

Alguns sites/servidores possuem proteção contra download em massa quando o acesso é externo, mesmo que o script esteja tecnicamente correto o host pode encerrar a comunicação e gerar um erro aleatório.

@edgarsj Se você possui acesso ao servidor de outras formas, talvez seja mais produtivo copiar via sistema de arquivos ou usando o localhost.

:vulcan_salute:

1 curtida

Tentei http e retornou:

A conectar arte.estadao.com.br|2.18.20.170|:80… conectado.
Pedido HTTP enviado, a aguardar resposta…403 Forbidden
2024-07-15 15:40:25 ERRO 403: Forbidden.

O site em questão é https://arte.estadao.com.br/

Não tenho acesso ao servidor…

Acabei esquecendo de avisar que estou rodando o wget numa máquina Windows

Isso era comum de funcionar nos anos 90. Atualmente o furo é mais embaixo pra conseguir acessar em massa o conteúdo de servidores. Se o servidor é profissional então, certamente há várias camadas de proteção.

Ok, Valeu pelo esforço de todos… o jeito é baixar inúmeros de arquivos manualmente.

Muito obrigado!

O problema é que eu estava usando uma versão mais antiga do wget, atualizei e parou de dar o erro de SSL…

Agora está retornando Erro 403. Se eu informar um arquivo específico ele baixa, mas se eu só especificar a pasta retorna o Erro 403

Assim funciona:
wget --recursive --content-on-error --no-parent --no-directories -w 2 “https://exemplo.net/wp-content/uploads/2022/11/arquivo.pdf

Assim não:
wget --recursive --content-on-error --no-parent --no-directories -w 2 “https://exemplo.net/wp-content/uploads/2022/11/

Aí não tem o que fazer 403 só com autorização interna

Como o erro só retornava no acesso recursivo à pasta e não dava erro acessando direto o arquivo (que sempre tem o mesmo nome), o que fiz foi um script pra ir trocando de ano, mês e dia.

@echo off
for /l %%a in (2017,1,2024) do (
for %%m in (01,02,03,04,05,06,07,08,09,10,11,12) do (
for %%d in (01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31) do (
wget --no-parent --accept "puzzle.jpg" --no-directories -w 2
"https://exemplo.com.br/public/pasta1/palavras-cruzadas/%%a/%%m/%%d/arquivo.jpg")))

Tive que enumerar os meses e os dias pois o FOR /L retornaria só um dígito de 1 a 9, e precisava de 01, 02, 03…

Mas resolveu meu problema

1 curtida