Comment télécharger un site Web complet, mais ignorer tous les fichiers binaires.
wget
a cette fonctionnalité utilisant le -r
Drapeau mais il télécharge tout et certains sites Web sont trop nombreux pour une machine à basse ressource et il n'est pas utile de la raison spécifique que je télécharge le site.
Voici la ligne de commande que j'utilise: wget -P 20 -r -l 0 http://www.omardo.com/blog
(mon propre blog)
J'ai essayé une approche totalement différente consiste à utiliser Scrapy, mais il a le même problème! Voici comment j'ai résolu ce problème: SO: Scapy Python - filtre à base de mimetype pour éviter les téléchargements de fichiers non texte?
La solution consiste à configurer un
Node.js
proxy et configurer le skérapie pour l'utiliser à travershttp_proxy
variable d'environnement.Ce que le proxy devrait faire est:
- Prenez des demandes HTTP de Scrapy et l'envoie au serveur étant rampé. Ensuite, cela redonne la réponse de Scrapy I.e. Intercepter tout le trafic HTTP.
- Pour les fichiers binaires (basé sur une heuristique que vous implémentez) il envoie
403 Forbidden
Une erreur de sien et immédiate ferme la demande/réponse. Cela aide à gagner du temps, la circulation et le skérapie ne se planteront pas.Exemple de code proxy qui fonctionne réellement!
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);