wget: cómo descargar de forma recursiva y solo extensiones / tipos MIME específicos (es decir, solo texto)

22

Cómo descargar un sitio web completo, pero ignorando todos los archivos binarios.

wgettiene esta funcionalidad usando la -rbandera pero descarga todo y algunos sitios web son demasiado para una máquina de bajos recursos y no es útil por la razón específica por la que estoy descargando el sitio.

Aquí está la línea de comando que uso: wget -P 20 -r -l 0 http://www.omardo.com/blog(mi propio blog)

Omar Al-Ithawi
fuente
1
wget solo puede filtrar con sufijo de archivo
daisy
@ warl0ck No lo sabía, ¡gracias! Las opciones -A y -R son muy útiles para mis operaciones.
Omar Al-Ithawi

Respuestas:

21

Puede especificar una lista de resp. Permitidas patrones de nombre de archivo no permitidos:

Permitido:

-A LIST
--accept LIST

No permitido:

-R LIST
--reject LIST

LIST es una lista separada por comas de patrones / extensiones de nombre de archivo.

Puede usar los siguientes caracteres reservados para especificar patrones:

  • *
  • ?
  • [
  • ]

Ejemplos:

  • solo descarga archivos PNG: -A png
  • no descargue archivos CSS: -R css
  • no descargue archivos PNG que comienzan con "avatar": -R avatar*.png

Si el archivo no tiene extensión resp. Supongo que el nombre del archivo no tiene un patrón que pueda usar, necesitaría el análisis de tipo MIME (vea la respuesta de Lars Kotthoff ).

unor
fuente
2

Puede intentar parchear wget con esto (también aquí ) para filtrar por tipo MIME. Sin embargo, este parche es bastante antiguo, por lo que es posible que ya no funcione.

Lars Kotthoff
fuente
Dando una oportunidad a esto ... ftp.gnu.org/gnu/wget Lancé los dados simplemente parcheando la versión más nueva de wget con esto pero sin suerte (por supuesto). Intentaría actualizar el parche pero, francamente, todavía no tengo las chuletas en c ++ para que no se hunda el tiempo. Me las arreglé para tomar la versión de wget para la que fue escrita y ponerla en funcionamiento. Sin embargo, tuve problemas para compilar con el soporte de SSL porque no pude averiguar qué versión de openssl necesitaba obtener.
MageProspero
Esto se ve genial. ¿Alguna idea de por qué este parche aún no ha sido aceptado (cuatro años después)?
David Portabella
2

Un nuevo Wget (Wget2) ya tiene características:

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

Wget2 no se ha lanzado a partir de hoy, pero lo será pronto. Debian inestable ya tiene una versión alfa enviada.

Mire https://gitlab.com/gnuwget/wget2 para obtener más información. Puede publicar preguntas / comentarios directamente a [email protected].

Tim Ruehsen Rockdaboot
fuente
1

He intentado un enfoque totalmente diferente: usar Scrapy, ¡pero tiene el mismo problema! Así es como lo resolví: SO: Python Scrapy - filtro basado en mimetype para evitar descargas de archivos que no sean de texto?

La solución es configurar un Node.jsproxy y configurar Scrapy para usarlo a través de http_proxyla variable de entorno.

Lo que debe hacer el proxy es:

  • Toma las solicitudes HTTP de Scrapy y las envía al servidor que se está rastreando. Luego devuelve la respuesta de Scrapy, es decir, intercepta todo el tráfico HTTP.
  • Para archivos binarios (basados ​​en una heurística que implementa), envía un 403 Forbiddenerror a Scrapy e inmediatamente cierra la solicitud / respuesta. Esto ayuda a ahorrar tiempo, tráfico y Scrapy no se bloqueará.

¡Código de proxy de muestra que 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
fuente