Nodejs爬虫实战(六)

1. 处理数据

  1. 上一步获取结果中含有p标签,用正则筛选,去掉标签,只留下文本。
    var myHtml = document.querySelector('.read-content').innerHTML.replace(/<[^>]+>/g,'')
  1. 统计词的个数首先需要文本分词
  1. 分词模块segment(盘古分词组件),实例化,使用默认的识别模块及字典,载入字典文件需要1秒,仅初始化时执行一次即可

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

     var arr = seg.doSegment(myHtml);
    
  3. 结果其中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 } ]
    
  4. 去掉词性为2048的标点

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

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

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

     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了,哥们');
        })
    }

文章目录