如何用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 - HTML的request类
Jan 09 Javascript
js简单实现HTML标签Select联动带跳转
Oct 23 Javascript
jQuery中[attribute]选择器用法实例
Dec 31 Javascript
Angular2  NgModule 模块详解
Oct 19 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
Oct 11 Javascript
基于vue-cli、elementUI的Vue超简单入门小例子(推荐)
Apr 17 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
Jul 20 Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 Javascript
基于javascript实现碰撞检测
Mar 12 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
PHP生成数组再传给js的方法
2014/08/07 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
js 匿名调用实现代码
2009/06/19 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
python中遍历文件的3个方法
2014/09/02 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
法国奢华女性时尚配饰网上商店:Monnier Frères
2016/08/27 全球购物
佳能德国网上商店:Canon德国
2017/03/18 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
运动会广播稿400字
2014/01/25 职场文书
人事主管岗位职责
2014/01/30 职场文书
大学毕业感言50字
2014/02/07 职场文书
商务英语广告词大全
2014/03/18 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
对孩子的寄语
2014/04/09 职场文书
关于诚信的活动方案
2014/08/18 职场文书
2014年销售员工作总结
2014/12/01 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
Python趣味挑战之用pygame实现简单的金币旋转效果
2021/05/31 Python
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL