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 相关文章推荐
奇妙的js
Sep 24 Javascript
基于jQuery制作迷你背词汇工具
Jul 27 Javascript
Firefox和IE兼容性问题及解决方法总结
Oct 08 Javascript
Javascript 按位取反运算符 (~)
Feb 04 Javascript
引用其它js时如何同时处理多个window.onload事件
Sep 02 Javascript
javascript+css3 实现动态按钮菜单特效
Feb 06 Javascript
基于jQuery实现表格内容的筛选功能
Aug 21 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
关于微信小程序bug记录与解决方法
Aug 15 Javascript
vue组件间通信六种方式(总结篇)
May 15 Javascript
vue基本使用--refs获取组件或元素的实例
Nov 07 Javascript
用Node写一条配置环境的指令
Nov 14 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中使用curl_init函数的说明
2010/11/02 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
document.compatMode介绍
2009/05/21 Javascript
通过javascript把图片转化为字符画
2013/10/24 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
浅析node.js中close事件
2014/11/26 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
Python decimal模块使用方法详解
2020/06/08 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
介绍一下SQL Server的全文索引
2013/08/15 面试题
程序集与命名空间有什么不同
2014/07/25 面试题
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
军训考核自我鉴定
2014/02/13 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
师范大学生求职信
2014/06/13 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python