文档章节

使用Puppeteer撸一个爬虫

小草先森
 小草先森
发布于 06/20 23:47
字数 1273
阅读 171
收藏 2

Puppeteer是什么

puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏览器是指没有窗口的浏览器。

Puppeteer能做什么

使用puppeteer我们可以让浏览器帮我们自动完成很多事情,比如创建页面的截图或pdf,自动提交表单,UI测试,键盘测试,创建自动化测试环境等。

安装Puppeteer

通过 npm install puppeteer 或者 yarn add puppeteer来安装

注意事项

因为用到了es7的async/await语法进行异步处理。所以node版本最好是v7.6.0或以上。

爬虫实例

对puppeteer有些简单认识之后,我们来做一个爬虫实例加深对puppeteer的印象!

目标网站

如上图所示,我们这次的爬取目标是豆瓣电影网分类区按时间排序,评分6-10分的电影信息。最终获取到的数据是每部电影的海报图片,电影名称,评分以及它的id。

代码分析

1,页面中引入puppeteer包

2,声明爬取页面的url

3, 声明一个基于promise的定时器,后续代码中将会用到。

创建一个立即执行的async 方法,后续代码全部书写在async方法中。

通过puppeteer.launch()方法创建一个无头浏览器chrome对象browser。

通过browser.newPage()方法创建一个页面对象page。该page对象大家可以理解成我们日常打开浏览器之后新建的一个标签页,在该标签页中访问站点。

使用page.goto()访问我们要爬取的站点,第一个参数为爬取站点的url,第二个参数options具体信息大家可查询puppeteer文档,这里使用的waitUntil: 'networkidle2'参数指:当至少500ms内不超过两个网络请求时判断页面请求完成(请原谅我这蹩脚的翻译)具体请看文档中该部分说明:

这里为了确保浏览器请求结束,我们延迟3s再做后续操作。

 

目标页面中通过点击加载更多按钮进行数据异步获取,这里我们需要通过page对象模拟点击操作来显示两页数据,让我们一次能爬取更多的电影信息。

通过page.waitForSelector()方法等待我们需要的dom元素页面中显示出来。通过审查元素我们可以看到在加载更多按钮上声明了more这一class,所以我们要等待的元素用css选择器表示就是'.more',正如上图中的30行代码所示。

随后我们通过循环来控制我们点击加载更多按钮的次数,这里我们这需要模拟点击一次来获取两页数据,若想获取更多数据,可通过修改循环次数来实现。

循环中使用sleep()定时器是为了确保按钮真正的出现在了页面当中做的延迟操作。随后通过page.click('.more')来模拟加载更多按钮点击。

当页面中显示足够我们需要的数据时,接下来我们要做的就是获取这些数据。puppeteer为我们提供了page.evaluate()方法实现在该page页面中执行一段我们自己定义的脚本功能,其中的回调函数则是我们欲执行的代码。

我们可以思考一下,假若我们可以在一个html中插入一段js脚本去获取html中的数据。我们可以通过js原生或jquery去获取相应的dom元素,然后通过dom元素的属性,文本,或者img的src拿到我们想要的信息。首先我们来判断一下该页面中是否引入了jQuery库,如果已引入,我们则可以通过jQuery去操作dom获取数据。

在控制台打印jQuery对象,查看打印结果

通过返回值可以确定该页面是引入了jquery库的,我们可以大胆使用jquery去操作dom

如上面代码截图,我们先var 一个$ 符号接收页面中的jquery对象,然后通过jquery选择器去获取电影图片,名称,评分所在的dom对象。最后通过遍历这些dom对象将我们需要的数据存放到数组links中,完成我们的爬取工作。

最后我们关闭浏览器对象browser并打印我们爬取的数据,检查我们爬虫代码是否成功爬取到电影信息。

ok,控制台成功打印出了我们爬取的电影信息!

© 著作权归作者所有

共有 人打赏支持
小草先森
粉丝 14
博文 44
码字总数 32152
作品 0
武汉
私信 提问
我常用的puppeteer爬虫api

本文共1451字,阅读时间约4分钟 Puppeteer是Chrome团队出的nodejs库(无头浏览器),其中一个功能是网页抓取(可以作为爬虫使用) 详细介绍请看gayhub,更新周期大约是一个月,本文是基于 v1...

aloha66
05/25
0
0
手把手教你用node撸一个简易的handless爬虫cli工具

众所周知,node功能很强大,为前端提供了更多的可能。今天,就跟大家分享一下我是如何用node写一个handless爬虫的。原文链接leeing.site/2018/10/17/… 用到的工具 puppeteer commander inqu...

leeing
10/18
0
0
函数计算中使用 puppeteer.js

puppeteer.js github 地址:https://github.com/GoogleChrome/puppeteer API: https://github.com/GoogleChrome/puppeteer/blob/v1.4.0/docs/api.md 函数计算文档:https://help.aliyun.com......

木香丘
06/12
0
0
前端使用puppeteer 爬虫生成《React.js 小书》PDF并合并

1、 是什么? : 官方出品的 库 仓库 官方介绍: 您可以在浏览器中手动执行的大多数操作都可以使用完成! 生成页面的屏幕截图和。 抓取并生成预渲染内容(即“”)。 自动化表单提交,测试,键...

轩辕Rowboat
08/30
0
0
puppeteer入门及实践(1)

前面写过的phantomJs,研究几天后发现phantomJs虽然在业内有一定的影响力,但后继乏力,主要还是缺乏维护人员,导致项目依赖的chrome内核版本太低,无人解决的BUG太多(1000+),现在这个环境...

子非鱼_fish
06/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
25分钟前
1
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
25分钟前
0
0
Python的安装及文件类型、变量

一、为什么学习python 服务于大数据、人工智能、自动化运维。 简单易学 代码简洁 薪资高 近几年越来越火 二、Python的安装 linux 系统默认安装, CentOS7 默认安装了python2.7 安装ipython y...

枫叶云
33分钟前
0
0
JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
39分钟前
21
0
0022-如何永久删除Kafka的Topic

1.问题描述 使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新创建相同名称的Topic时报错“already exists”。 2.问题复现...

Hadoop实操
42分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部