這個問題是關於node.js中的URL爬蟲。 在start_url
URL中,他查找鏈接並將它們「推送」到.json文件(output.json)。如何在不重複的情況下在node.js流中寫入數據?
我怎樣才能確保他不會「推」或「寫」域兩次output.json(以便我不重複)?我一直在使用散列函數,但是這導致了問題。
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var start_url = ["http://blog.codinghorror.com/"]
var wstream = fs.createWriteStream("output.json");
// Extract root domain name from string
function extractDomain(url) {
var domain;
if (url.indexOf("://") > -1) { //find & remove protocol (http(s), ftp, etc.) and get domain
domain = url.split('/')[2];
} else {
domain = url.split('/')[0];
}
domain = domain.split(':')[0]; //find & remove port number
return domain;
}
var req = function(url){
request(url, function(error, response, html){
if(!error){
var $ = cheerio.load(html);
$("a").each(function() {
var link = $(this).attr("href");
var makelinkplain = extractDomain(link);
start_url.push("http://" + makelinkplain);
wstream.write('"http://'+ makelinkplain + '",');
});
}
start_url.shift();
if(start_url.length > 0) {
return req(start_url[0]);
}
wstream.end();
});
}
req(start_url[0]);
您可以將每個域存儲在'Set'對象中,然後在您寫入新對象之前只檢查'Set'來查看它是否已經存儲。 – jfriend00
爲什麼不在函數的最後清除output.json中的重複項? – nicandris
@nicandris爲什麼要在第一個地方存儲重複?那個想法真的效率不高 – charlietfl