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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
js 无提示关闭浏览器页面的代码
Mar 09 Javascript
javascript之querySelector和querySelectorAll使用介绍
Dec 20 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
JS实现简易图片轮播效果的方法
Mar 25 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
jQuery中的100个技巧汇总
Dec 15 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
详解webpack分包及异步加载套路
Jun 29 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 Javascript
JavaScript原型链详解
Nov 07 Javascript
JavaScript实现外溢动态爱心的效果的示例代码
Mar 21 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/12/30 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
PHP文件与目录操作示例
2016/12/24 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
使用PDB简单调试Python程序简明指南
2015/04/25 Python
简析Python的闭包和装饰器
2016/02/26 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python实现图片九宫格分割
2021/03/07 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
期末学生评语大全
2014/04/24 职场文书
给领导的感谢信范文
2015/01/23 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
学校体育节班级口号
2015/12/25 职场文书
python文件目录操作之os模块
2021/05/08 Python