最近要爬取一些商品的评价,然后做一些东西。 电子产品才中关村在线就有很多。 比如 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);
});
今天刚好想写一个,这个更好
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");
我想问下,如果想遍历一个网站上的所有产品,那么需要怎么做?必须要知道这个网站的url的命名规则吗?像假如我要用爬虫遍历cnodejs的所有topic,查找其中的某个关键字的出现频率,怎么做才行?
我先说说我自己的想法,我觉得可能要从cnodejs的首页上查找到所有链接,然后翻下一页,再找,如此循环,但我觉得这方法有些笨拙,而且对于不同的信息源要写不同的代码,因为他们可能信息不同。各位有什么好方法吗?
爬虫来说,一般都要定义排行规则,也就是你所说的命名规则,一般都会有命名规则的,就像这帖子的连接是 http://cnodejs.org/topic/5162505c6d3827730691f423
那么你可以匹配http://cnodejs.org/topic/这部分,然后后面直接任意字符串那样。
@hexie 那么,是不是像9skb这样的网站,他定义了很多信息源(网站),然后为不同的信息源写了不同的爬取代码(一个个写),最后把资源整合在自己网站上?我总觉得这样好累啊…万一某个站点变更一个css,或者某个站点换个东西,你都要跟着改,如果你的信息源有10个,那么岂不是对每个变更都要做出响应