node.js抓取并分析网页内容有无特殊内容的js文件
nodejs获取网页内容绑定data事件,获取到的数据会分几次相应,如果想全局内容匹配,需要等待请求结束,在end结束事件里把累积起来的全局数据进行操作!
举个例子,比如要在页面中找有没有www.baidu.com,不多说了,直接放代码:
//引入模块 varhttp=require("http"), fs=require('fs'), url=require('url'); //写入文件,把结果写入不同的文件 varwriteRes=function(p,r){ fs.appendFile(p,r,function(err){ if(err) console.log(err); else console.log(r); }); }, //发请求,并验证内容,把结果写入文件 postHttp=function(arr,num){ console.log('第'+num+"条!") vara=arr[num].split("-"); if(!a[0]||!a[1]){ return; } varaddress=url.parse(a[1]), options={ host:address.host, path:address.path, hostname:address.hostname, method:'GET', headers:{ 'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/38.0.2125.122Safari/537.36' } } varreq=http.request(options,function(res){ if(res.statusCode==200){ res.setEncoding('UTF-8'); vardata=''; res.on('data',function(rd){ data+=rd; }); res.on('end',function(q){ if(!~data.indexOf("www.baidu.com")){ returnwriteRes('./no2.txt',a[0]+'--'+a[1]+'\n'); }else{ returnwriteRes('./has2.txt',a[0]+'--'+a[1]+"\n"); } }) }else{ writeRes('./error2.txt',a[0]+'--'+a[1]+'--'+res.statusCode+'\n'); } }); req.on('error',function(e){ writeRes('./error2.txt',a[0]+'--'+a[1]+'--'+e+'\n'); }) req.end(); }, //读取文件,获取需要抓取的页面 openFile=function(path,coding){ fs.readFile(path,coding,function(err,data){ varres=data.split("\n"); for(vari=0,rl=res.length;i<rl;i++){ if(!res[i]) continue; postHttp(res,i); }; }) }; openFile('./sites.log','utf-8');
上面代码大家可以看的懂吧,有哪里不清楚的朋友欢迎给我留言,具体的还要靠大家发挥应用到实践当中。
下面给大家介绍Nodejs对于网页抓取的能力
首先PHP。先说优势:网上抓取和解析html的框架一抓一大把,各种工具直接拿来用就行了,比较省心。缺点:首先速度/效率很成问题,有一次下载电影海报的时候,由于是crontab定期执行,也没做优化,开的php进程太多,直接把内存撑爆了。然后语法方面也很拖沓,各种关键字符号太多,不够简洁,给人一种没有认真设计过的感觉,写起来很麻烦。
Node.js。优点是效率、效率还是效率,由于网络是异步的,所以基本如同几百个进程并发一样强大,内存和CPU占用非常小,如果没有对抓取来的数据进行复杂的运算加工,那么系统的瓶颈基本就在带宽和写入MySQL等数据库的I/O速度。当然,优点的反面也是缺点,异步网络代表你需要callback,这时候如果业务需求是线性了,比如必须等待上一个页面抓取完成后,拿到数据,才能进行下一个页面的抓取,甚至多层的依赖关系,那就会出现可怕的多层callback!基本这时候,代码结构和逻辑就会一团乱麻。当然可以用Step等流程控制工具解决这些问题。
最后说Python。如果你对效率没有极端的要求,那么推荐用Python!首先,Python的语法很简洁,同样的语句,可以少敲很多次键盘。然后,Python非常适合做数据的处理,比如函数参数的打包解包,列表解析,矩阵处理,非常方便。