wget - 如何递归下载并且仅下载特定的 MIME 类型/扩展(即仅文本)

Oma*_*awi 27 download wget recursive mime-types

如何下载完整的网站,但忽略所有二进制文件。

wget使用该-r标志具有此功能,但它可以下载所有内容,并且某些网站对于资源不足的机器来说太多了,并且由于我正在下载该网站的特定原因,它没有用。

这是我使用的命令行:(wget -P 20 -r -l 0 http://www.omardo.com/blog我自己的博客)

uno*_*nor 26

您可以指定允许的响应列表。不允许的文件名模式:

允许:

-A LIST
--accept LIST
Run Code Online (Sandbox Code Playgroud)

不允许:

-R LIST
--reject LIST
Run Code Online (Sandbox Code Playgroud)

LIST 是逗号分隔的文件名模式/扩展名列表。

您可以使用以下保留字符来指定模式:

  • *
  • ?
  • [
  • ]

例子:

  • 只下载 PNG 文件: -A png
  • 不要下载 CSS 文件: -R css
  • 不要下载以“头像”开头的 PNG 文件: -R avatar*.png

如果文件没有扩展名。文件名没有您可以使用的模式,我猜您需要 MIME 类型解析(请参阅Lars Kotthoffs 回答)。


Oma*_*awi 1

我尝试过一种完全不同的方法是使用Scrapy,但它有同样的问题!这是我解决它的方法:SO:Python Scrapy - 基于 mimetype 的过滤器以避免非文本文件下载?

解决方案是设置一个Node.js代理并配置Scrapy通过环境变量使用它http_proxy

代理应该做是:

  • 从 Scrapy 获取 HTTP 请求并将其发送到正在爬取的服务器。然后它返回 Scrapy 的响应,即拦截所有 HTTP 流量。
  • 对于二进制文件(基于您实施的启发式),它会403 Forbidden向 Scrapy 发送错误并立即关闭请求/响应。这有助于节省时间、流量,并且 Scrapy 不会崩溃。

实际有效的示例代理代码!

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);
Run Code Online (Sandbox Code Playgroud)