如何用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 相关文章推荐
10个新的最有前途的JavaScript框架
Mar 12 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
javascript实现存储hmtl字符串示例
Apr 25 Javascript
使用ajax+jqtransform实现动态加载select
Dec 01 Javascript
使用javascript提交form表单方法汇总
Jun 25 Javascript
javascript实现手机震动API代码
Aug 05 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
Aug 11 Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 Javascript
Angular2入门教程之模块和组件详解
May 28 Javascript
JavaScript实现时间表动态效果
Jul 15 Javascript
Vue渲染函数详解
Sep 15 Javascript
Layer+Echarts构建弹出层折线图的方法
Sep 25 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
PHP中Date()时间日期函数的使用方法小结
2011/04/20 PHP
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
js+html获取系统当前时间
2017/11/10 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
python书籍信息爬虫实例
2018/03/19 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
详解python解压压缩包的五种方法
2019/07/05 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
国际贸易个人求职信范文
2014/01/04 职场文书
优秀团队获奖感言
2014/02/19 职场文书
家长通知书家长意见
2015/06/03 职场文书
2015双创工作总结
2015/07/24 职场文书
大学生安全教育心得体会
2016/01/15 职场文书
《梅花魂》教学反思
2016/02/18 职场文书