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)


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 ).


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.


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 bug-wget@gnu.org.


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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.