Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 自定义节点Webcrawler_Node.js_Web Crawler - Fatal编程技术网

Node.js 自定义节点Webcrawler

Node.js 自定义节点Webcrawler,node.js,web-crawler,Node.js,Web Crawler,我正在尝试使用Node构建一个基本的webcrawler。我已经尝试了尽可能多的爬虫模块,我可以找到,但没有一个是适合我的工作,所以我想我会尝试推出自己的。基本上,我正在使用“request”模块,并递归地调用[请求]的“get”函数,用于我在页面上找到的每个链接 它似乎工作得很好,在100页之后,内存使用率仍然很低,但是在大约14页之后,我收到了一个节点警告,关于最大事件发射器和可能的内存泄漏 这是一个安全的方式去写一个网络爬虫?有什么我需要考虑的吗?有没有更好的办法 谢谢 更新:代码如下:

我正在尝试使用Node构建一个基本的webcrawler。我已经尝试了尽可能多的爬虫模块,我可以找到,但没有一个是适合我的工作,所以我想我会尝试推出自己的。基本上,我正在使用“request”模块,并递归地调用[请求]的“get”函数,用于我在页面上找到的每个链接

它似乎工作得很好,在100页之后,内存使用率仍然很低,但是在大约14页之后,我收到了一个节点警告,关于最大事件发射器和可能的内存泄漏

这是一个安全的方式去写一个网络爬虫?有什么我需要考虑的吗?有没有更好的办法

谢谢

更新:代码如下:

var request = require('request');
var $       = require('jquery');
var _       = require("underscore");
var S       = require('string');
var jsdom   = require('jsdom');

var startURL    = 'http://www.cnn.com/sitemap/';
var host        = 'http://www.cnn.com';
var blocked     = [];
var totalDepth  = 1;

var urls        = [];
var ignored     = [];
var results     = [];
var counter     = 0;

processURL(startURL,totalDepth);

function processURL(url,depth) {

    request(url, function (error, response, html) {

      if (!error && response.statusCode == 200) {

        var title = html.match("<title>(.*?)</title>");
            title=title ? title[1] : '';


        var myURL=url;
        myURL = myURL.split(',').join(' ');
        title = title.split(',').join(' ');
        displayURL = myURL.replace(host,'');
        results.push(myURL + ',' + title);
        counter++;

        if(results.length==100) {
            saveResults();
        }


        if(depth>0) {
            jsdom.env({
                html: html,
                scripts: ['http://code.jquery.com/jquery-1.7.min.js']
                }, function (err, window) {
                var $ = window.jQuery;
                if($!=undefined) {
                $('a').each(function() {
                    var href=$(this).attr('href');
                    href=fixURL(href);
                    if(checkURL(href)) {
                        addToQueue(href,depth-1);                       
                    } 
                })
              }
            });
        }
    }   
});
}

var int=setInterval(function(){checkExit()},10000);

function checkExit() {

    if(results.length==0) {
        process.exit();
    }

    saveResults();

}

function checkURL(url) {

    if(url==undefined) return false;
    if(url=='')  return false;
    if(url=='#') return false;
    if(url=='')  return false;
    if(url=='/') return false;
    if(S(url).startsWith('#')) return false;
    if(url.indexOf('javascript')==0) return false;

    if(url.indexOf("/")==0) {
        url=host+url;
    }

    if(_.contains(urls,url)) {        
        return false;
    }

    if(_.contains(ignored,url)) {        
        return false;
    }    

    $.each(blocked,function(i,d) {
        if(S(url).contains(d)) {
            ignored.push(url);
            return false;
        }
    })

    if(url.indexOf('http')==0) {
        if(S(url).startsWith(host)) {
            return true;
    }   else
            return false;
    }

    return true;                  
}

function addToQueue(url,depth) {

    if(_.contains(urls,url)) {        
        return false;
    }

    if(url.indexOf("/")==0) {
        url=host+url;
    }

    if(!validURL(url)) {
        return;
    }

    processURL(url,depth);
    urls.push(url); 

}

function saveResults() {
    var csv = '';
    $.each(results,function(i,d) {
        csv+=d + '\n';
    })
    writeData(csv);
    results = [];
}

