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。