Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Playwright: 比 Puppeteer 更好用的浏览器自动化工具

Playwright: 比 Puppeteer 更好用的浏览器自动化工具

作者头像
爬虫技术学习
发布于 2023-03-06 06:39:48
发布于 2023-03-06 06:39:48
3.5K00
代码可运行
举报
文章被收录于专栏:爬虫技术学习爬虫技术学习
运行总次数:0
代码可运行

在 Playwright 之前,我一般会使用 Selenium 或者 Puppeteer 来进行浏览器自动化操作。然而,Selenium 经常会有一些奇怪的 bug, Puppeteer 则是没有官方 Python 版,非官方版本也只有 async 版本,并且也是有一些奇怪的 bug. 另外,众所周知,Python 的 Async API 并不是那么好使。

Playwright 是微软出品的浏览器自动化工具,代码质量应该是有足够保证的。而且它还官方支持同步版的 Python API, 同时支持三大浏览器,所以赶紧切换过来了。

特别注意 Playwright 的拼写,别把中间的 "w" 丢了。

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install playwright==1.8.0a1  # 很奇怪,必须指定版本,不指定会安装到一个古老的版本
python -m playwright install  # 安装浏览器,此处国内网络可能会有问题(你懂的),请自行解决

基本使用

Playwright 支持 Firefox / Chrome / WebKit(Safari). 其中 webkit 最轻量了,所以没有什么特殊需求最好使用 webkit, 不要使用 chromium.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from playwright.sync_api import sync_playwright as playwright

with playwright() as pw:
    webkit = pw.webkit.launch(headless=False)
    context = webkit.new_context()  # 需要创建一个 context
    page = context.new_page()  # 创建一个新的页面
    page.goto("https://www.apple.com")
    print(page.content())
    webkit.close()

Playwright 官方推荐使用 with 语句来访问,不过如果你不喜欢的话,也可以用 pw.start() 和 pw.stop().

新概念:Context

和 Puppeteer 不同的是,Playwright 新增了 context 的概念,每个 context 就像是一个独立的匿名模式会话,非常轻量,但是又完全隔离。比如说,可以在两个 context 中登录两个不同的账号,也可以在两个 context 中使用不同的代理。

通过 context 还可以设置 viewport, user_agent 等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
context = browser.new_context(
  user_agent='My user agent'
)
context = browser.new_context(
  viewport={ 'width': 1280, 'height': 1024 }
)
context = browser.new_context(
    http_credentials={"username": "bill", "password": "pa55w0rd"}
)

# new_context 其他几个比较有用的选项:
ignore_https_errors=False
proxy={"server": "http://example.com:3128", "bypass": ".example.com", "username": "", "password": ""}
extra_http_headers={"X-Header": ""}

context 中有一个很有用的函数context.add_init_script, 可以让我们设定在调用 context.new_page 的时候在页面中执行的脚本。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# hook 新建页面中的 Math.random 函数,总是返回 42
context.add_init_script(script="Math.random = () => 42;")
# 或者写在一个文件里
context.add_init_script(path="preload.js")

还可以使用 context.expose_bindingcontext.expose_function 来把 Python 函数暴露到页面中,不过个人感觉还是使用 add_init_script 暴露 JS 函数方便一些。

和 Puppeteer 一样,Playwright 的核心概念依然是 page, 核心 API 几乎都是 page 对象的方法。可以通过 context 来创建 page.

页面基本操作

按照官网文档,调用 page.goto(url) 后页面加载过程:

  1. 设定 url
  2. 通过网络加载解析页面
  3. 触发 page.on("domcontentloaded") 事件
  4. 执行页面的 js 脚本,加载静态资源
  5. 触发 page.on("laod") 事件
  6. 页面执行动态加载的脚本
  7. 当 500ms 都没有新的网络请求的时候,触发 networkidle 事件

page.goto(url) 会跳转到一个新的链接。默认情况下 Playwright 会等待到 load 状态。如果我们不关心加载的 CSS 图片等信息,可以改为等待到 domcontentloaded 状态,如果页面是 ajax 加载,那么我们需要等待到 networkidle 状态。如果 networkidle 也不合适的话,可以采用 page.wait_for_selector 等待某个元素出现。不过对于 click 等操作会自动等待。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.goto(url, referer="", timeout=30, wait_until="domcontentloaded|load|networkidle")

