如何用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 相关文章推荐
超级兔子让浮动层消失的前因后果
Mar 09 Javascript
Javascript valueOf 使用方法
Dec 28 Javascript
jquery下实现overlay遮罩层代码
Aug 25 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
Jan 10 Javascript
JavaScript中的getDay()方法使用详解
Jun 09 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
微信小程序 for 循环详解
Oct 09 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
vue计算属性和监听器实例解析
May 10 Javascript
vue实现井字棋游戏
Sep 29 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代码
2008/04/09 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
解析argc argv在php中的应用
2013/06/24 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php获取远程文件内容的函数
2015/11/02 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
PHP精确计算功能示例
2016/11/29 PHP
javascript转换字符串为dom对象(字符串动态创建dom)
2010/05/10 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python常用数据分析模块原理解析
2020/07/20 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
求职推荐信范文
2013/12/01 职场文书
求职自荐书范文
2013/12/04 职场文书
请假条的格式
2014/04/11 职场文书
学校学雷锋活动总结
2014/06/26 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
数据库之SQL技巧整理案例
2021/07/07 SQL Server
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python
Redis高并发缓存架构性能优化
2022/05/15 Redis