Tôi đã thử một cách tiếp cận hoàn toàn khác là sử dụng Scrapy, tuy nhiên nó có cùng một vấn đề! Đây là cách tôi giải quyết nó: SO: Python Scrapy - bộ lọc dựa trên mimetype để tránh tải xuống tệp không phải văn bản?
Giải pháp là thiết lập Node.js
proxy và cấu hình Scrapy để sử dụng nó thông qua http_proxy
biến môi trường.
Những gì proxy nên làm là:
- Nhận các yêu cầu HTTP từ Scrapy và gửi nó đến máy chủ đang được thu thập thông tin. Sau đó, nó trả lại phản hồi từ Scrapy tức là chặn tất cả lưu lượng HTTP.
- Đối với các tệp nhị phân (dựa trên một heuristic mà bạn triển khai), nó sẽ gửi
403 Forbidden
lỗi đến Scrapy và ngay lập tức đóng yêu cầu / phản hồi. Điều này giúp tiết kiệm thời gian, giao thông và Scrapy sẽ không gặp sự cố.
Mã Proxy mẫu thực sự hoạt động!
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);