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-TreeView父子联动效果保持节点状态一致
Aug 12 Javascript
有趣的JavaScript数组长度问题代码说明
Jan 20 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
Js 正则表达式知识汇总
Dec 02 Javascript
Node.js的包详细介绍
Jan 14 Javascript
对于jQuery性能的一些优化建议
Aug 13 Javascript
JavaScript制作简单的日历效果
Mar 10 Javascript
AngularJs Modules详解及示例代码
Sep 01 Javascript
详解Vue CLI3 多页应用实践和源码设计
Aug 30 Javascript
微信小程序实现选项卡效果
Nov 06 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
May 08 Javascript
微信小程序实现禁止分享代码实例
Oct 19 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入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
Angular 表单控件示例代码
2017/06/26 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
Python求导数的方法
2015/05/09 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
自荐信包含哪些内容
2013/10/30 职场文书
项目经理的岗位职责
2013/11/23 职场文书
护士自我评价范文
2014/01/25 职场文书
大学毕业生求职自荐信
2014/02/20 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
装修活动策划方案
2014/08/27 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
初二物理教学反思
2016/02/19 职场文书
导游词之广西漓江
2019/11/02 职场文书
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android
Golang 并发编程 SingleFlight模式
2022/04/26 Golang