Playwright 自动化操作

之前有见同事用过playwright进行浏览器模拟操作,但是没有仔细了解,今天去详细看了下,发现playwright着实比selenium牛逼多了

  • Playwright 相对于selenium优点
    1、自动下载chromnium, 无需担心chrome升级对应版本问题
    2、支持录屏操作,然后直接生成python代码;
    3、支持网路拦截、事件监听,纵使我们是模拟浏览器,但是依旧可以在request请求上作文章,这个就很牛逼;
    4、代码简洁性更高;
    5、支持异步处理;

  • 安装使用

    #下载第三方库
    pip3 install playwright
    #安装好后,进行初始化操作,它会自动安装chromium, Firefox , webkit浏览器并配置一些驱动
    playwright install
    
  • 录屏操作
    1、使用控制台(terminal,cmd, powershell),进入到项目目录下;
    2、查看所有的录屏相关命令:playwright codegen -h
    3、启动示例:

    #-o 非必须,输出代码到指定文件,如果不指定,也可以在界面中复制代码就好
    #-b 非必须,指定浏览器, 默认是chromnium
    #--device #非必须, 指定机器型号
    #www.baidu.com #非必须, 指定访问的url
    playwright codegen -o luping.py -b chromnium --device="iphone 13" www.baidu.com
    
    #--save-storage 保存浏览器缓存,可以自定义指定项目名称
    playwright codegen -b cr  --save-storage=saiying www.saleyee.cn
    #--load-storage 获取已有的浏览器缓存,指定好项目名称就好
    playwright codegen -b cr  --load-storage=saiying www.saleyee.cn
    

    4、录屏时,直接人工操作就好了,也可以暂停录屏,至于如何获取元素内容,需要自己探究;
    5、退出录屏,只要在控制台ctrl+C
    在这里插入图片描述
    6、然后把代码改一改,就可以使用了,这个还是很方便的;

    • 使用代码示例
      事件监听:
    • "close":页面关闭事件。
    • "console":页面上发生控制台日志事件。
    • "crash":页面崩溃事件。
    • "dialog":页面弹出对话框事件。
    • "domcontentloaded":DOM 内容加载完成事件。
    • "download":页面上触发下载事件。
    • "filechooser":页面弹出文件选择对话框事件。
    • "frameattached":子框架附加到页面事件。
    • "framedetached":子框架从页面分离事件。
    • "framenavigated":子框架导航事件。
    • "load":页面加载完成事件。
    • "pageerror":页面上发生错误事件。
    • "popup":页面弹出弹出窗口事件。
    • "request":页面发出网络请求事件。
    • "requestfailed":页面上的请求失败事件。
    • "requestfinished":页面上的请求完成事件。
    • "response":页面接收到网络响应事件。
    • "websocket":页面上发生 WebSocket 事件。
    • "worker":页面上发生 Worker 事件。
# -*- coding: utf-8 -*-
import asyncio
import time
from urllib import parse
from playwright.async_api import async_playwright
from playwright.sync_api import sync_playwright




#!!!!!!!!!!!!!!响应事件response监听, 数据采集的逻辑可以在这里做
def on_response(response):
    if 'api/movie/' in response.url and response.status == 200:
        # print(f'Statue {response.status}: {response.url}')
        print(response.json())

#请求事件request监听,只能获取相关的请求参数,用处不大,
def on_request(request):
    print(request.url)

#!!!下载事件监听,比如店铺后台的表格下载就可以在此处理
def on_download(download):
    print(f"Download started: {download.url}")

#!!!!!!!!!!!!!网络劫持
#可以实现网络劫持和修改操作,比如非加密,通过相应参数修改,获取自定义返回的内容,从而采集
#它就相当于一个网络钩子,可以修改请求信息, 还可以设置保持浏览器上url不变的情况下,跳转其他站点页面
def handle_request(route, request):
    url = request.url
    if url == "http://example.com":
        if route.request.method == "GET":
            print(f"GET请求url为:{route.request.url}")
            bits = list(parse.urlparse(url))
            qs = parse.parse_qs(bits[4])
            qs["key1"] = ["GET"]  # 此处替换key1的值
            bits[4] = parse.urlencode(qs, True)
            url = parse.urlunparse(bits)
            print(f"改变后的url为: {url}\n")
            route.continue_(url=url)
        elif route.request.method == "POST":
            print(f"POST请求入参为:{route.request.post_data}")
            text_list = route.request.post_data.split("&")
            for i in range(len(text_list)):
                text_item = text_list[i]
                if "key1=" in text_item:
                    text_list[i] = "key1=POST"  # 此处替换key1的值
            print(f"改变后的数据为: {'&'.join(text_list)}\n")
            route.continue_(post_data="&".join(text_list))

