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

17

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

wget tem essa funcionalidade usando o -r flag, mas baixa tudo e alguns sites são demais para uma máquina com poucos recursos e não é útil pelo motivo específico de baixar 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)

    
por Omar Al-Ithawi 31.10.2012 / 09:15

4 respostas

1

Eu tentei uma abordagem totalmente diferente é usar o Scrapy, no entanto, ele tem o mesmo problema! Eis como resolvi o problema: SO: Python Scrapy - Filtro baseado no tipo MIME para evitar downloads de arquivos sem texto?

The solution is to setup a Node.js proxy and configure Scrapy to use it through http_proxy environment variable.

What the proxy should do is:

  • Take HTTP requests from Scrapy and sends it to the server being crawled. Then it gives back the response from to Scrapy i.e. intercept all HTTP traffic.
  • For binary files (based on a heuristic you implement) it sends 403 Forbidden error to Scrapy and immediate closes the request/response. This helps to save time, traffic and Scrapy won't crash.

Sample Proxy Code That actually works!

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);
    
por 25.12.2013 / 09:51
17

Você pode especificar uma lista de permissões permitidas. 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írgulas de padrões / extensõ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 faça o download de 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ê precisaria de uma análise do tipo MIME, eu acho (veja Lars Kotthoffs answer ).

    
por 27.11.2012 / 17:26
2

Você pode tentar corrigir o wget com este (também aqui ) para filtrar por tipo MIME. Este patch é bem antigo agora, então pode não funcionar mais.

    
por 31.10.2012 / 18:29
0

Um novo Wget (Wget2) já tem 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á lançado em breve. Debian Unstable já tem uma versão alpha enviada.

Veja o link para mais informações. Você pode enviar perguntas / comentários diretamente para [email protected].

    
por 14.11.2018 / 09:33