Eu tentei uma abordagem totalmente diferente é usar o Scrapy, no entanto, ele tem o mesmo problema! Aqui está como eu o resolvi: SO: Python Scrapy - filtro baseado em mimetype para evitar downloads de arquivos que não sejam de texto?
A solução é configurar um Node.js
proxy e configurar o Scrapy para usá-lo através da http_proxy
variável de ambiente.
O que o proxy deve fazer é:
- Pegue solicitações HTTP do Scrapy e envie para o servidor que está sendo rastreado. Em seguida, retorna a resposta do Scrapy, ou seja, intercepta todo o tráfego HTTP.
- Para arquivos binários (com base em uma heurística que você implementa), ele envia um
403 Forbidden
erro para Scrapy e fecha imediatamente a solicitação / resposta. Isso ajuda a economizar tempo, tráfego e o Scrapy não falha.
Código Proxy de exemplo Isso 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);