Nodejs爬虫实战(六)
1. 处理数据
- 上一步获取结果中含有
p
标签,用正则筛选,去掉标签,只留下文本。
var myHtml = document.querySelector('.read-content').innerHTML.replace(/<[^>]+>/g,'')
统计词的个数首先需要文本分词
分词模块
segment
(盘古分词组件),实例化,使用默认的识别模块及字典,载入字典文件需要1秒,仅初始化时执行一次即可let seg = new Segment(); seg.useDefault();
开始分词。
var arr = seg.doSegment(myHtml);
结果其中
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 } ]
去掉词性为
2048
的标点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]++; } });
去掉其中只出现一次的
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);
###### 完整代码
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了,哥们');
})
}
原文作者: 冯亚杰(DanBoard·Feng)
原文链接: http://danbo3110.github.io/2019/10/23/Nodejs爬虫实战(六)/
版权声明: 转载请注明出处(必须保留作者署名及链接)