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 相关文章推荐
驱动事件的addEvent.js代码
Mar 27 Javascript
HTML中事件触发列表与解说
Jul 09 Javascript
广泛收集的jQuery拖放插件集合
Apr 09 Javascript
微信中一些常用的js方法汇总
Mar 12 Javascript
jQuery网页定位导航特效实现方法
Dec 19 Javascript
基于jquery实现二级联动效果
Mar 30 jQuery
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
Oct 08 Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 Javascript
微信小程序实现canvas分享朋友圈海报
Jun 21 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 Javascript
JavaScript 如何在浏览器中使用摄像头
Dec 02 Javascript
详解关于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程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
JavaScript 序列化对象实现代码
2009/12/18 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
Python Web框架Tornado运行和部署
2020/10/19 Python
Python中存取文件的4种不同操作
2018/07/02 Python
python实现键盘控制鼠标移动
2020/11/27 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
为什么说Python可以实现所有的算法
2019/10/04 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
2020/03/13 Python
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
学院书画协会部门岗位职责
2013/12/01 职场文书
大学生秋游活动方案
2014/02/17 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
2014年食堂工作总结
2014/11/20 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
导游词300字
2015/02/13 职场文书
运输公司工作总结
2015/08/11 职场文书
使用GO语言实现Mysql数据库CURD的简单示例
2021/08/07 Golang
MySQL日期时间函数知识汇总
2022/03/17 MySQL