如何用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 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
JQuery 操作select标签实现代码
May 14 Javascript
window.dialogArguments 使用说明
Apr 11 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
JavaScript中自定义事件用法分析
Dec 23 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
Jan 27 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
javascript深拷贝和浅拷贝详解
Feb 14 Javascript
js异步编程小技巧详解
Aug 14 Javascript
浅谈React中的元素、组件、实例和节点
Feb 27 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
Apr 23 Javascript
js判断在哪个浏览器打开项目的方法
Jan 21 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
Get或Post提交值的非法数据处理
2006/10/09 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
2013/06/03 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
Firefox window.close()的使用注意事项
2009/04/11 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
Python简单日志处理类分享
2015/02/14 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
高中生职业生涯规划书
2014/02/24 职场文书
青奥会口号
2014/06/12 职场文书
药剂专业求职信
2014/06/20 职场文书
工地材料员岗位职责
2015/04/11 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python