中关村在线页面解析,node爬虫
发布于 2年前 作者 x1957 2404 次浏览

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

今天刚好想写一个,这个更好

var crawler = require('crawler').Crawler;

var c =  new crawler({
    "maxConnections": 10,
    "forceUTF8": true,
    "callback": function(err,result,$) {
        $('.comment_content').each(function(){
        console.log('good: '+$(this).children('dl').children('.good').next().text());
        console.log('bad: '+$(this).children('dl').children('.bad').next().text());
    });
    }
});

c.queue("http://detail.zol.com.cn/332/331058/review.shtml");

= =初学,还不知道有这个东西!谢谢指点!

$ undefined 是哪里不对么?我用官方的sample试了下

我想问下,如果想遍历一个网站上的所有产品,那么需要怎么做?必须要知道这个网站的url的命名规则吗?像假如我要用爬虫遍历cnodejs的所有topic,查找其中的某个关键字的出现频率,怎么做才行?

我先说说我自己的想法,我觉得可能要从cnodejs的首页上查找到所有链接,然后翻下一页,再找,如此循环,但我觉得这方法有些笨拙,而且对于不同的信息源要写不同的代码,因为他们可能信息不同。各位有什么好方法吗?

爬虫来说,一般都要定义排行规则,也就是你所说的命名规则,一般都会有命名规则的,就像这帖子的连接是 http://cnodejs.org/topic/5162505c6d3827730691f423

那么你可以匹配http://cnodejs.org/topic/这部分,然后后面直接任意字符串那样。

你说的应该就是做一个垂直的爬虫吧,我觉得肯定要定义规则才行吧。

@hexie 那么,是不是像9skb这样的网站,他定义了很多信息源(网站),然后为不同的信息源写了不同的爬取代码(一个个写),最后把资源整合在自己网站上?我总觉得这样好累啊…万一某个站点变更一个css,或者某个站点换个东西,你都要跟着改,如果你的信息源有10个,那么岂不是对每个变更都要做出响应

@x1957 你说到了垂直的爬虫,是不是还有横向的爬虫?可否简单介绍一下

@cony138 其实我觉得爬虫的功能应该就只是把网页内容抓下来存着,处理是另外的程序来做。我也不知道垂直爬虫这个定义是否有,爬取特定网页的爬虫就是垂直的吧(逃。。。

回到顶部