如何用Node写页面爬虫的工具集


Posted in Javascript onOctober 26, 2018

最近做了几个写爬虫的小项目(从页面端到APP端的都有),在网上搜寻了一番好用的爬虫工具,做了个工具集整理:

Puppeteer

简介

Puppeteer 是一个Node库,它提供了一个高级 API 来通过 DevTools协议控制Chromium或Chrome。简单点说,就是使用Node命令控制一个无需渲染至用户界面的浏览器。

与使用 PhantomJS 搭配 Python 进行爬虫抓取类似,其原理也是去完全地模拟一个浏览器进行页面的渲染,从而抓取其中某些特定的内容。

特性

Puppeteer 可以完整地模拟一个浏览器的行为,并且可以进行截图、拦截浏览器请求、获取Cookie、通过Node注入JS代码等操作,使用Chrome浏览器开发者工具能做到的,Puppeteer也能做到。

使用起来也十分的简单,以下是官方的例子:

const puppeteer = require('puppeteer');

(async () => {
 const browser = await puppeteer.launch();
 const page = await browser.newPage();
 await page.goto('https://example.com');
 await page.screenshot({path: 'example.png'});

 await browser.close();
})();

在GitHub上放了一份自己写的使用Puppeteer获取微博cookie的代码,欢迎查看:

https://github.com/SP-Lyu/puppeteer_weibo_cookie/blob/master/index.js

由于 Puppeteer 基于Chromium,每次都需要载入页面再进行页面分析,性能十分有限,下面提到的 cheerio 则可以从另一层面解决这个问题。

文档

GitHub 

中文API地址

cheerio

cheerio 是一个轻型灵活,类jQuery的对HTML元素分析操作的工具。在进行一些server端渲染的页面以及一些简单的小页面的爬取时, cheerio 十分好用且高效。

特性

cheerio 包括了jQuery的核心子集,意味着可以直接使用jQuery的API进行元素的操控,官方的例子:

const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')

$('h2.title').text('Hello there!')
$('h2').addClass('welcome')

$.html()
//=> <h2 class="title welcome">Hello there!</h2>

自己写的获取某个网站的所有a链接:

const cheerio = require('cheerio');
const get = function(){/*HTTP get请求...*/}
(async ()=>{
 const html = await get(`http://example.com`);
 const $ = cheerio.load(html);
 const $dom_arr = $('a');
 $dom_arr.each((index, elem)=>{
  const url = $(elem).attr('href') || '';
  console.log(url);
 });
})();

文档

GitHub

Auto.js

国人开发的,使用js编写代码操作Android设备的自动化工具,对于爬取某些加固措施较好的APP来说十分有用,而且有非常完善的文档以及社区,十分良心。

使用Auto.js进行设备自动化操作,再通过代理进行请求数据的获取,能绕开加固中难以破解的加密串。

特性

作为爬虫工具,好处有:

  1. 采用JavaScript作为脚本语言开发,JS开发者0成本接入;
  2. 兼容性良好,大多数任务不需要root权限;
  3. 自带界面分析工具,方便定位需要操作的元素。

从Auto.js载入某个APP,并点击进入某个频道的例子:

// 声明环境
auto();
// 设备常亮
device.keepScreenDim();
// 调起APP
launchApp('头条');
sleep(10000);
// 找到某个频道,并点击进入
var rect = text('视频').findOnce().bounds();
var x = rect.centerX();
var y = rect.centerY();
click(x, y);
// 点击进入详情,使用代理抓取并处理请求...
...

文档

GitHub
中文文档
社区

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript实现轮显新闻标题链接
Aug 13 Javascript
JavaScript的变量作用域深入理解
Oct 25 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
Sep 12 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
Apr 30 Javascript
Javascript之面向对象--方法
Dec 02 Javascript
jQuery 选择符详细介绍及整理
Dec 02 Javascript
Vue.js2.0中的变化小结
Oct 24 Javascript
JavaScript实现的超简单计算器功能示例
Dec 23 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
微信小程序实现提交input信息到后台的方法示例
Jan 19 Javascript
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
一篇文章了解正则表达式的替换技巧
Feb 24 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 #Javascript
使用webpack打包后的vue项目如何正确运行(express)
Oct 26 #Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 #jQuery
详解ES6 系列之异步处理实战
Oct 26 #Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
Oct 26 #Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 #Javascript
js使用formData实现批量上传
Mar 27 #Javascript
You might like
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
JavaScript取得键盘按下方向键是哪个的方法
2015/08/04 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
详解webpack引入第三方库的方式以及注意事项
2019/01/15 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
[01:02:45]完美世界DOTA2联赛 LBZS vs Forest 第三场 11.07
2020/11/09 DOTA
Python编程之变量赋值操作实例分析
2017/07/24 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python celery原理及运行流程解析
2020/06/13 Python
Keras设置以及获取权重的实现
2020/06/19 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
英文商务邀请函范文
2015/01/31 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
2015大学迎新标语
2015/07/16 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫
JavaScript实现音乐播放器
2022/08/14 Javascript