新一代爬取JavaScript渲染页面的利器-playwright(一)

Playwright的使用

  Playwright是微软在2020年初开源的一款新一代自动化测试工具,其功能和**Selenium**、Pyppeteer类似,都可以驱动浏览器进行自动化操作,但是也具备了Selenium、Pyppeteer不具备的更好的API,是新一代爬取JavaScrip渲染页面的利器。

1.Playwright的特点

  • Playwright支持当前所有的主流浏览器,提供完善的自动化控制API。
  • Playwright支持移动端页面测试,使用设备模拟技术,可以在移动web浏览器中测试响应式的web应用程序。
  • Playwright支持所有浏览器的无头模式和非无头模式。
  • Playwright安装配置比较简单,安装过程中会自动安装对应的驱动,无需额外配置WebDriver等。
  • Playwright提供和自动等待相关的API,在页面加载时会自动等待对应的节点加载,大大减少了API编写的复杂度。

2.安装

  首先,确保python版本大于或等于3.7。

pip3 install playwright

  安装完成后执行初始化操作。

playwright install

  这是会自动安装Chromium、Firefox、WebKit浏览器和一些驱动。

3。基本使用

  Playwright支持两种编写模式,一种是和Pyppetter一样的异步模式,一种是和Selenium一样的同步模式,可以根据不同的实际需求来进行选择。

# 同步模式
# 调用了sync_playwright方法,该方法返回值是PlaywrightContext,可以理解为浏览器上下文管理器
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:for browser_type in [p.chromium,p.firefox,p.webkit]:# 不把lauch的headless设置为False,默认为无头浏览器browser = browser_type.launch(headless=False)# 新建选项卡,返回page对象page = browser.new_page()page.goto('http://www.baidu.com/')# 截图并定义文件名称page.screenshot(path=f'screenshot-{browser_type.name}.png')# title方法返回页面标题print(page.title())browser.close()

  运行上面代码可以看到chromium、firefox、webkit三个浏览器依次启动,启动后加载百度首页,加载完成后生成截图,然后打印页面标题到控制台。
  当然,除了同步模式,playwright还提供了支持异步模式的API,如果项目中使用了asyncio关键字,就应该使用异步模式。

import asyncio
from playwright.async.api import async_playwrightasync def main():async with async_playwright() as p:for browser_type in [p.chromium,p.firefox,p.webkit]:browser = await browser_type.launch()page = await browser.new_page()await page.goto('https://www.baidu.com')await page.screenshot(path=f'screenshot-{browser_type.name}.png')print(await page.title())await browser.close()asyncio.run(main())

  可以看到和同步模式基本一样,只不过导入方法改为async_playwright方法,不再是sync_playwright
方法,以及添加了async/await关键字,最后运行的效果是一样的。
  (对于async和await关键字的使用可以参考,异步爬虫-协程的基本使用这篇文章。)

4.代码生成

  playwright还有一个强大的功能,那就是可以录制我们在浏览器当中的操作并且生成相对应的代码。这个功能可以通过playwright命令行调用codegen实现。比如输入以下命令:

playwright codegen --help

结果如下:
在这里插入图片描述
  了解这些后我们可以尝试启动一个Firebox浏览器,然后将操作结果输出到script.py文件中。命令如下:

playwright codegen -o script.py -b firebox

  运行后会弹出一个Firebox浏览器,右侧有个脚本窗口。
在这里插入图片描述
在这里插入图片描述
  我们在弹出的浏览器打开百度,在搜索框输入nba,然后点击搜索,这时脚本窗口就会生成如下代码。而且我们可以看到会高亮显示我们正在操作的节点。

  在我们操作浏览器的过程中,该窗口的代码会跟着实时变化。所有操作完毕后,关闭浏览器,playwright会生成目标文件,内容如下:

from playwright.sync_api import Playwright, sync_playwright, expectdef run(playwright: Playwright) -> None:browser = playwright.firefox.launch(headless=False)context = browser.new_context()page = context.new_page()page.goto("https://www.baidu.com/")page.locator("#kw").fill("nba")page.get_by_role("button", name="百度一下").click()# ---------------------context.close()browser.close()with sync_playwright() as playwright:run(playwright)

  由此可见,有了代码生成功能,只通过简单的可视化点击操作就能生成代码,可谓非常方便。
  但是,观察生成的代码就会发现,这里的new_page不是通过browser调用的,而是通过context,这个context是由browser调用new_context方法生成的。这里context变量是一个BrowserContext对象,这是一个类似隐身模式的独立上下文环境,其运行资源是单独隔离的。在一些自动化测试中,我们可以为每个测试用例单独创建一个BrowserContext对象,这样可以保障各个测试用例之间互不干扰。

