公司项目涉及到珠宝价格, 网上找了一些接口都是要钱的, 想了一下就做了个爬虫, 把别人网站上的价格爬下来, 使用 Node.JS. 以下是我的方法:
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 中看到数据了
来源: http://www.qdfuns.com/article/42497/96fa450ebfd5c39789aa77645c72d3fe.html