wget - Como baixar recursivamente e apenas tipos / extensões mime específicos (ou seja, somente texto)

22

Como baixar um site completo, mas ignorando todos os arquivos binários.

wgetpossui essa funcionalidade usando o -rsinalizador, mas faz o download de tudo e alguns sites são demais para uma máquina com poucos recursos e não são de uso pelo motivo específico em que estou baixando o site.

Aqui está a linha de comando que eu uso: wget -P 20 -r -l 0 http://www.omardo.com/blog(meu próprio blog)

Omar Al-Ithawi
fonte
1
wget só pode filtro com sufixo do arquivo
daisy
@ warl0ck Eu não sabia disso, obrigado! As opções -A e -R são muito úteis para minhas operações.
Omar Al-Ithawi

Respostas:

21

Você pode especificar uma lista de resp permitido. padrões de nome de arquivo não permitidos:

Permitido:

-A LIST
--accept LIST

Não permitido:

-R LIST
--reject LIST

LIST é uma lista separada por vírgula de extensões / padrões de nome de arquivo.

Você pode usar os seguintes caracteres reservados para especificar padrões:

  • *
  • ?
  • [
  • ]

Exemplos:

  • faça o download apenas de arquivos PNG: -A png
  • não baixe arquivos CSS: -R css
  • não baixe arquivos PNG que começam com "avatar": -R avatar*.png

Se o arquivo não tiver extensão resp. o nome do arquivo não tem um padrão que você possa usar; você precisará da análise do tipo MIME, eu acho (consulte a resposta de Lars Kotthoffs ).

unor
fonte
2

Você pode tentar corrigir o wget com isso (também aqui ) para filtrar por tipo MIME. Agora, esse patch é bastante antigo, portanto pode não funcionar mais.

Lars Kotthoff
fonte
Dando uma chance a isso ... ftp.gnu.org/gnu/wget Joguei os dados apenas corrigindo a versão mais recente do wget com isso, mas sem sorte (é claro). Eu tentaria atualizar o patch, mas, francamente, ainda não tenho as costeletas em c ++ para que não demore muito. Consegui pegar a versão do wget para a qual foi escrita e executá-la. Eu tive problemas ao compilar com suporte a ssl porque não conseguia descobrir qual versão do openssl precisava pegar.
MageProspero
isso parece ótimo. Alguma idéia de por que esse patch ainda não foi aceito (quatro anos depois)?
David Portabella
2

Um novo Wget (Wget2) já possui o recurso:

--filter-mime-type    Specify a list of mime types to be saved or ignored`

### `--filter-mime-type=list`

Specify a comma-separated list of MIME types that will be downloaded.  Elements of list may contain wildcards.
If a MIME type starts with the character '!' it won't be downloaded, this is useful when trying to download
something with exceptions. For example, download everything except images:

  wget2 -r https://<site>/<document> --filter-mime-type=*,\!image/*

It is also useful to download files that are compatible with an application of your system. For instance,
download every file that is compatible with LibreOffice Writer from a website using the recursive mode:

  wget2 -r https://<site>/<document> --filter-mime-type=$(sed -r '/^MimeType=/!d;s/^MimeType=//;s/;/,/g' /usr/share/applications/libreoffice-writer.desktop)

O Wget2 não foi lançado a partir de hoje, mas será em breve. O Debian instável já possui uma versão alfa.

Veja https://gitlab.com/gnuwget/wget2 para mais informações. Você pode postar perguntas / comentários diretamente para [email protected].

Tim Ruehsen rockdaboot
fonte
1

Eu tentei uma abordagem totalmente diferente é usar o Scrapy, no entanto, ele tem o mesmo problema! Aqui está como eu o resolvi: SO: Python Scrapy - filtro baseado em mimetype para evitar downloads de arquivos que não sejam de texto?

A solução é configurar um Node.jsproxy e configurar o Scrapy para usá-lo através da http_proxyvariável de ambiente.

O que o proxy deve fazer é:

  • Pegue solicitações HTTP do Scrapy e envie para o servidor que está sendo rastreado. Em seguida, retorna a resposta do Scrapy, ou seja, intercepta todo o tráfego HTTP.
  • Para arquivos binários (com base em uma heurística que você implementa), ele envia um 403 Forbiddenerro para Scrapy e fecha imediatamente a solicitação / resposta. Isso ajuda a economizar tempo, tráfego e o Scrapy não falha.

Código Proxy de exemplo Isso realmente funciona!

http.createServer(function(clientReq, clientRes) {
    var options = {
        host: clientReq.headers['host'],
        port: 80,
        path: clientReq.url,
        method: clientReq.method,
        headers: clientReq.headers
    };


    var fullUrl = clientReq.headers['host'] + clientReq.url;

    var proxyReq = http.request(options, function(proxyRes) {
        var contentType = proxyRes.headers['content-type'] || '';
        if (!contentType.startsWith('text/')) {
            proxyRes.destroy();            
            var httpForbidden = 403;
            clientRes.writeHead(httpForbidden);
            clientRes.write('Binary download is disabled.');
            clientRes.end();
        }

        clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
        proxyRes.pipe(clientRes);
    });

    proxyReq.on('error', function(e) {
        console.log('problem with clientReq: ' + e.message);
    });

    proxyReq.end();

}).listen(8080);
Omar Al-Ithawi
fonte