使用Puppeteer进行数据抓取(二)——Page对象
page对象是puppeteer最常用的对象,它可以认为是chrome的一个tab页,主要的页面操作都是通过它进行的。Google的官方文档详细介绍了page对象的使用,这里我只是简单的小结一下。
客户端模拟
页面模拟设置相关函数有如下几个,
- page.setViewport: 设置视图大小
- page.setUserAget: 设置UserAgent
- page.SetCookie: 设置Cookie
另外,也可以使用emulate函数提供快捷设置,puppeteer/DeviceDescriptors还提供了常用设备的预设
const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');|
const iPhone = devices['iPhone 6'];
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.emulate(iPhone);
await page.goto('https://www.google.com');
// other actions...
await browser.close();
});
除此之外,还可以使用page.setExtraHTTPHeaders设置其它HttpHeader
页面跳转
页面跳转相关函数有如下几个,
- page.goto(url, options)
- page.goBack(options)
- page.goForward(options)
- page.reload(options)
其中比较常用的是page.goto,相当于在浏览器中输入了地址,然后回车。此外,也可以同通过执行js跳转和模拟点击link跳转。
选择
常用的元素函数选择有:
- page.$(selector)
- page.$$(selector)
它们的功能类似于document.querySelector和document.querySelectorAll。
它们返回的对象是<Promise<?ElementHandle>>,可以用它判断某元素是否存在,也可以对ElementHandle执行相应操作,具体在后面的ElementHandle中介绍。
另外,还有一个使用xpath的select版本。
- page.$x(expression)
虽然这个用的相对少点,但也还是非常有用的。
模拟输入
page本身提供原始的mouse和keyboard的模拟输入类。
但同时也提供更方便快捷的模拟输入函数
- page.click(selector[, options]) 在被选择元素上模拟点击
- page.type(selector, text[, options]) 在被选择的输入框中输入
- page.hover(selector) 模拟鼠标移动到被选择元素上
- page.select(selector, ...values) 在被选择元素上模拟选择select选项
- page.tap(selector) 在被选择元素上模拟触摸
等待
当我们使用page.goto等跳转函数主动跳转页面时,本身该函数就是可以异步等待的,可以直接使用await等待跳转完成。
除此之外,系统也提供了如下等待函数
- page.waitForNavigation(options)
- page.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
- page.waitForSelector(selector[, options])
- page.waitForXPath(xpath[, options])
- page.waitForFunction(pageFunction[, options[, ...args]])
其中最常用的是page.waitForNavigation,常用于等待跳转结束,例如点击搜索按钮后,等待跳转至搜索结果页面。
const navigationPromise = page.waitForNavigation();
await page.click('a.my-link');
await navigationPromise;
另外,我们如果需要更细粒度的等待,可以使用其它几个wait函数,如如果我们要等待某图片的第一次加载。
执行脚本
执行脚本最常用的函数是page.evaluate,它类似于在控制台中执行指令。
console.log(await page.evaluate('1 + 2'));
var title = await
page.evaluate('document.title')
它也可以用来执行写好的node函数,实际上该函数是在浏览器中执行的,但可以像本地函数一样编写,还支持参数传值。
var title = await page.evaluate(async (i) => {
return document.title + ' ' + i;
}, 'hello');
console.log(title);
虽然这node函数不能调试,但仍然是有非常大的好处的,
- 不用考虑字符串转义的问题,书写起来非常直接
- 脚本在IDE中有高亮显示和智能提示的,写起来更加方便
另外,还有几个其它的执行脚本的函数,应用于不同的场合,也是非常有用的。
- page.evaluateHandle(pageFunction, ...args)
- page.evaluateOnNewDocument(pageFunction, ...args)
- page.$$eval(selector, pageFunction[, ...args])
- page.$eval(selector, pageFunction[, ...args])
例如:
const searchValue = await page.$eval('#search', el => el.value);
const preloadHref = await page.$eval('link[rel=preload]', el => el.href);
const html = await page.$eval('.main-container', e => e.outerHTML);
信息查看
puppeteer提供了一些查看页面信息的函数,
- page.url()
- page.content()
- page.frames()
- page.mainFrame()
- page.metrics()
- page.target()
- page.title()
- page.viewport()
请求中断
page.setRequestInterception提供了中断请求的机制,例如,我们可以通过它实现一个无图模式。
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
interceptedRequest.abort();
else
interceptedRequest.continue();
});
await page.goto('https://example.com');
这里有一个interceptedRequest对象,它提供了三种响应模式:abort、continue和respond。
内容注入
内容保存主要包括注入javascript和style,都是非常有用的函数。
事件
puppteer提供了一系列事件的通知:
close |
frameattached |
pageerror |
console |
framedetached |
request |
dialog |
framenavigated |
requestfailed |
domcontentloaded |
load |
requestfinished |
error |
metrics |
response |
简单的示例如下:
page.on('load',
async () => {
console.log('page loading done, start fetch...');
});
内容保存
内容保存主要包括保存为pdf和截图
- page.pdf(options)
- page.screenshot([options])
不常用
另外,还有一些用的较少的函数,但一旦用上也是能解决比较问题的。
- page.authenticate(credentials)
- page.bringToFront()
- page.browser()
- page.close(options)
- page.coverage
- page.exposeFunction(name, puppeteerFunction)
- page.queryObjects(prototypeHandle)
- page.setBypassCSP(enabled)
- page.setCacheEnabled(enabled)
- page.setContent(html)
- page.setDefaultNavigationTimeout(timeout)
- page.setJavaScriptEnabled(enabled)
- page.setOfflineMode(enabled)
- page.tracing
除了page对象外,还有其他的几个对象,如果有空再详细的介绍一下。
使用Puppeteer进行数据抓取(二)——Page对象的更多相关文章
- 使用Puppeteer进行数据抓取(一)——安装和使用
Puppeteer是 Google Chrome 团队官方的Chrome 自动化工具.它本身是基于Chrome Dev Protocol协议实现的,但它提供了更高层次API封装,使用起来更加方便快捷. ...
- 使用Puppeteer进行数据抓取(四)——快速调试
在我们使用chrome作为爬虫获取网页数据时,往往需如下几步. 打开chrome 导航至目标页面 等待目标页面加载完成 解析目标页面数据 保存目标页面数据 关闭chrome 我们实际的编码往往集中在第 ...
- 使用Puppeteer进行数据抓取(四)——图片下载
大多数情况下,图片获取并不是很困难的事情,获取图片的url,然后模拟浏览器请求即可.但是,有的时候这种方法往往无法生效,常见的情形有: 动态图片,每次获取都是一个新的,例如图片验证码,重新获取时是一个 ...
- 使用Puppeteer进行数据抓取(三)——简单的示例
本文以一个示例简单的介绍一下puppeteer的用法,我们的目的是:获取我博客上的文章的前十页的所有随笔的标题和链接.由于puppeteer本身是自动化chorme,因此这里我们的步骤和手动操作浏览器 ...
- Twitter数据抓取
说明:这里分三个系列介绍Twitter数据的非API抓取方法.有兴趣的QQ群交流: BitCrawler网络爬虫QQ群 322937592 1.Twitter数据抓取(一) 2.Twitter数据抓取 ...
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...
- C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)
此文主要是 中国天气网和中国环境监测总站的数据抓取 打算开放全部数据抓取源代码 已在服务器上 稳定运行半个月 webapi http://api.xuzhiheng.cn/ 常量 /// <su ...
- python爬虫数据抓取方法汇总
概要:利用python进行web数据抓取方法和实现. 1.python进行网页数据抓取有两种方式:一种是直接依据url链接来拼接使用get方法得到内容,一种是构建post请求改变对应参数来获得web返 ...
- Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)
概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...
随机推荐
- HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)
题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去. 解题报告:因为题目中的k要乘很多次,达到了 ...
- 1、Saltstack简介及安装配置
1.Saltstack简介 Saltstack是基于Python开发的一套C/S架构,具备Puppet.Ansible功能于一身的配置管理工具,功能十分强大,各模块融合度及复用性极高:使用号称世界上最 ...
- 春夏秋冬又一春之Redis持久化
历史文章推荐: 一只准程序猿的唠叨 可能是最漂亮的Spring事务管理详解 Java多线程学习(八)线程池与Executor 框架 面试中关于Redis的问题看这篇就够了 非常感谢<redis实 ...
- 洛谷 P4389: 付公主的背包
题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i ...
- 从xtrabackup备份恢复单表【转】
目前对MySQL比较流行的备份方式有两种,一种上是使用自带的mysqldump,另一种是xtrabackup,对于数据时大的环境,普遍使用了xtrabackup+binlog进行全量或者增量备份,那么 ...
- IntelliJ IDEA 中安装junit插件
1.在Intellij IDEA 中安装了 Junit,TestNG插件,首先检查一下intellij IDEA 是否在安装时默认安装了这两个插件,检查方法 打开 settings -->Plu ...
- 环境变量GOBIN导致GoClipse运行出现异常
Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developers Photon Release (4. ...
- python3操作sqlserver,查询数据统计导出csv
import pymssql #导入sqlserver连接池模块 import csv #导出csv文件使用模块 conn=pymssql.connect('服务器ip','用户名','密码','数据 ...
- Python api认证
本节内容: 基本的api 升级的api 终极版api 环境:Djanao, 项目名:api_auto, app:api 角色:api端,客户端,黑客端 1.基本的api [api端] #api_aut ...
- JS post提交表单
js post方式提交表单有两种办法,1:AJAX提交 2:在JS里拼出一个form,然后submit 第二种办法的代码 //这个主要是解决给password MD5 var email = 'ema ...