5.支持移动端浏览器

  Playwright另一个特色就是可以支持模拟移动端浏览器,例如模拟打开iphone 13 Pro上的Safari浏览器。

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:iphone_13_pro = p.devices['iPhone 13 Pro']browser = p.webkit.launch(headless=False)context = browser.new_context(**iphone_13_pro,locale='zh-CN')page = context.new_page()page.goto('https://www.whatismybrowser.com/')page.wait_for_load_state(state='networkidle')page.screenshot(path='browser-iphone.png')browser.close()

  运行代码后我们就会发现,弹出一个浏览器窗口,然后加载出了对应页面。
在这里插入图片描述
  这里我们先用PlaywrightContextManager对象的devices属性指定了一台移动设备,参数为设备的型号。
  我们创建了一个移动端BrowserContext对象初始化一些设备的信息等,最后把返回的BrowserContext赋值给context变量。
  接着,调用context的new_page方法创建一个新的选项卡,调动wait_for_load_state方法等待页面某个状态完成。netwoidle指网络空闲状态,即当前页面初始化和数据加载完成。

关于页面节点选择器得使用放在下个文章。
新一代爬取JavaScript渲染页面的利器-playwright(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/322064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot日志打印Logback详解【子节点详解】【附案例】

笑小枫的专属目录 1. 背景2. 什么是Logback3. SpringBoot使用logback介绍4. 自定义logback配置5. 如何把日志同步到ES中6. logback配置属性详解根节点< configuration>子节点:< property>子节点:< appender>filetargetappendprudentlayout和encoderlayout和e…

【KingbaseES】实现MySql函数Field

CREATE OR REPLACE FUNCTION field(value TEXT, VARIADIC arr TEXT[]) RETURNS INT AS $$ DECLAREi INT; BEGINFOR i IN 1 .. array_length(arr, 1) LOOPIF arr[i] value THENRETURN i;END IF;END LOOP;RETURN 0; END; $$ LANGUAGE plpgsql IMMUTABLE;

使用qtquick调用python程序

一. 内容简介 使用qtquick调用python程序 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本又无法编译64位程序&#xf…

【DevOps-02】Code编码阶段工具

一、简要说明 在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。 Git安装安装GitLab配置GitLab登录账户二、Git安装 Git官网 Githttps://git-scm.com/

Java业务功能并发问题处理

业务场景&#xff1a; 笔者负责的功能需要调用其他系统的进行审批&#xff0c;而接口的调用过程耗时有点长&#xff08;可能长达10秒&#xff09;&#xff0c;一个订单能被多个人提交审批&#xff0c;当订单已提交后会更改为审批中&#xff0c;不能再次审批&#xff08;下游系…

C++知识切片①:运算符重载之前置递增和后置递增

文章目录 前置递增的实现1.先写好main函数及头文件2.自定义MyInteger类3.重定义cout4.在类内实现前置递增 后置递增的实现完整代码 在进行运算符重载之前&#xff0c;不妨先看看常规的前置递增和后置递增的区别&#xff1a; 前置递增如a所示&#xff0c;a是先进行递增计算&…

大数据开发个人简历范本(2024最新版-附模板)

大数据开发工程师个人简历范本> 男 22 本科 张三 计算机科学与技术 1234567890 个人概述 具备深入的Hadoop大数据运维工程师背景&#xff0c;熟悉相关技术和工具 具备良好的团队合作能力&#xff0c;善于沟通和协作 具有快速学习新知识和解决问题的能力 对于数据科学…

mac远程ssh免密登录

服务器部署经常会登录到远程服务&#xff0c;为方便操作&#xff0c;提高效率对运维人员来说设置免密登录还是很有必要的。其实也是很简单&#xff0c;安以下操作步骤即可。 1、进入到&#xff5e;/.ssh目录下&#xff0c;确认已经生成有公钥与私钥。如果没有请执行发下命令 …

使用STM32和ESP8266构建智能家居网络

本文将介绍如何使用STM32微控制器和ESP8266 WiFi模块构建一个智能家居网络。我们将讨论智能家居网络的整体设计思路、硬件连接和软件开发。通过本文的指导和示例代码&#xff0c;读者将能够搭建一个智能家居系统&#xff0c;实现远程控制和数据监测。 一、智能家居网络的整体设…

Windows 安装配置 Anaconda、CUDA、cuDNN、pytorch-cuda全流程

Windows 安装配置 Anaconda、CUDA、cuDNN、pytorch-cuda全流程 1. 安装Anaconda 网址&#xff1a;https://repo.anaconda.com/archive/ 选择第一个下载即可 双击exe文件&#xff0c;按安装向导安装即可&#xff08;除安装路径自己选择外&#xff0c;其余均可按默认选项&#x…

微众区块链观察节点的架构和原理 | 科普时间

践行区块链公共精神&#xff0c;实现更好的公众开放与监督&#xff01;2023年12月&#xff0c;微众区块链观察节点正式面向公众开放接入功能。从开放日起&#xff0c;陆续有多个观察节点在各地运行&#xff0c;同步区块链数据&#xff0c;运行区块链浏览器观察检视数据&#xf…

计算机毕业设计 基于Java的供应商管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…