【发布时间】:2016-04-17 16:16:07
【问题描述】:
这个问题是关于 node.js 中的 URL 爬虫的。
在start_url URL 上,他查找链接并将它们“推送”到 .json 文件 (output.json)。
我如何确保他不会两次“推送”或“写入”域到 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是否已经存储。 -
为什么不在函数末尾清除 output.json 中的重复项?
-
@nicandris 为什么首先存储重复项?这个想法真的没有效率
-
@charlietfl 如果只有几百个链接,我看不出效率问题
-
@jfriend00:我也有同样的想法。可以举个例子吗?
标签: javascript json node.js web-crawler