最近要爬取一些商品的评价,然后做一些东西。 电子产品才中关村在线就有很多。 比如 http://detail.zol.com.cn/332/331058/review.shtml
之前爬虫也一直在用node,不过只是存在数据库里面,用其他的程序来解析的。 这次想试试用node。如果有类似JQuery的东西就好了,一看还真有(node新手) 一个是jsdom,还有个是cheerio 都试试呗. 直接npm install jsdom 然后。。。然后。。。粗错了。。。 网上搜了下,终于装上了。 还有个cherrio, npm install cheerio 竟然没错。
那今天就先试试cheerio吧!
我需要的就是分析出商品评价,好评和差评要分开。 先看看cheerio怎么用把
var cheerio = require('cheerio'),
$ = cheerio.load('<h2>Hello world</h2>');
$('h2.title').text('Hello there!');
$('h2').addClass('welcome');
$.html();
//=> <h2>Hello there!</h2>
感觉很简单,确实和JQuery差不多(我也不是很懂JQuery) 分析下中关村在线的页面结构
<div class="comment_content">
<dl>
<dt class="good">优点</dt>
<dd>散热比较好不玩游戏不超过30度; 处理速度比较好大型游戏秒杀 屏幕较大看电影比较爽 有小数字键盘 电池能用3个小时 音质较好</dd>
</dl>
<dl>
<dt class="bad">缺点</dt>
<dd>重量偏重 画面显示质量一般情况 充电电源口和散热口太近不合理</dd>
</dl>
<dl>
<dt>总结</dt>
<dd>总体一切良好 推荐</dd>
</dl>
</div>
所有评价都是这个结构。所以嘛,接下来的事情就很简单啦。
$('.comment_content').each(function(){
console.log('good: '+$(this).children('dl').children('.good').next().text());
console.log('bad: '+$(this).children('dl').children('.bad').next().text());
});
完整的样例代码
var http = require('http');
var iconv = require('iconv-lite');
var cheerio = require('cheerio');
url = 'http://detail.zol.com.cn/332/331058/review.shtml'
function parseZOL(data)
{
//console.log(data);
var $ = cheerio.load(data);
//console.log($('.star_overview .nums').text());
$('.comment_content').each(function(){
console.log('good: '+$(this).children('dl').children('.good').next().text());
console.log('bad: '+$(this).children('dl').children('.bad').next().text());
});
}
http.get(url , function(res){
var stack = '';
res.setEncoding('binary');
res.on('data' , function(d){
stack += d;
}).on('error',function(err){
console.log(err.message);
});
res.on('end' , function(){
var buf = new Buffer(stack ,'binary');
var data = iconv.decode(buf , 'gbk');
parseZOL(data);
}).on('error',function(err){
console.log(err.message);
})
}).on('error', function(err){
console.log(err.message);
});