pyppeteer常用方法手册

简介一些关键使用方法与思路,最全的资料还是官方文档

Pyppeteer 手册

pyperteer是puppeteer的Python实现,相比于selenium具有异步加载、速度快、具备有界面/无界面模式、伪装性更强不易被识别为机器人同时可以伪装手机平板等终端;但是也有一些缺点,如接口不易理解、语义晦涩;

官方案例

官方文档链接

1
2
3
4
5
6
7
8
9
10
11
import asyncio
from pyppeteer import launch

async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()

asyncio.get_event_loop().run_until_complete(main())

流程解析

  • async 声明一个异步操作。
  • await 声明一个耗时操作。
  • asyncio.get_event_loop().run_until_complete(main()) 创建异步池并执行main函数。
  • browser = await launch() 创建浏览器对象,可以传入 字典形式参数
  • page = await browser.newPage() 创建一个页面对象, 页面操作在该对象上执行
  • await page.goto('http://example.com') 页面跳转
  • await page.screenshot({'path': 'example.png'}) 截图保存
  • await browser.close() 关闭浏览器对象

launch常用配置

browesr = await launch({'headless':True}) 中 接受字典形式的关键字配置, 也可以直接接收键值对的方式进行配置

语法 描述
ignorehttpserrrors bool 忽略https错误,默认false
headless bool 是否可见
viewport dict 界面大小viewport={'width': 1280, 'height': 800}
args list[str] 附加参数(标志)过程
userDataDir str 用户数据目录的路径
devtools bool 打卡面板,效果同headless
log level (int str) 打印日志的日志级别。默认与根记录器。

launch中的args配置

  • args=[‘–disable-infobars’] 关闭 受控制提示
  • args=[‘–window-size=1366,768’] 设置浏览器界面大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"""案例"""
import asyncio
from pyppeteer import launch

width, height = 500, 300 # 尺寸配置
"""如果要单独写到配置高宽,需要在window-size前面加上f哦"""

async def main():
browser = await launch(
headless=False,
args=['--disable-infobars', f'--window-size={width},{height}'],
)
page = await browser.newPage()
await page.goto('http://www.taobao.com')
await page.screenshot({'path': 'example.png'})
await browser.close()

asyncio.get_event_loop().run_until_complete(main())

连接启动

启动链接浏览器有2种方法

  • launch 启动链接一个新的浏览器
  • connect 链接已经打开的浏览器,便于在崩溃后重链

后者需要 引入 from pyppeteer import launcher 并且必须带上browserWSEndpoint 参数,该参数可以通过 browser.wsEndpoint 获得

Browser浏览器类

该类可以对浏览器进行管理,包括但不限于 打开、关闭、取值等

官方参数说明

举例

1
2
3
4
5
6
7
"""无痕模式"""
# context = await browser.createIncogniteBrowserContext() # 无痕模式浏览器
# page = await context.newPage()

await browser.disconnect() # 断开浏览器,断开后可以通过connect连接
print(browser.process) # 返回浏览器进程 如果断开链接的情况返回None
"""还有多种使用方法参考官方文档"""

BrowserContext类

基类:pyee.EventEmitter

BrowserContext 用于创建多个独立的浏览器会话,启动浏览器时,它默认使用一个BrowserContext。browser.newPage() 在默认浏览器上下文中创建页面,如果页面打开另一个页面,例如通过 window.open 调用,则弹出窗口也属于初始化创建的浏览器上下文。

可以通过 browser.createIncognitoBrowserContext() 再创建一个隐身浏览器进程,“隐身”浏览器上下文不会将任何数据写入磁盘。

参数文档

Page页面接口

页面操作都在Page类上,也是最为核心的部分。可以修改本地js、css,也可以给页面添加js函数,甚至添加自定义函数到浏览器的windows属性中,也有js拦截相关的设置,更有终端模拟设置,这些功能是比driver更为强大的功能,但是也有一些劣势如页面超时方面比driver弱、选择器不简洁等问题。

官方Page使用说明

修改网站检测浏览器特征值

selenium的execute_script()方法,还是pyppeteer的evaluate()方法执行下面代码都能临时修改浏览器属性中的webdriver属性,当页面刷新或者跳转之后该值就原形毕露。

1
() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }

但是pyppeteer的最底层是封装的puppeteer,是js库,是和网站源码交互最深的方式,在pyppeteer中提供了一个方法:evaluateOnNewDocument(),该方法是将一段js代码加载到页面文档中,当发生页面导航、页面内嵌框架导航的时候加载的js代码会自动执行,那么当页面刷新的时候该js也会执行,这样就保证了修改网站的属性持久化的目的。

1
2
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => false } }) }') # 本页刷新后值不变

完整demo代码

1
2
3
4
5
6
7
8
9
10
11
12
13

import asyncio,time
from pyppeteer import launch

async def main():
browser = await launch(headless=False)
page = await browser.newPage() # 创建新页面并返回对象
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => false } }) }') # 本页刷新后值不变
await page.goto('https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html')
time.sleep(10)

asyncio.get_event_loop().run_until_complete(main())

其余类

Keyboard键盘、

Keyboard 是键盘事件相关的类,Worker 类是网站生命周期相关操作相关的类。

提供强大的键盘操作文档

Worker生命周期

Mouse鼠标

Tracing性能跟踪

Dialog对话框类

Frame和ExecutionContext类

Frame类用于操作网页的内嵌框架相关的事件、ExecutionContext是用于处理与页面交互的js函数。

JSHandle和ElementHandle

JSHandle和ElementHandle,其中JSHandle是网页内的js对象,该类包含了一系列的js对象方法;而ElementHandle是网页类的dom元素,封装了一系列对Dom元素的操作方法。

Request对象

esponse对于pyppeteer而言就犹如scrapy的Request对象一样,甚至更为强大一些,它可以拦截请求、修改请求、模拟客户端的通信。

Response、Target

pyppeteer的请求对象Request,在开启拦截器的情况下,可以对网站发出的请求进行拦截、修改、模拟等操作,犹如scrapy的request对象一样;response也是一个可以被解析的对象,同时还附带浏览器的其他可用信息;Target 可以说是一个页面对象也可以说是指向一个页面对象的事件,它具有page类的一些常用方法。

CDPSession、Coverage、Debugging

CDPSession是提供原生DevTools协议下的浏览器交互;Coverage用于统计js、css在初始状态下的执行比例、Debugging用于设置调试的日志输出级别。