Playwright 会自动等待元素处于可操作的稳定状态。当然也可以用 page.wait_for_* 函数来手工等待:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.wait_for_event("event", event_predict, timeout)
page.wait_for_function(js_function)
page.wait_for_load_state(state="domcontentloaded|load|networkidle", timeout)
page.wait_for_selector(selector, timeout)
page.wait_for_timeout(timeout)  # 不推荐使用

对页面的操作方法主要有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# selector 指的是 CSS 等表达式
page.click(selector)
page.fill(selector, value)  # 在 input 中填充值

# 例子
page.click("#search")

获取页面中的数据的主要方法有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.url  # url
page.title()  # title
page.content()  # 获取页面全文
page.inner_text(selector)  # element.inner_text()
page.inner_html(selector)
page.text_content(selector)
page.get_attribute(selector, attr)

# eval_on_selector 用于获取 DOM 中的值
page.eval_on_selector(selector, js_expression)
# 比如:
search_value = page.eval_on_selector("#search", "el => el.value")

# evaluate 用于获取页面中 JS 中的数据,比如说可以读取 window 中的值
result = page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
print(result) # prints "56"

选择器表达式

在上面的代码中,我们使用了 CSS 表达式(比如#button)来选取元素。实际上,Playwright 还支持 XPath 和自己定义的两种简单表达式,并且是自动识别的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过文本选择元素,这是 Playwright 自定义的一种表达式
page.click("text=login")

# 直接通过 id 选择
page.click("id=login")

# 通过 CSS 选择元素
page.click("#search")
# 除了常用的 CSS 表达式外,Playwright 还支持了几个新的伪类
# :has 表示包含某个元素的元素
page.click("article:has(div.prome)")
# :is 用来对自身做断言
page.click("button:is(:text('sign in'), :text('log in'))")
# :text 表示包含某个文本的元素
page.click("button:text('Sign in')")  # 包含
page.click("button:text-is('Sign is')")  # 严格匹配
page.click("button:text-matches('\w+')")  # 正则
# 还可以根据方位匹配
page.click("button:right-of(#search)")  # 右边
page.click("button:left-of(#search)")  # 左边
page.click("button:above(#search)")  # 上边
page.click("button:below(#search)")  # 下边
page.click("button:near(#search)")  # 50px 之内的元素

# 通过 XPath 选择
page.click("//button[@id='search'])")
# 所有 // 或者 .. 开头的表达式都会默认为 XPath 表达式

对于 CSS 表达式,还可以添加前缀css=来显式指定,比如说 css=.login 就相当于 .login.

除了上面介绍的四种表达式以外,Playwright 还支持使用 >> 组合表达式,也就是混合使用四种表达式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
page.click('css=nav >> text=Login')

复用 Cookies 等认证信息

在 Puppeteer 中,复用 Cookies 也是一个老大难问题了。这个是 Playwright 特别方便的一点,他可以直接导出 Cookies 和 LocalStorage, 然后在新的 Context 中使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 保存状态
import json
storage = context.storage_state()
with open("state.json", "w") as f:
    f.write(json.dumps(storage))

# 加载状态
with open("state.json") as f:
    storage_state = json.loads(f.read())
context = browser.new_context(storage_state=storage_state)

监听事件

通过 page.on(event, fn) 可以来注册对应事件的处理函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def log_request(intercepted_request):
    print("a request was made:", intercepted_request.url)
page.on("request", log_request)
# sometime later...
page.remove_listener("request", log_request)

其中比较重要的就是 request 和 response 两个事件

拦截更改网络请求

可以通过 page.on("request") 和 page.on("response") 来监听请求和响应事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from playwright.sync_api import sync_playwright as playwright

def run(pw):
    browser = pw.webkit.launch()
    page = browser.new_page()
    # Subscribe to "request" and "response" events.
    page.on("request", lambda request: print(">>", request.method, request.url))
    page.on("response", lambda response: print("<<", response.status, response.url))
    page.goto("https://example.com")
    browser.close()

with playwright() as pw:
    run(pw)

其中 request 和 response 的属性和方法,可以查阅文档:https://playwright.dev/python/docs/api/class-request

通过 context.route, 还可以伪造修改拦截请求等。比如说,拦截所有的图片请求以减少带宽占用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
context = browser.new_context()
page = context.new_page()
# route 的参数默认是通配符,也可以传递编译好的正则表达式对象
context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
context.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page.goto("https://example.com")
browser.close()

其中 route 对象的相关属性和方法,可以查阅文档:https://playwright.dev/python/docs/api/class-route

灵活设置代理

Playwright 还可以很方便地设置代理。Puppeteer 在打开浏览器之后就无法在更改代理了,对于爬虫类应用非常不友好,而 Playwright 可以通过 Context 设置代理,这样就非常轻量,不用为了切换代理而重启浏览器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
context = browser.new_context(
    proxy={"server": "http://example.com:3128", "bypass": ".example.com", "username": "", "password": ""}
)

杀手级功能:录制操作直接生成代码

Playwright 的命令行还内置了一个有趣的功能:可以通过录制你的点击操作,直接生成 Python 代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python -m playwright codegen http://example.com/

Playwright 还有很多命令行功能,比如生成截图等等,可以通过 python -m playwright -h 查看。

其他

除此之外,Playwright 还支持处理页面弹出的窗口,模拟键盘,模拟鼠标拖动(用于滑动验证码),下载文件等等各种功能,请查看官方文档吧,这里不赘述了。对于写爬虫来说,Playwright 的几个特性可以说是秒杀 Puppeteer/Pyppeteer:

  1. 官方同步版本的 API
  2. 方便导入导出 Cookies
  3. 轻量级设置和切换代理
  4. 支持丰富的选择表达式

快点用起来吧!

参考

  1. https://playwright.dev/python/docs/core-concepts
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爬虫技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
强大易用!新一代爬虫利器 Playwright 的介绍
Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium、Pyppeteer 等,都可以驱动浏览器进行各种自动化操作。它的功能也非常强大,对市面上的主流浏览器都提供了支持,API 功能简洁又强大。虽然诞生比较晚,但是现在发展得非常火热。
崔庆才
2021/12/10
7.5K0
强大易用!新一代爬虫利器 Playwright 的介绍
快速进行UI自动化
最近团队少了好些人,有点忙不过来,虽然是有覆盖好多API测试,但是端到端的测试,还是少不了UI。
赵云龙龙
2024/01/15
3540
快速进行UI自动化
Python Playwright API使用实例详解
Playwright 是一个 Node.js 库,它提供了一个高级的 API 来自动化 Chromium、Firefox 和 WebKit 浏览器中的操作。Python Playwright API 是 Playwright 的 Python 版本,它提供了一套与 Node.js 版本相同的 API,可以在 Python 中使用。
苦叶子
2023/06/09
1.2K0
Python Playwright API使用实例详解
微软开源的浏览器自动化工具-Playwright
软开源了一个 Python 项目:Playwright,从此又多了一个浏览器自动化工具。之前一直用 selenium 或 splinter。
somenzz
2020/11/25
1.6K0
微软开源的浏览器自动化工具-Playwright
Puppeteer:从零出发,全面掌握浏览器自动化神器
Puppeteer 译为木偶,是一个 Node.js 库,内部通过 DevTools 协议提供控制 Chrome 或 Firefox 的一系列 API。通过定义可以看出 Puppeteer 的核心在于提供用户控制浏览器行为的方法,以下是一些自动化入门示例:
前端小鑫同学
2024/07/12
3.2K0
playwright基础教程
Playwright是一个由Microsoft开发的自动化测试工具,可以用来测试Web应用程序。它支持多种编程语言和多个浏览器,包括Chrome,Firefox和WebKit。它通过提供一组API,使得开发人员可以在浏览器中模拟用户行为,例如单击,输入文本和导航到不同的页面,同时还能捕捉截图和视频。
梦无矶小仔
2023/08/03
8960
playwright基础教程
[1291]Playwright教程
这种类型的python库有好多种,鼎鼎大名的selenium,还有playwright、Pyppeteer等。
周小董
2024/12/20
8660
[1291]Playwright教程
微软开源最强Python自动化神器Playwright!不用写一行代码!自动生成代码还竟然如此流畅!妈妈再也不用担心我不会写代码了!
使用Playwright无需写一行代码,我们只需手动操作浏览器,它会录制我们的操作,然后自动生成代码脚本。 下面就是录制的命令codegen,仅仅一行。
川川菜鸟
2021/10/18
3.1K0
微软推出的浏览器自动化工具 playwright
提供同步(阻塞)API 和异步 API。它们在功能方面是相同的,并且仅在使用 API 的方式上有所不同。
叉叉敌
2021/12/06
4530
Playwright事件监控
(1)通过网络加载解析页面 (2)触发 page.on("domcontentloaded") 事件 (3)执行页面的 js 脚本,加载静态资源 (4)触发 page.on("laod")事件 (5)页面执行动态加载的脚本 (6)当 500ms 都没有新的网络请求的时候,触发 networkidle 事件
沈宥
2022/12/05
2.8K0
《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)
  通过前边的讲解和学习,细心认真地小伙伴或者童鞋们可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所有元素、事件的概念,所以我们包括定位元素、页面转向,都是基于Page操作的。页面提供了与浏览器中的单个选项卡或 Chromium 中的扩展后台页面进行交互的方法。一个浏览器实例可能有多个 Page 实例。