function writeData(data) {
    var fs = require('fs');    
    fs.appendFile(__dirname+'/results.csv', data, function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log("******The file was saved!******");            
        }
    }); 
}

function validURL(value) {
    var urlregex = new RegExp("^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([0-9A-Za-z]+\.)");
    if (urlregex.test(value)) {
        return (true);
    }
    return (false);
}

function fixURL(url) {
    if(url==undefined) return '';
    if(url.indexOf("/")==0) {
        return host+url;
    } else {
        return url;
    }
}
var request=require('request');
var$=require('jquery');
var=要求(“下划线”);
var S=require('string');
var jsdom=require('jsdom');
var startURLhttp://www.cnn.com/sitemap/';
var主机http://www.cnn.com';
var阻塞=[];
var totalDepth=1;
var url=[];
忽略var=[];
var结果=[];
var计数器=0;
processURL(startURL,totalDepth);
函数processURL(url,深度){
请求(url、函数(错误、响应、html){
如果(!error&&response.statusCode==200){
var title=html.match((*?);
标题=标题?标题[1]:'';
var myURL=url;
myURL=myURL.split(',').join(“”);
title=title.split(',).join(“”);
displayURL=myURL.replace(主机“”);
结果.推送(myURL+','+标题);
计数器++;
if(results.length==100){
saveResults();
}
如果(深度>0){
jsdom.env({
html:html,
脚本:['http://code.jquery.com/jquery-1.7.min.js']
},函数(错误,窗口){
var$=window.jQuery;
如果($!=未定义){
$('a')。每个(函数(){
var href=$(this.attr('href');
href=fixURL(href);
如果(检查URL(href)){
addToQueue(href,depth-1);
} 
})
}
});
}
}   
});
}
var int=setInterval(函数(){checkExit()},10000);
函数checkExit(){
if(results.length==0){
process.exit();
}
saveResults();
}
函数检查url(url){
如果(url==未定义)返回false;
如果(url='')返回false;
如果(url='#')返回false;
如果(url='')返回false;
如果(url=='/')返回false;
if(S(url).startsWith('#')返回false;
if(url.indexOf('javascript')==0)返回false;
if(url.indexOf(“/”)==0){
url=主机+url;
}
如果(u.contains(url,url)){
返回false;
}
如果(u.contains(忽略,url)){
返回false;
}    
$。每个(阻塞,功能(i,d){
如果(S(url).包含(d)){
忽略。推送(url);
返回false;
}
})
if(url.indexOf('http')==0){
if(S(url).startsWith(主机)){
返回true;
}否则
返回false;
}
返回true;
}
函数addToQueue(url、深度){
if(uu.contains(url,url)){
返回false;
}
if(url.indexOf(“/”)==0){
url=主机+url;
}
如果(!validull(url)){
返回;
}
processURL(url,深度);
推送(url);
}
函数saveResults(){
var csv=“”;
$。每个(结果、功能(i、d){
csv+=d+'\n';
})
写入数据(csv);
结果=[];
}
函数writeData(数据){
var fs=需要('fs');
fs.appendFile(uu dirname+'/results.csv',数据,函数(err){
如果(错误){
控制台日志(err);
}否则{
console.log(“*******文件已保存!*******”);
}
}); 
}
函数validURL(值){
var urlregex=new RegExp(“^(http:\/\/www.| https:\/\/www.ftp:\/\/www.|www.){1}([0-9A-Za-z]+\)”;
if(urlregex.test(值)){
返回(真);
}
返回(假);
}
函数fixURL(url){
如果(url==未定义)返回“”;
if(url.indexOf(“/”)==0){
返回主机+url;
}否则{
返回url;
}
}

对于给定的事件发射器,您正达到节点非常保守/较低的阈值。最有可能的是,您的代码中有一个bug,您在同一个发射器中反复添加侦听器,以便重用它们。您需要发布您的代码,以便我们对其进行分析,但您可能有增加此值的正当需要,或者您错误地向同一发射器添加了冗余侦听器


您可能还想了解参数,但可能不想对其进行调整,因为这可能会将您的代码从行为良好的爬虫程序移动到令人讨厌的拒绝服务bot。

发布您当前的代码。我认为关于内存泄漏的更一般问题很有意思。您可能希望将问题集中在这里: