page对象是puppeteer最常用的对象,它可以认为是chrome的一个tab页,主要的页面操作都是通过它进行的。Google的官方文档详细介绍了page对象的使用,这里我只是简单的小结一下。

客户端模拟

页面模拟设置相关函数有如下几个,

  1. page.setViewport: 设置视图大小
  2. page.setUserAget: 设置UserAgent
  3. 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

页面跳转

页面跳转相关函数有如下几个,

  1. page.goto(url, options)
  2. page.goBack(options)
  3. page.goForward(options)
  4. page.reload(options)

其中比较常用的是page.goto,相当于在浏览器中输入了地址,然后回车。此外,也可以同通过执行js跳转和模拟点击link跳转。

选择

常用的元素函数选择有:

  1. page.$(selector)
  2. page.$$(selector)

它们的功能类似于document.querySelector和document.querySelectorAll。

它们返回的对象是<Promise<?ElementHandle>>,可以用它判断某元素是否存在,也可以对ElementHandle执行相应操作,具体在后面的ElementHandle中介绍。

另外,还有一个使用xpath的select版本。

  1. page.$x(expression)

虽然这个用的相对少点,但也还是非常有用的。

模拟输入

page本身提供原始的mouse和keyboard的模拟输入类。

  1. page.mouse
  2. page.keyboard

但同时也提供更方便快捷的模拟输入函数

  1. page.click(selector[, options])        在被选择元素上模拟点击
  2. page.type(selector, text[, options])    在被选择的输入框中输入
  3. page.hover(selector)                模拟鼠标移动到被选择元素上
  4. page.select(selector, ...values)        在被选择元素上模拟选择select选项
  5. 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函数不能调试,但仍然是有非常大的好处的,

  1. 不用考虑字符串转义的问题,书写起来非常直接
  2. 脚本在IDE中有高亮显示和智能提示的,写起来更加方便

另外,还有几个其它的执行脚本的函数,应用于不同的场合,也是非常有用的。

  1. page.evaluateHandle(pageFunction, ...args)
  2. page.evaluateOnNewDocument(pageFunction, ...args)
  3. page.$$eval(selector, pageFunction[, ...args])
  4. 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提供了一些查看页面信息的函数,

  1. page.url()
  2. page.content()
  3. page.frames()
  4. page.mainFrame()
  5. page.metrics()
  6. page.target()
  7. page.title()
  8. 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,都是非常有用的函数。

  1. page.addScriptTag(options)
  2. page.addStyleTag(options)

事件

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和截图

  1. page.pdf(options)
  2. page.screenshot([options])

不常用

另外,还有一些用的较少的函数,但一旦用上也是能解决比较问题的。

  1. page.authenticate(credentials)
  2. page.bringToFront()
  3. page.browser()
  4. page.close(options)
  5. page.coverage
  6. page.exposeFunction(name, puppeteerFunction)
  7. page.queryObjects(prototypeHandle)
  8. page.setBypassCSP(enabled)
  9. page.setCacheEnabled(enabled)
  10. page.setContent(html)
  11. page.setDefaultNavigationTimeout(timeout)
  12. page.setJavaScriptEnabled(enabled)
  13. page.setOfflineMode(enabled)
  14. page.tracing

除了page对象外,还有其他的几个对象,如果有空再详细的介绍一下。