北京-宏哥
2023/07/24
9191
《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)
不写一行代码来实现自动化
由于技术的进步,各行各业的门槛越来越低。 以前别人说会selenium就是会自动化。好像很高大上的样子。现在会selenium估计是基本的。大家都忙着内卷,各种轮子越来越多,自动化的门槛也越来越低。
赵云龙龙
2021/03/16
8950
使用 Playwright 进行元素定位
在自动化测试和网页爬取中,定位页面元素是一项重要的任务。Playwright 提供了多种方式来定位页面元素,包括通过 CSS 选择器、XPath 和文本内容等。在本文中,我们将介绍如何使用 Playwright 进行元素定位。
霍格沃兹测试开发Muller老师
2024/05/12
7900
软件测试|web自动化测试神器playwright教程(六)
在web自动化测试的工作中,弹窗以及页面切换是我们比较头疼的问题,我们都是需要通过switch切换到弹窗或者页面上进行操作,再切换回到我们的原页面进行操作,这样的操作十分繁琐,我们需要去获取window_handle,作为切换页面的对象,playwright在这方面就有很大的优势。
霍格沃兹测试开发Muller老师
2023/03/30
1.6K0
自动化 Web 性能分析之 Puppeteer 爬虫实践
通过上篇文章《自动化 Web 性能优化分析方案》的分享想必大家对“百策系统”有了初步的了解。本文将向大家介绍自动化性能分析使用的核心库——Puppeteer,并结合页面登录场景,介绍 Puppeteer 在百策系统中的应用。
政采云前端团队
2019/12/20
3.6K0
自动化 Web 性能分析之 Puppeteer 爬虫实践
《最新出炉》系列入门篇-Python+Playwright自动化测试-7-浏览器的相关操作
上一篇已经将playwright的元素定位大法基本介绍的差不多了,但是在Web的UI自动化的测试中,我们通常需要使用一些方法来操作浏览器,今天就跟随学习了解一下。这一篇宏哥主要是介绍一下,在自动化测试的时候,我们常见的一些浏览器操作有哪些,宏哥将会一一介绍和讲解。
北京-宏哥
2023/07/24
8661
《最新出炉》系列入门篇-Python+Playwright自动化测试-7-浏览器的相关操作
selenium&playwright获取网站Authorization鉴权实现伪装requests请求
吐槽一下,playwright的资料是真的很少(基础资料除外),只能自己去看官网,官网写的还是可以的,自己多试试还是可以搞出点东西来的,但真的好累,呜呜呜~
梦无矶小仔
2023/09/08
1.9K0
selenium&playwright获取网站Authorization鉴权实现伪装requests请求
软件测试|web自动化测试神器playwright教程(十一)
在我们进行web自动化测试的过程中,我们经常会面临需要登录的情况,每一次打开页面如果都需要重新登录的话,就会大大增加测试所需要的时间,体现不出自动化测试的优势,我们都知道selenium可以通过cookie实现登录,那么playwright能不能实现这个功能呢?
霍格沃兹测试开发Muller老师
2023/06/02
4430
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
在CSDN写了大概140篇文章,一直都是0阅读量,仿佛石沉大海,在掘金能能频频上热搜的文章,在CSDN一点反馈都没有,所以跟文章质量关系不大,主要是曝光量,后面调研一下,发现情况如下
linwu
2023/08/08
7000
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
【python自动化】Playwright基础教程(二)快速入门
目前已经将公司selenium框架构建的web ui自动化项目使用playwright进行了重构,个人对playwright的使用也比之前更加熟悉,在此重新汇总一下,后续如果应用了本文中没有提及的知识,会继续更新这个系列。
梦无矶小仔
2023/09/08
4.5K0
【python自动化】Playwright基础教程(二)快速入门
推荐阅读
相关推荐
强大易用!新一代爬虫利器 Playwright 的介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验