# 同步
# 使用with打开服务可以避免中间代码执行报错导致无法正常关闭浏览器进程
with sync_playwright() as p:
    # browser_type_list = [p.chromium, p.firefox, p.webkit]
    for browser_type in [p.chromium]:
        browser = browser_type.launch(headless=False)

        #=======!!!可以指定项目名称,例(saiying),这样可以继承上一次浏览器缓存,这样可以规避下重复登录的问题, 但是不清楚没有该项目名称情况下会有什么问题
        # 也可以不指定创建一个新的context = browser.new_context()
        # 如果使用该种方式,记得流程结束后,要再保留下当前缓存context.storage_state(path="saiying"), 在下面有示例
        # context = browser.new_context(storage_state="saiying")
        # page = context.new_page()



        #直接生成新浏览器执行对象
        page = browser.new_page()

        #事件监听----start
        page.on('response', on_response)    #响应事件监听
        page.on('request', on_request)      #发起请求事件监听
        page.on('download', on_download)  # 文件下载事件监听
        # 事件监听----end

        #网络拦截---start
        route_url = 'http://127.0.0.1/zentao/testcase-create-1-0-0.html' #可以指定拦截url,或者部分定制url
        #route_url = '**'       #指定全部的url
        #route_url = '**/*.json'    #指定部分url
        page.route(route_url, handle_request)  # 监听添加用例接口
        # 网络拦截---end

        page.goto('https://spa6.scrape.center/') #请求网页地址
        page.wait_for_load_state('networkidle') #等待页面所有请求响应完毕,还有load, domcontentloaded


        element = page.query_selector('xpath=//a')  #单节点定位
        elements = page.query_selector_all('xpath=//a')  # 多节点定位
        for element in elements:
            print(element.inner_html())         #打印该节点下所有标签内容
            print(element.get_attribute('href'))
            element.query_selector('xpath=.//img')
        print(page.title())

        #=======!!! 在登录完毕,或者操做完毕后,保留当前缓存,供下次调用
        # context.storage_state(path="saiying")
        # context.close()

        page.close()
        browser.close()         #关闭浏览器


# #异步, 感觉用处不大
# async def main():
#     async with async_playwright() as p:
#         # browser_type_list = [p.chromium, p.firefox, p.webkit]
#         for browser_type in [p.chromium]:
#             browser = await browser_type.launch(headless=False)
#             page = await browser.new_page()
#             await page.goto('https://www.baidu.com')
#             print(await page.title())
#             await browser.close()
#
# asyncio.run(main())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年,LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词,诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”,指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下,以太坊联…

从Socket到WebSocket

前言 不知道大家在学习网络编程的时候都是怎样的一种方式,我谨以此文章来记录我自己从头开始学习C网络编程时的经历,中间有许多我自己的一些想法和思考。当然作为一个刚开始学习的新手来说,有些内容也许不那么正确,只是代表了我在…

flink 操作mongodb的例子

简述 该例子为从一个Collection获取数据然后插入到另外一个Collection中。 Flink的基本处理过程可以清晰地分为以下几个阶段: 数据源(Source): Flink可以从多种数据源中读取数据,如Kafka、RabbitMQ、HDFS等。Flink会…

通过 CXCR4 靶向纳米线修补细胞表面以抑制癌症转移

引用信息 文 章:Cell surface patching via CXCR4-targeted nanothreads for cancer metastasis inhibition. 期 刊:Nature Communications(影响因子:16.6) 发表时间:2024/3/29 作 者&#xff1…

基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生一体化服务平台系统演示 摘要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生综…

vivado 时序约束

时间限制 以下ISE设计套件时序约束可以表示为XDC时序约束 Vivado设计套件。每个约束描述都包含一个UCF示例和 等效的XDC示例。 在未直接连接到边界的网络上创建时钟时,UCF和XDC不同 的设计(如端口)。在XDC中,当在上定义带有create…

LwIP 之十 详解 TCP RAW 编程、示例、API 源码、数据流

我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 TCP RAW 编程则是指的直接使用 LwIP 的最底层 TCP 接口来直接实现应用层功能。这里先来一张图,对 LwIP 内部…