使用Puppeteer进行数据抓取(二)——Page对象的更多相关文章

  1. 使用Puppeteer进行数据抓取(一)——安装和使用

    Puppeteer是 Google Chrome 团队官方的Chrome 自动化工具.它本身是基于Chrome Dev Protocol协议实现的,但它提供了更高层次API封装,使用起来更加方便快捷. ...

  2. 使用Puppeteer进行数据抓取(四)——快速调试

    在我们使用chrome作为爬虫获取网页数据时,往往需如下几步. 打开chrome 导航至目标页面 等待目标页面加载完成 解析目标页面数据 保存目标页面数据 关闭chrome 我们实际的编码往往集中在第 ...

  3. 使用Puppeteer进行数据抓取(四)——图片下载

    大多数情况下,图片获取并不是很困难的事情,获取图片的url,然后模拟浏览器请求即可.但是,有的时候这种方法往往无法生效,常见的情形有: 动态图片,每次获取都是一个新的,例如图片验证码,重新获取时是一个 ...

  4. 使用Puppeteer进行数据抓取(三)——简单的示例

    本文以一个示例简单的介绍一下puppeteer的用法,我们的目的是:获取我博客上的文章的前十页的所有随笔的标题和链接.由于puppeteer本身是自动化chorme,因此这里我们的步骤和手动操作浏览器 ...

  5. Twitter数据抓取

    说明:这里分三个系列介绍Twitter数据的非API抓取方法.有兴趣的QQ群交流: BitCrawler网络爬虫QQ群 322937592 1.Twitter数据抓取(一) 2.Twitter数据抓取 ...

  6. [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取

    做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...

  7. C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)

    此文主要是 中国天气网和中国环境监测总站的数据抓取 打算开放全部数据抓取源代码 已在服务器上 稳定运行半个月 webapi http://api.xuzhiheng.cn/ 常量 /// <su ...

  8. python爬虫数据抓取方法汇总

    概要:利用python进行web数据抓取方法和实现. 1.python进行网页数据抓取有两种方式:一种是直接依据url链接来拼接使用get方法得到内容,一种是构建post请求改变对应参数来获得web返 ...

  9. Phantomjs+Nodejs+Mysql数据抓取(2.抓取图片)

    概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868 ...

随机推荐

  1. HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)

    题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去. 解题报告:因为题目中的k要乘很多次,达到了 ...

  2. 1、Saltstack简介及安装配置

    1.Saltstack简介 Saltstack是基于Python开发的一套C/S架构,具备Puppet.Ansible功能于一身的配置管理工具,功能十分强大,各模块融合度及复用性极高:使用号称世界上最 ...

  3. 春夏秋冬又一春之Redis持久化

    历史文章推荐: 一只准程序猿的唠叨 可能是最漂亮的Spring事务管理详解 Java多线程学习(八)线程池与Executor 框架 面试中关于Redis的问题看这篇就够了 非常感谢<redis实 ...

  4. 洛谷 P4389: 付公主的背包

    题目传送门:洛谷 P4389. 题意简述: 有 \(n\) 个物品,每个物品都有无限多,第 \(i\) 个物品的体积为 \(v_i\)(\(v_i\le m\)). 问用这些物品恰好装满容量为 \(i ...

  5. 从xtrabackup备份恢复单表【转】

    目前对MySQL比较流行的备份方式有两种,一种上是使用自带的mysqldump,另一种是xtrabackup,对于数据时大的环境,普遍使用了xtrabackup+binlog进行全量或者增量备份,那么 ...

  6. IntelliJ IDEA 中安装junit插件

    1.在Intellij IDEA 中安装了 Junit,TestNG插件,首先检查一下intellij IDEA 是否在安装时默认安装了这两个插件,检查方法 打开 settings -->Plu ...

  7. 环境变量GOBIN导致GoClipse运行出现异常

    Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developers Photon Release (4. ...

  8. python3操作sqlserver,查询数据统计导出csv

    import pymssql #导入sqlserver连接池模块 import csv #导出csv文件使用模块 conn=pymssql.connect('服务器ip','用户名','密码','数据 ...

  9. Python api认证

    本节内容: 基本的api 升级的api 终极版api 环境:Djanao, 项目名:api_auto, app:api 角色:api端,客户端,黑客端 1.基本的api [api端] #api_aut ...

  10. JS post提交表单

    js post方式提交表单有两种办法,1:AJAX提交 2:在JS里拼出一个form,然后submit 第二种办法的代码 //这个主要是解决给password MD5 var email = 'ema ...