playwright 教程高级篇:掌握网页自动化与验证码处理等关键技术详解

Playwright 教程高级篇:掌握网页自动化与验证码处理等关键技术详解

本教程将带您一步步学习如何使用 Playwright——一个强大的浏览器自动化工具,来完成网页任务,例如提交链接并处理旋转验证码。我们将按照典型的自动化流程顺序,从启动浏览器到关闭浏览器,详细讲解每个步骤中用到的Playwright 技术,包括保存用户会话、规避网站检测、与用户交互、操作网页元素、截取图像、模拟人类行为等。此外,我们还会探讨如何处理iframe 和跨域问题,因为验证码常藏在这些复杂场景中。教程使用通用的术语和表达,确保无需特定代码背景也能理解,适合任何网页自动化项目。无论您是想自动化表单提交还是挑战验证码,本教程都为您提供准确、实用的Playwright 技能。


自动化流程的逐步解析

自动化流程通常包括启动浏览器、访问网页、确认用户登录、填写表单、触发验证码、解决验证码、验证结果并清理资源。以下按此顺序分解每个 Playwright 技术的应用,清晰说明其功能、用途和实现方法。


1. 启动浏览器并保存会话数据

这是什么步骤? 启动浏览器并配置一个存储空间,用于保存登录信息(如 cookies),以避免每次运行都需要重新登录。

Playwright 如何实现? Playwright 支持通过持久化上下文启动浏览器(例如 Chromium),将 cookies 和会话数据保存在本地文件夹中,区别于隐身模式(隐身模式关闭后清空数据)。

关键技术:

  • 持久化上下文:使用 playwright.chromium.launch_persistent_context,指定一个存储路径(如 ./browser_data),保存 cookies、浏览器缓存等数据,供后续运行复用。
  • 创建存储目录:通过 Python 的 os.path.exists 检查存储路径是否存在,若不存在则用 os.makedirs 创建,确保程序顺利运行。
  • 显示浏览器:设置 headless=False,让浏览器可见,便于观察操作或调试。
  • 自定义浏览器路径:通过 executable_path 指定特定的浏览器可执行文件,适用于需要特定版本的场景。
  • 浏览器配置
    • 使用 --disable-infobars 参数隐藏浏览器顶部提示条(如“浏览器正被自动化控制”)。
    • 移除 --enable-automation 参数,避免网站检测到自动化行为。
    • 设置真实的 user_agent(如模拟 Windows 上的 Chrome 浏览器),使浏览器行为更像普通用户。

示例代码:

