node - async 抓取所有车系车型数据
2016-07-20 15:51
776 查看
node - async 抓取所有车系车型数据
之前自己用过node抓取数据,但是在没用async之前,老容易抓崩,或者出了问题不好找出来。现在改为同步执行。
代码写完测试OK就发了,没做修饰。见谅。
console的输出图如下
之前自己用过node抓取数据,但是在没用async之前,老容易抓崩,或者出了问题不好找出来。现在改为同步执行。
代码写完测试OK就发了,没做修饰。见谅。
/* * 作者@王杨 qq:357466524 * 本代码主要是自己尝试如何获取某站的数据,并非恶意所为。也仅仅作为技术分享,希望不要投入到商业中去。 * 分享 转发请保留作者。 */ var http = require('http'); //var cheerio = require('cheerio'); var BufferHelper = require('bufferhelper'); var iconv = require('iconv-lite'); //var mysql = require('mysql'); var async = require('async'); process.on('uncaughtException', function (err) { //打印出错误 console.log('global-e:',err); //打印出错误的调用栈方便调试 console.log('e-stack:', err.stack); }); //var connection = mysql.createConnection({ // host: 'localhost', // user: 'root', // password: '', // database: 'test' //}); //connection.connect(); var global_i = 0; get_html('http://i.che168.com/Handler/SaleCar/ScriptCarList_V1.ashx?needData=1', function (html) { eval(html); if (typeof fct == 'undefined' || fct['0'].length == 0) { return; } var gblist = '', blist = '', bletter = 'A'; var brandList = fct['0'].split(','); var brandName = '', brandId = '', brandZm = ''; var brandListArr = []; for (var i = 0; i < brandList.length; i = i + 2) { var _obj = {}; _obj.brandName = brandList[i + 1].substring(2); _obj.brandId = brandList[i]; _obj.brandZm = brandList[i + 1].substring(0, 1); brandListArr.push(_obj); //console.log(brandId, brandZm, brandName); } //brandListArr.shift(); //console.log(brandListArr); async.eachSeries(brandListArr, function (obj, callback) { if (typeof obj == 'undefined' || obj == null) { console.log('-------------------------1----------------------------'); callback(); return; } var get_class_html = 'http://i.che168.com/Handler/SaleCar/ScriptCarList_V1.ashx?seriesGroupType=2&needData=2&bid=' + obj.brandId; get_html(get_class_html, function (html) { eval(html); if (typeof br[obj.brandId] == 'undefined' || br[obj.brandId].length == 0) { return; } var slArray = br[obj.brandId].split(','); var gblist = '', blist = '', factoryname = '', seriessplit = ''; factoryname = slArray[1].split(' ')[0]; var factoryName = ''; var classListArr = []; for (var i = 0; i < slArray.length; i += 2) { var _obj = {}; seriessplit = slArray[i + 1].split(' '); factoryName = seriessplit[0]; _obj.factoryName = seriessplit[0]; seriessplit.shift(); _obj.classId = slArray[i]; _obj.className = seriessplit.join(' '); classListArr.push(_obj); } async.eachSeries(classListArr, function (cls, callback2) { get_html('http://i.che168.com/Handler/SaleCar/ScriptCarList_V1.ashx?seriesGroupType=2&needData=3&seriesid=' + cls.classId, function (html) { var spcArray = eval(html); for (var i = 0; i < spcArray.length; i++) { var year = spcArray[i].year; for (var j = 0; j < spcArray[i].spec.length; j++) { var modelName = spcArray[i].spec[j].name; var modelId = spcArray[i].spec[j].id; console.log(global_i++); console.log(obj.brandId, obj.brandZm, obj.brandName, cls.factoryName, cls.classId, cls.className, year, modelId, modelName); } } callback2(); }); }, function (err) { if (typeof err == 'undefined' || err == null) { callback(); } else { console.log('!get model error'); } }); }, function (err) { console.log('socked-err', err); callback(); }); }, function (err) { if (typeof err == 'undefined' || err == null) { console.log('finished'); } else { console.log('!get class error'); } }); return; }); //获取页面 function get_html(url, callback, errCallback) { http.get(url, function (res) { var bufferHelper = new BufferHelper(); var html = ''; res.on('data', function (chunk) { bufferHelper.concat(chunk); }); res.on('end', function () { //console.log(url.substr(-5)); html = iconv.decode(bufferHelper.toBuffer(), 'GBK'); //console.log(html); callback(html); }); }).on('error', function (e) { console.log('e1', e); errCallback(e); }); } // connection.end();
console的输出图如下
相关文章推荐
- 快速掌握Node.js环境的安装与运行方法
- Windows系统下Node.js的简单入门教程
- 在Node.js应用中使用Redis的方法简介
- 在Ubuntu系统上安装Ghost博客平台的教程
- Node.js编程中客户端Session的使用详解
- 使用Raygun对Node.js应用进行错误处理的方法
- 在Mac OS下使用Node.js的简单教程
- Node.js环境下编写爬虫爬取维基百科内容的实例分享
- node.js抓取并分析网页内容有无特殊内容的js文件
- 在Linux系统中搭建Node.js开发环境的简单步骤讲解
- 详解Node.js包的工程目录与NPM包管理器的使用
- 浅析Node在构建超媒体API中的作用
- 在Node.js中使用HTTP上传文件的方法
- Node.js的npm包管理器基础使用教程
- 举例讲解Node.js中的Writable对象
- 初步使用Node连接Mysql数据库
- Node调试工具JSHint的安装及配置教程
- Node.js本地文件操作之文件拷贝与目录遍历的方法
- Node.js服务器环境下使用Mock.js拦截AJAX请求的教程