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了,哥們');
     	})
     }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章