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中令你抓狂的魔术变量
Nov 30 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
javascript最常用与实用的创建类的代码
Aug 12 Javascript
flexigrid 参数说明
Nov 23 Javascript
非主流的textarea自增长实现js代码
Dec 20 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
两行代码轻松搞定JavaScript日期验证
Aug 03 Javascript
Angular中$cacheFactory的作用和用法实例详解
Aug 19 Javascript
Bootstrap和Java分页实例第一篇
Dec 23 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 Javascript
详解用node-images 打造简易图片服务器
May 08 Javascript
小程序实现层叠卡片滑动效果
Aug 26 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参数的详解
2013/06/17 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
thinkphp5+layui实现的分页样式示例
2019/10/08 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
Node.js模块加载详解
2014/08/16 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Vue 仿百度搜索功能实现代码
2017/02/16 Javascript
详解webpack进阶之loader篇
2017/08/23 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
生活部的活动方案
2014/08/19 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
个人自查自纠材料
2014/10/14 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
社区党建工作总结2015
2015/05/13 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
团队拓展训练感想
2015/08/07 职场文书
团结主题班会
2015/08/13 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
MySQL sql_mode修改不生效的原因及解决
2021/05/07 MySQL