登录
注册
node.js 学习社区
中关村在线页面解析,node爬虫

卷卷儿

2014-12-17 21:03

最近要爬取一些商品的评价,然后做一些东西。
电子产品才中关村在线就有很多。
比如 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);
});

原文引自:http://cnodejs.org/topic/5162505c6d3827730691f423

回复 · 0

发表回复

你可以在回复中 @ 其他人