Sto raschiando il testo da vari negozi online (senza immagini / video o altri dati). Non sono esperto nel tracciamento degli utenti, quindi mi piacerebbe sapere se c'è un modo per me di scrivere il mio crawler in modo che non interferisca con il monitoraggio dei proprietari del negozio online. Forse questo è già il caso in quanto il crawler non sta memorizzando alcun cookie, richiedendo immagini o nient'altro che le pagine reali, ma mi piacerebbe esserne sicuro.
Che cosa dovrei fare quando richiedi le pagine per garantire che nulla venga monitorato in Google Analytics, ad esempio? Devo inviare una e-mail ai proprietari dicendo loro di filtrare uno specifico user-agent o ...?
Ho visto Come essere un buon cittadino durante la scansione di siti Web? dove l'ultima risposta afferma che si dovrebbe aggiungere "crawler" o "spider" nell'user-agent. Non sono sicuro di cosa fare in quanto non riesco a trovare nulla di cui eseguire il backup.
(Il crawler è scritto in node.js e utilizza il modulo di richiesta per scaricare siti web)
EDIT: Per chiunque sia interessato, ecco il crawler infinitamente semplice che ho realizzato. Non obbedisce a robots.txt perché sto specificando che tipo di link voglio seguire io stesso (e sono troppo pigro adesso per scrivere qualcosa che obbedisce a robots.txt):
var request = require("request")
, cheerio = require("cheerio")
;
exports.crawl = function(options) {
var links = [].concat(options.url) // Takes either an array of url's or just a string.
, ongoingRequests = 0
, index = 0
, done = false
;
process.nextTick(ticker);
function ticker() {
if(ongoingRequests < options.maxRequests && index < links.length && !done) {
var url = links[index++];
ongoingRequests++;
if(options.debug) console.log("Downloading " + url);
request({ url: url, encoding: options.encoding || "utf-8" }, function(err, response) {
ongoingRequests--;
if(err) {
return;
}
if(!done) {
var $ = cheerio.load(response.body)
, shouldContinue = options.data($, response, url)
;
if(shouldContinue === false) {
console.log("Crawler interrupted.");
options.done();
done = true;
}
var newLinks = options.extractLinks($).filter(function(url, i) { return links.indexOf(url, i + 1) === -1; });
if(options.debug && newLinks.length) console.log(newLinks);
links = links.concat(newLinks);
if((index - 1) % 5 === 0) console.log("Current index: " + (index - 1) + ", links found so far: " + links.length);
}
});
} else if(!ongoingRequests) {
if(!done) {
options.done();
done = true;
}
return;
}
process.nextTick(ticker);
}
};
Usalo in questo modo:
var crawler = require("../crawler");
crawler.crawl({
url: "http://website.com"
, debug: true
, maxRequests: 5
, data: function($, response, url) {
if(url.indexOf("/product/") === -1) {
return;
}
console.log("extract stuff from $ using CSS-selectors and a nice jQuery-like API");
}
, done: function() {
console.log("DONE!!");
}
, extractLinks: function($) {
return $("a").map(function() {
return $(this).attr("href");
}).filter(function(url, i, a) {
if(!url || url[0] !== "/") {
return false;
}
return i === a.indexOf(url) // Remove duplicates
&& url.indexOf("/cart") === -1
&& url.indexOf(".htm") > -1
;
}).map(function(url) {
return "http://website.com" + url;
});
}
});