简介一些关键使用方法与思路,最全的资料还是官方文档
Pyppeteer 手册
pyperteer是puppeteer的Python实现,相比于selenium具有异步加载、速度快、具备有界面/无界面模式、伪装性更强不易被识别为机器人同时可以伪装手机平板等终端;但是也有一些缺点,如接口不易理解、语义晦涩;
官方案例
1 | import asyncio |
流程解析
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种方法
- 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弱、选择器不简洁等问题。
修改网站检测浏览器特征值
selenium的execute_script()方法,还是pyppeteer的evaluate()方法执行下面代码都能临时修改浏览器属性中的webdriver属性,当页面刷新或者跳转之后该值就原形毕露。
1 | () =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) } |
但是pyppeteer的最底层是封装的puppeteer,是js库,是和网站源码交互最深的方式,在pyppeteer中提供了一个方法:evaluateOnNewDocument(),该方法是将一段js代码加载到页面文档中,当发生页面导航、页面内嵌框架导航的时候加载的js代码会自动执行,那么当页面刷新的时候该js也会执行,这样就保证了修改网站的属性持久化的目的。
1 | await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,' |
完整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用于设置调试的日志输出级别。