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 相关文章推荐
学习jquery之一
Apr 27 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
May 21 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
Aug 02 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
Jul 22 Javascript
概述如何实现一个简单的浏览器端js模块加载器
Dec 07 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 Javascript
AngualrJs清除定时器遇到的坑
Oct 13 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
Mar 12 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
Oct 25 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
Aug 21 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
JS实现购物车特效
2017/02/02 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
2017/09/01 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
Python yield与实现方法代码分析
2018/02/06 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
大学生入党自我鉴定
2013/10/31 职场文书
关爱老人标语
2014/06/21 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
工作年限证明模板
2015/06/15 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
如何利用React实现图片识别App
2022/02/18 Javascript
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
Python内置的数据类型及使用方法
2022/04/13 Python
Java Spring读取和存储详细操作
2022/08/05 Java/Android