node写爬虫真的很不错,node天生异步,把这写异步的都省了。
前几天项目需要,求爬了点易迅网的评价。
先在http://item.51buy.com/item-{id}.html
上面获取物品名称,主要就是title
然后获取评价的分布 http://item.51buy.com/json.php?mod=review&act=getproperty&jsontype=str&pid=id
最后在http://item.51buy.com/json.php?mod=review&act=getreviews&jsontype=str&type=allreview&page=page&&pid=id获取该商品的评价
还有,就是在item页面,我们需要的只是title,而整个页面有6w多字节的样子,简直就是浪费嘛。
看看HTTP header里面有个Range参数,可以请求只读一段,那就大大的节约了带宽。
var options = {
host : 'item.51buy.com' ,
port : '80' ,
path : '/item-' + i + '.html' ,
headers : {'Range' : 'bytes=0-500'}
};
这样,就只要0-500这几个bytes
http.get(options , function(res){
// console.log(res.headers);
res.setEncoding('binary');
var data = '';
res.on('data' , function(d){
data += d;
});
res.on('end' , function(){
if(data.length > 0)
{
parse(data , i);
}
});
}).on('error' , function(err){
console.log(i+' ' +err);
});
获取tile后我们一步一步的来嘛。
都差不多的,主要就是用http.get...
然后写成cps的形式,因为Node是异步的-,-
不得不吐槽下,易讯有些页面是utf8编码有些又是gbk
很是蛋疼。
我只是简单的处理了下,先用gbk去解码,然后获取title的时候正则能匹配出来那么就是gbk了,
如果不是那么就换utf8,要是还不行,那我放弃这个页面。
转编码用了iconv-lite , 因为iconv在windows下面总是没编译过。
最后写入数据库就ok了。
其实node做爬虫真的很方便,还能解析JS。
by 1957
浙公网安备 33010602011771号