node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)


Posted in Javascript onApril 10, 2019

公司有过一个需求,需要拿一个网页的的表格数据,数据量达到30w左右;为了提高工作效率。

结合自身经验和网上资料。写了一套符合自己需求的nodejs爬虫工具。也许也会适合你的。

先上代码。在做讲解

'use strict';
// 引入模块
const superagent = require('superagent');
const cheerio = require('cheerio');
const Excel = require('exceljs');
var baseUrl = '';
var Cookies = 'PHPSESSID=1c948cafb361cb5dce87122846e649cd'; //伪装的cookie
let pageDatas = [];
let count = 1;
let limit = 3;
for (count; count < limit; count++) { 
  baseUrl = `http://bxjd.henoo.com/policy/policyList?page=${count}`;
  loadPage(baseUrl); 
}
function loadPage(baseUrl) { 
   getPageLoad(baseUrl);
} 
async function getPageLoad(baseUrl) {
  try {
    let body = await superagent.get(baseUrl)
      .set("Cookie", Cookies)
    var $ = cheerio.load(body.text);
    var trList = $("#tableList").children("tr");  
      for (var i = 0; i < trList.length; i++) { 
        let item = {};
        var tdArr = trList.eq(i).find("td");
        var id = tdArr.eq(0).text();
        item.sortId = id;
        var detailUrl = `http://bxjd.henoo.com/policy/view?id=${id}`;
        item.policyId = tdArr.eq(1).text();
        item.policyProductName = tdArr.eq(2).text();
        item.policyName = tdArr.eq(3).text();
        item.policyMoney = tdArr.eq(4).text();
        let detailBody = await superagent.get(detailUrl)
          .set("Cookie", Cookies);
        var $$ = cheerio.load(detailBody.text);
        var detailT = $$(".table-view");     
        //投保人证件号
        item.policyIdNum = detailT.find("tr").eq(11).find("td").eq(1).text();
        //投保人手机号
        item.policyPhone = detailT.find("tr").eq(10).find("td").eq(1).text();
        //被保人手机号
        item.bePoliciedPhone = detailT.find("tr").eq(16).find("td").eq(1).text();      
        //被保人姓名
        item.bePoliciedName = detailT.find("tr").eq(13).find("td").eq(1).text();
        console.log(item.bePoliciedName)
        //被保人证件号
        item.bePoliciedIdNum = detailT.find("tr").eq(17).find("td").eq(1).text();
        pageDatas = [...pageDatas,item];
      }
    if (pageDatas.length / 15 == (count - 1)) { 
      writeXLS(pageDatas)
    }
  } catch (error) {
  }
}
function writeXLS(pageDatas) {
  const workbook = new Excel.Workbook();
  const sheet = workbook.addWorksheet('My Sheet');
  const reColumns=[
    {header:'序号',key:'sortId'},
    {header:'投保单号',key:'policyId'},
    {header: '产品名称', key: 'policyProductName'},
    {header: '投保人姓名', key: 'policyName' },
    {header: '投保人手机号', key: 'policyPhone' },
    {header: '投保人证件号', key: 'policyIdNum'},
    {header: '被保人姓名', key: 'bePoliciedName' },
    {header: '被保人手机号', key: 'bePoliciedPhone' },
    {header: '被保人证件号', key: 'bePoliciedIdNum' },
    {header:'保费',key:'policyMoney'},
  ];
  sheet.columns = reColumns;
  for(let trData of pageDatas){
    sheet.addRow(trData);
  }
  const filename = './projects.xlsx';
  workbook.xlsx.writeFile(filename)
  .then(function() {
   console.log('ok');
  }).catch(function (error) { 
     console.error(error); 
  });
 }

代码使用方式

一、npm install 相关的依赖二、代码修改

1、修改为自己的baseUrl

2、如果不需要携带cookie时将set("Cookie", Cookies)代码去掉

3、修改自己的业务代码

三、运行 node index四、部分代码说明

所有代码不过90行不到,操作了表格数据获取和单条数据详情的获取

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

接口请求的框架使用superagent的原因是拼接伪装的cookie的操作比较简单。因为有的时候我们需要获取登录后的页面数据。

这个时候可能需要请求是携带登录cookie信息。返回后的body对象通过cheerio.load之后就能拿到一个类似jquery的文档对象。

后面就可以很方便的使用jquery的dom操作方式去拿到页面内自己想要的数据了。

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

数据写入到excel中。

五、结果

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)

总结

Javascript 相关文章推荐
javascript 防止刷新,后退,关闭
Aug 07 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
May 30 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 Javascript
原生js实现数字字母混合验证码的简单实例
Dec 10 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
小程序自定义组件实现城市选择功能
Jul 18 Javascript
vue中轮训器的使用
Jan 27 Javascript
vueScroll实现移动端下拉刷新、上拉加载
Mar 22 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
Oct 17 Javascript
JS实现压缩上传图片base64长度功能
Dec 03 Javascript
jQuery实现日历效果
Sep 11 jQuery
详解关于html,css,js三者的加载顺序问题
Apr 10 #Javascript
angular2 NgModel模块的具体使用方法
Apr 10 #Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 #Javascript
javascript判断一个变量是数组还是对象
Apr 10 #Javascript
Angular CLI 使用教程指南参考小结
Apr 10 #Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
Apr 10 #Javascript
element-ui多文件上传的实现示例
Apr 10 #Javascript
You might like
PHP合并数组+与array_merge的区别分析
2010/08/01 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
利用iscroll4实现轮播图效果实例代码
2017/01/11 Javascript
JS实现数组去重复值的方法示例
2017/02/18 Javascript
JS实现留言板功能
2017/06/17 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
Python实现股市信息下载的方法
2015/06/15 Python
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
写给老婆的检讨书
2014/02/21 职场文书
学生安全责任书
2014/04/15 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书