Nodejs爬虫实战(六)

1. 处理数据
  1. 上一步获取结果中含有p标签,用正则筛选,去掉标签,只留下文本。

     var myHtml = document.querySelector('.read-content').innerHTML.replace(/<[^>]+>/g,'')
    
  2. 统计词的个数首先需要文本分词

  3. 分词模块segment(盘古分词组件),实例化,使用默认的识别模块及字典,载入字典文件需要1秒,仅初始化时执行一次即可

     let seg = new Segment();
     seg.useDefault();
    
  4. 开始分词。

     var arr = seg.doSegment(myHtml);
    
  5. 结果其中w表示内容,p表示词性,词性收录

     [ { w: '这是', p: 0 },
       { w: '一个', p: 2097152 },
       { w: '基于', p: 262144 },
       { w: 'Node.js', p: 8 },
       { w: '的', p: 8192 },
       { w: '中文', p: 1048576 },
       { w: '分词', p: 4096 },
       { w: '模块', p: 1048576 },
       { w: '。', p: 2048 } ]
    
  6. 去掉词性为2048的标点

     var myarr = [];
    
     arr.forEach(data=>{
     	if(data.p !=2048){
     		myarr.push(data.w)
     	}
     });
    
  7. JSON格式统计词内容

     var myJson = {};
     myarr.forEach(data=>{
     	if(!myJson[data]){
     		myJson[data] = 1;
     	}
     	else{
     		myJson[data]++;
     	}
     });
    
  8. 去掉其中只出现一次的

     let arr2 = [];
     for(let word in myJson){
     	if(myJson[word]<=1){
     		continue;
     	}
     	arr2.push({
     		w:word,
     		c:myJson[word]
     	})
     };
    
  9. 结果排序

     arr2.sort((json1,json2)=>json2.c-json1.c);
    
    完整代码
     var index = 0;
     const fs = require('fs');
     const url = require('url');
     const gbk = require('gbk');
     const JSDOM = require('jsdom').JSDOM;
     const Segment = require('segment');
     let seg = new Segment();
     seg.useDefault();
     
     GetUrl('https://www.xs8.cn/chapter/7373911103301701/19794192502339694',(data)=>{
     	let DOM = new JSDOM(data);
     	let document = DOM.window.document;
     
     	var myHtml = document.querySelector('.read-content').innerHTML.replace(/<[^>]+>/g,'')
     	var arr = seg.doSegment(myHtml);
     	//去掉没用的
     	var myarr = [];
     	arr.forEach(data=>{
     		if(data.p !=2048){
     			myarr.push(data.w)
     		}
     	});
     	//计算个数,存为json格式
     	var myJson = {};
     	myarr.forEach(data=>{
     		if(!myJson[data]){
     			myJson[data] = 1;
     		}
     		else{
     			myJson[data]++;
     		}
     	});
     	//去掉只出现1次的 
     	let arr2 = [];
     	for(let word in myJson){
     		if(myJson[word]<=1){
     			continue;
     		}
     		arr2.push({
     			w:word,
     			c:myJson[word]
     		})
     	};
     	arr2.sort((json1,json2)=>json2.c-json1.c);
     	console.log(arr2);
     })
     function GetUrl(sUrl,success){
     	index++;
     	var urlObj = url.parse(sUrl);
     	var http ='';
     	if(urlObj.protocol == 'http:'){
     		http = require('http');
     	}
     	else{
     		http = require('https');
     	}
     
     	let req = http.request({
     		'hostname':urlObj.hostname,
     		'path':urlObj.path
     	},res=>{
     		if(res.statusCode == 200){
     			var str = '';
     			res.on('data',buffer=>{
     				str +=buffer;
     			});
     			res.on('end',()=>{	
     				success && success(str);
     			})
     		}
     		else if(res.statusCode == 302 || res.statusCode == 301){
     			console.log(`第${index}次重定向`,res.headers.location);
     			GetUrl(res.headers.location,success)
     		}
     	});
     	req.end();
     	req.on('error',()=>{
     		console.log('404了,哥们');
     	})
     }
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值