使用nodejs.以下是我的方法:
1.创建项目spider和初始化工程
cd spider
npm init
运行完成后出现package.json,是此项目的基本信息
2.创建http server服务使用http,操作文件系统使用fs,获取网页内容使用request,dom操作提取网页中的数据使用cheerio,其中http和fs作为内置包不需要安装
npm install cheerio –save
npm install request –save
--save将依赖写入package.json
3.我们可以在spider下创建data文件夹用来存储不同珠宝数据,创建spider文件进行爬虫操作
//依赖
var http = require('http');
var fs = require('fs');
var cheerio = require('cheerio');
var require = require('request');
var url = "http://www.XXXX.com/";
//封装
function fetchPage(url){
Request(url);
}
//请求网页内容和数据
function Request(url){
http.get(url,function(res){ //请求数据
var html = '';
res.setEncoding('utf-8');//编码设定,防止中文乱码
res.on('data',function(chunk){//有数据后进行传输拼接
html += chunk;
});
res.on('end',function(){//数据传输完成执行
var $ = cheerio.load(html);//提取页面内容
var zb_item = {
title:$('.left a').text()
};
$('.left a').each(function(index){
saveContent($,$(this).text().trim(),index);//存储内容及标题
})
}).on('error', function (err) {
console.log(err);
});
})
}
//将提取的数据写入data文件夹
function saveContent($, title,index) {
var x;
x = $('.gold_price_data tr').eq(index+1).find('td').text();
fs.writeFile('./data/' + title + '.txt', x, 'utf-8', function (err) {//写入文本
if (err) {
console.log(err);
}
})
}
fetchPage(url);
值得注意的两点:
(1)html += chunk;chunk是buffer对象,也是一个缓冲区,这里存在一个数据拼接,隐藏了toString()的转换,其实是html = html.toString() + trunk.toString();中文在utf-8的编码方式下占用3个字节,所以如果chunk不足以放下完整的一个宽字符的时候就有可能出现字符被截断的风险;
(2)对(1)的解决方法是设置编码方式:res.setEncoding('utf-8'),setEncoing之后可读流变得非常智能,如果遇到宽字符被截断的情况下,它在内部会暂存被截断的宽字符,等待下次事件触发,合并之前暂存的字符,这样就解决了乱码的问题。但是其处理编码方式有限,只能处理Base64/utf-8/utf-16LE/UCS-2。
启动:
cd spider
node spider.js
之后就可以在data中看到数据了