1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

node.js 爬虫

Posted on 2013-04-07 11:16  1957  阅读(2091)  评论(0编辑  收藏  举报

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。