【JS重点知识02】栈、堆与数据类型 关系

一:栈堆空间分配区别: 1 栈:由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈; 简单数据类型存放在栈中 2 堆:存储复杂数据类型(对象),…

C#知识|通用数据访问类SQLHelper的编写

哈喽,你好啊,我是雷工! 前面学习了C#操作SQLServer数据库数据的增删改查, 《C#知识|通过ADO.NET实现应用程序对数据库的增、删、改操作。》 其中实现的过程中有很多代码是重复的,此时作为高阶程序员为了使代码更优雅,避免重复, 从而要考虑代码的复用技术,针对此案例中代…

vscode 编程工具配置Java开发环境

vs code 开发环境配置。 环境准备: 1. 安装JDK/安装maven/安装vs code 首先安装好vs code 之后,需要安装 Extension Pack for Java 这么个插件 配置maven,进入setting, 3:配置 maven安装目录,4&#xff1a…

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 📒1. 引言📒2. 多种机器学习算法的应用📒3. 机器学习在股票价格预测中的应用现状🎉数据收集与预处理🎉模型构建与训练🌈模型评估与预测🌞模型评估🌙模型预测⭐注意事项 &…

msvcp100.dll丢失怎样修复?几种快速有效修复msvcp100.dll丢失的方法

在使用电脑时是不是遇到过关于msvcp100.dll丢失文件丢失的情况?出现这样的情况有什么办法可以将丢失的msvcp100.dll文件快速恢复?今天的这篇文章就将教大家几种能够有效的解决msvcp100.dll丢失问题的方法。 方法一:重启电脑 重启电脑是一种简…

sqliteSQL基础

SQL基础 SQLite 数据库简介 SQLite 是一个开源的、 内嵌式的关系型数据库, 第一个版本诞生于 2000 年 5 月, 目前最高版本为 SQLite3。 下载地址: https://www.sqlite.org/download.html 菜鸟教程 : https://www.runoob.com/sqlite/sqlit…

项目VS运营

一、项目与运营的定义与区别 项目与运营是企业管理中的两个重要概念,尽管在实际运作中它们常被视为同义词,但它们之间存在明显的区别。 项目,指的是为达到特定目标,通过临时性、系统性、有计划的组织、协调、控制等系列活动&…

活动预告|6月13日Apache Flink Meetup·香港站

6 月 13 日 | 香港 | 线下 Apache Flink Meetup 的风吹到了香江之畔,Apache Flink 香港 Meetup 来啦!本次活动,我们邀请了来自阿里云的顶尖专家,帮助开发者全面了解 Apache Flink 的流批一体的数据处理能力,流式数据湖…

第100+9步 ChatGPT文献复现:ARIMA预测百日咳

基于WIN10的64位系统演示 一、写在前面 我们来继续换一篇文章来学习学习: 《BMC Public Health》杂志的2022年一篇题目为《ARIMA and ARIMA-ERNN models for prediction of pertussis incidence in mainland China from 2004 to 2021》文章的模拟数据做案例。 这…

源码编译安装LNMP

1、LNMP 包含:linux、Nginx、Mysql、php LNMP的工作原理 由客户端发送页面请求给Nginx,Nginx会根据location匹配用户访问请求的URL路径判断是静态还是动态,静态的一般是以 .html .htm .css .shtml结尾,动态的一般是以 .php .jsp…

【测试】linux快捷指令工具cxtool

简介 登录linux时,我们经常需要重复输入一些指令. 这个工具可以把这些指令预置,需要的时候鼠标一点,会自动按预置的字符敲击键盘,敲击出指令. 下载地址 https://download.csdn.net/download/bandaoyu/89379371 使用方法 1,编辑配置文件,自定义自己的快捷指令。 2…

PMP证书有用吗?到底要不要报名?

证书就是,适用者自有用,不适者无用。对于做管理之类的人士考个PMP必然有用。 首先PMP是什么? PMP指的是项目管理专业人士资格认证。那怎么来定义“项目”?“项目“可以简单的理解为:在给定的费用与时间约束范围之内,完成意向独立的、一次…

2024年5月软件设计师选择题答案(持续更新~)

题目1【考生回忆版】在计算机网络协议5层体系结构中,()工作在数据链路层 A.路由器 B.以太网交换机 C.防火墙 D.集线器 题目2【考生回忆版】软件交付之后,由于软硬件环境发生变化而对软件进行修改的行为属于()维护。 A.改善性 B.适应性 C.预防性 …