使用Puppeteer进行数据抓取(二)——Page对象

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对象外,还有其他的几个对象,如果有空再详细的介绍一下。

原文地址:https://www.cnblogs.com/TianFang/p/9059978.html

时间: 2024-11-06 03:45:20

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

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

大多数情况下,图片获取并不是很困难的事情,获取图片的url,然后模拟浏览器请求即可.但是,有的时候这种方法往往无法生效,常见的情形有: 动态图片,每次获取都是一个新的,例如图片验证码,重新获取时是一个新的验证码图片,已经失去了效果了. 动态上下文,有的网站为了反爬虫,获取图片时要加上其动态生成的cookie才行. 这些情况下,使用puppeteer驱动chrome浏览器能看到图片,但获取url后单独请求时,要么获取到的图片无效,要么获取不到图片.本文这里就简单的介绍下一些十分通用且有效的下载这些

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

本文以一个示例简单的介绍一下puppeteer的用法,我们的目的是:获取我博客上的文章的前十页的所有随笔的标题和链接.由于puppeteer本身是自动化chorme,因此这里我们的步骤和手动操作浏览器差不多: 打开chrome,跳转到博客首页 获取所有博客标题信息 点击下一页按钮,跳转到下一页 重复2.3两步,直到所有信息采集完毕 获取信息 采集过程中比较麻烦的一步就是信息的采集,和传统采集html后解析的方式不同的时,由于chrome本身有完整的js引擎,因此我们采用注入一段js,利用该js采

Twitter数据抓取

说明:这里分三个系列介绍Twitter数据的非API抓取方法,内容主要来自于Tom Dickinson的博客. Tom Dickinson Milton Keynes,I am currently a PhD student at KMI, currently researching extraction of memorable events from social media. My areas of expertise lie in data mining, machine learnin

数据抓取的艺术(二)

原文地址:http://blog.chinaunix.net/uid-22414998-id-3695673.html 续前文:<数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置>. 程序优化:第一步开始: for i in range(startx,total): for j in range(starty,total): BASE_URL = createTheUrl([item[i],item[j]]) driver.get(BASE_URL) driver =

利用Selenium制作python数据抓取,以及对Selenium资源介绍

当当当~第三篇博客开始啦~ 这次的话题是数据抓取.终于到了核心部分的探讨,我的心情也是非常激动啊!如果大家baidu或者google(如果可以的话)数据抓取或者data crawling,将会找到数以千计的例子.但是大多数的代码非常的冗长,并且许多代码还是抓取静态数据之后,对动态JS写成的数据却毫无办法.或者,利用HTML解析网址后,再找到JS写的数据页面来寻找到所想要的数据. 但是!不知各位是否有发现过,如果打开chrome或者safari或者各种浏览器的审查元素.网页上能看到的数据,其实都会

数据抓取的艺术(一)

原文地址:http://blog.chinaunix.net/uid-22414998-id-3692113.html?page=3 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什么东东,最后才

Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. 先进行所有页面的内容进行抓取 var page =require('webpage').create(); var address='http://product.pconline.com.cn/server/'; var fs = require('fs'); var mypath = 'ver

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

概要 这篇博客是在上一篇博客Phantomjs+Nodejs+Mysql数据抓取(1.抓取数据) http://blog.csdn.net/jokerkon/article/details/50868880 后进行的第二部分,请各位读者在看这篇博客之前先浏览上一篇,因为这里面有部分代码会沿用到上一部分的抓取结果. 好,现在开始正式的抓取图片的讲解 首先,我们先来看看代码: var page =require('webpage').create(); var address='http://pro

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置 2013-05-15 15:08:14 分类: Python/Ruby 数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什