from playwright.sync_api import sync_playwright
import oswith sync_playwright() as p:data_dir = "./browser_data"if not os.path.exists(data_dir):os.makedirs(data_dir)context = p.chromium.launch_persistent_context(user_data_dir=data_dir,headless=False,args=["--disable-infobars"],ignore_default_args=["--enable-automation"],user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0")

为什么重要? 保存会话数据就像给浏览器一个“记事本”,让它记住登录状态,省去重复登录的麻烦。合理的配置还能让浏览器显得更像真人操作,降低被网站拦截的风险。

如何应用? 启动持久化上下文时,指定一个固定路径存储数据。设置 headless=False 便于测试,并调整浏览器参数以模拟正常用户行为。这就像为浏览器准备一个舒适的家,存储它的记忆。


2. 复用浏览器的默认页面

这是什么步骤? 直接使用浏览器启动时自带的页面(标签页),而不是额外打开新页面。

Playwright 如何实现? 每次启动浏览器上下文时,Playwright 自动创建一个页面(类似于浏览器的一个标签页)。您可以直接使用这个默认页面进行操作,保持简洁高效。

关键技术:

  • 访问页面:通过 context.pages 获取所有打开的页面列表,默认页面通常是 pages[0]。
  • 复用页面:直接操作 context.pages[0],无需调用 context.new_page() 创建新页面。
  • 安全检查:确认 context.pages 不为空,以防浏览器未正确初始化。

示例代码:

if not context.pages:print("错误:未找到默认页面!")exit()
page = context.pages[0]
print("正在使用默认页面")

为什么重要? 复用默认页面就像用桌面上已有的纸张写字,无需再拿一张新的。节省资源的同时让脚本逻辑更清晰。

如何应用? 启动上下文后,取出 context.pages[0] 作为操作页面,并在代码中检查其是否存在。仅在需要多任务并行时才创建新页面。


3. 规避网站对自动化的检测

这是什么步骤? 调整浏览器属性,隐藏自动化脚本的痕迹,让网站认为您是普通用户。

Playwright 如何实现? Playwright 可以在浏览器中运行 JavaScript 代码,修改特定属性,结合启动时的配置,伪装成常规浏览器。

关键技术:

  • 隐藏 Webdriver:通过 JavaScript 将 navigator.webdriver 设置为 undefined,因为普通浏览器无此属性。
  • 模拟浏览器环境:添加 window.chrome 等属性,伪装成 Chrome 浏览器。
  • 伪造语言设置:将 navigator.languages 设置为常见值(如 [“zh-CN”, “zh”, “en”]),符合用户习惯。
  • 模拟插件:为 navigator.plugins 设置一个简单的数组,假装浏览器安装了扩展。
  • 运行 JavaScript:使用 page.evaluate 在浏览器中执行这些修改。

示例代码:

page.evaluate("""Object.defineProperty(navigator, 'webdriver', {get: () => undefined});window.chrome = window.chrome || {};Object.defineProperty(navigator, 'languages', {get: () => ['zh-CN', 'zh', 'en']});Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3]});
""")

为什么重要? 许多网站会检查浏览器属性以识别自动化脚本。这些修改让 Playwright 像一个普通用户,顺利通过检测,就像穿上合适的衣服融入人群。

如何应用? 在页面加载后,使用 page.

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

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

相关文章

数据结构(完)

树 二叉树 构建二叉树 int value;Node left;Node right;public Node(int val) {valueval;} 节点的添加 Node rootnull;public void insert(int num) {Node nodenew Node(num);if(rootnull) {rootnode;return;}Node index root;while(true) {//插入的节点值小if(index.value&g…

FastAPI与SQLAlchemy数据库集成与CRUD操作

title: FastAPI与SQLAlchemy数据库集成与CRUD操作 date: 2025/04/16 09:50:57 updated: 2025/04/16 09:50:57 author: cmdragon excerpt: FastAPI与SQLAlchemy集成基础包括环境准备、数据库连接配置和模型定义。CRUD操作通过数据访问层封装和路由层实现,确保线程安全和事务…

一个基于Django的写字楼管理系统实现方案

一个基于Django的写字楼管理系统实现方案 用户现在需要我用Django来编写一个写字楼管理系统的Web版本,要求包括增删改查写字楼的HTML页面,视频管理功能,本地化部署,以及人员权限管理,包含完整的代码结构和功能实现&am…

mongodb在window10中创建副本集的方法,以及node.js连接副本集的方法

创建Mongodb的副本集最好是新建一个文件夹,如D:/data,不要在mongodb安装文件夹里面创建副本集,虽然这样也可以,但是容易造成误操作或路径混乱;在新建文件夹里与现有 MongoDB 数据隔离,避免误操作影响原有数…

Maven 多仓库与镜像配置全攻略:从原理到企业级实践

Maven 多仓库与镜像配置全攻略:从原理到企业级实践 一、核心概念:Repository 与 Mirror 的本质差异 在 Maven 依赖管理体系中,repository与mirror是构建可靠依赖解析链的两大核心组件,其核心区别如下: 1. Repositor…

STM32 四足机器人常见问题汇总

文章不介绍具体参数,有需求可去网上搜索。 特别声明:不论年龄,不看学历。既然你对这个领域的东西感兴趣,就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题:提出问题时,应说明是哪款产品&a…

MySQL 中 `${}` 和 `#{}` 占位符详解及面试高频考点

文章目录 一、概述二、#{} 和 ${} 的核心区别1. 底层机制代码示例 2. 核心区别总结 三、为什么表名只能用 ${}?1. 预编译机制的限制2. 动态表名的实现 四、安全性注意事项1. ${} 的风险场景2. 安全实践 五、面试高频考点1. 基础原理类问题**问题 1**:**问…

C语言编译预处理2

#include <XXXX.h>和#include <XXXX.c> #include "XXXX.h" 是 C 语言中一条预处理指令 #include <XXXX.h>&#xff1a;这种形式用于包含系统标准库的头文件。预处理器会在系统默认的头文件搜索路径中查找XXXX.h 文件。例如在 Linux 系统中&#…

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端&#xff0c;用于管理 Elasticsearch 集群中的数据&#xff0c;完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色&#xff1a; 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…

Git提交规范及最佳实践

Git 提交规范通常是为了提高代码提交的可读性、可维护性和自动化效率&#xff08;如生成 ChangeLog&#xff09;。以下是常见的 Conventional Commits 规范&#xff0c;结合社区最佳实践总结而成&#xff1a; 1. 提交格式 每次提交的 commit message 应包含三部分&#xff1a;…

Ubuntu中snap

通过Snap可以安装众多的软件包。需要注意的是&#xff0c;snap是一种全新的软件包管理方式&#xff0c;它类似一个容器拥有一个应用程序所有的文件和库&#xff0c;各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题&#xff0c;使应用程序之…

android studio 运行java main报错

运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址&#xff1a;https://www.openssl.org/source/zlib下载地址&#xff1a;http://www.zlib.net/今天演示从7.4升级…

Mac M1管理多个Node.js版本

目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…

Unity中国战略调整简讯:Unity6下架 团结引擎接棒

Unity中国战略调整简讯&#xff1a;Unity6下架 团结引擎接棒 免费版 2025年4月9日 —— Unity中国宣布自即日起&#xff0c;中国大陆及港澳地区停止提供Unity 6及后续版本下载与服务&#xff0c;相关功能由国产引擎“团结引擎”承接。国际版2022 LTS及更早版本仍由Unity中国维护…

TestNG 单元测试详解

1、测试环境 jdk1.8.0 121 myeclipse-10.0-offline-installer-windows.exe TestNG 插件 org.testng.eclipse 6.8.6.20130607 0745 2、介绍 套件(suite):由一个 XML 文件表示,通过<suite>标签定义,包含一个或更多测试(test)。测试(test):由<test>定义&#xf…

C复习(主要复习)

指针和数组 指针数组是一个数组&#xff0c;数组的每个元素都是指针。它适用于需要存储多个指针的场景&#xff0c;如字符串数组。数组指针是一个指针&#xff0c;指向一个数组。它适用于需要传递整个数组给函数或处理多维数组的场景。 函数指针&#xff1a;函数指针的定义需要…

探索大语言模型(LLM):定义、发展、构建与应用

文章目录 引言大规模语言模型的基本概念大规模语言模型的发展历程1. 基础模型阶段&#xff08;2018年至2021年&#xff09;2. 能力探索阶段&#xff08;2019年至2022年&#xff09;3. 突破发展阶段&#xff08;以2022年11月ChatGPT的发布为起点&#xff09; 大规模语言模型的构…

5. k8s 之 pod原理与使用

Kubernetes Pod 原理详解 1. Pod 的部署方式 Pod 是 Kubernetes 的最小调度单元&#xff0c;其部署方式分为 声明式&#xff08;YAML&#xff09; 和 命令式&#xff08;kubectl&#xff09; 两种&#xff1a; (1) 声明式部署&#xff08;推荐&#xff09; 通过 YAML 文件定…

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…