如何下载完整的网站,但忽略所有二进制文件。
wget
使用该标志具有此功能-r
,但它会下载所有内容,并且某些网站对于资源匮乏的计算机来说太多了,而且由于我下载该网站的具体原因,它没有用处。
这是我使用的命令行:(wget -P 20 -r -l 0 http://www.omardo.com/blog
我自己的博客)
答案1
您可以指定允许的列表。不允许的文件名模式:
允许:
-A LIST
--accept LIST
不允许:
-R LIST
--reject LIST
LIST
是以逗号分隔的文件名模式/扩展名列表。
您可以使用以下保留字符来指定模式:
*
?
[
]
例子:
- 只下载 PNG 文件:
-A png
- 不要下载 CSS 文件:
-R css
- 不要下载以“avatar”开头的 PNG 文件:
-R avatar*.png
如果文件没有扩展名。文件名没有您可以使用的模式,我猜您需要 MIME 类型解析(请参阅拉尔斯·科特霍夫的回答)。
答案2
答案3
新的 Wget (Wget2) 已经具有以下功能:
--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 尚未发布,但很快就会发布。 Debian不稳定已经发布了alpha版本。
看着https://gitlab.com/gnuwget/wget2了解更多信息。您可以直接发布问题/意见[电子邮件受保护]。
答案4
我尝试过一种完全不同的方法是使用Scrapy,但它有同样的问题!我是这样解决的:所以:Python Scrapy - 基于 mimetype 的过滤器以避免非文本文件下载?
解决方案是设置一个代理并配置Scrapy通过环境变量
Node.js
使用它。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);