Playwright 自动化测试与爬虫快速入门指南

1. 环境配置

# 安装 Playwright
pip install playwright# 安装浏览器驱动
playwright install

2. 基础用法

2.1 基本结构

from playwright.sync_api import sync_playwrightdef main():with sync_playwright() as p:# 启动浏览器,headless=False 可以看到浏览器界面browser = p.chromium.launch(headless=False)context = browser.new_context()page = browser.new_page()# 访问网页page.goto('https://example.com')# 关闭浏览器browser.close()if __name__ == '__main__':main()

2.2 元素定位方法

# 1. 使用 Playwright Inspector(推荐)
# python -m playwright codegen https://example.com# 2. 常用选择器
page.click('text=按钮文字')           # 文本选择器
page.click('role=button')             # 角色选择器
page.click('.class-name')             # CSS 选择器
page.click('#id-name')                # ID 选择器
page.click('[data-testid=test-id]')   # 测试 ID 选择器
page.click('xpath=//button')          # XPath 选择器# 3. 组合选择器
page.click('.container >> text=点击这里')

2.3 基本操作

# 点击
page.click('button')# 输入文本
page.fill('input[name="username"]', '用户名')# 等待元素
page.wait_for_selector('.loading', state='hidden')# 获取文本
text = page.text_content('.content')# 截图
page.screenshot(path='screenshot.png')

3. 反爬虫策略

3.1 基础配置

def create_stealth_browser():with sync_playwright() as p:browser = p.chromium.launch(headless=True,args=['--disable-blink-features=AutomationControlled','--disable-infobars','--window-size=1920,1080','--start-maximized'])context = browser.new_context(viewport={'width': 1920, 'height': 1080},user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',java_script_enabled=True,ignore_https_errors=True)return browser, context

3.2 高级反爬策略

async def setup_stealth_page(context):page = await context.new_page()# 注入 JavaScript 以修改浏览器特征await page.add_init_script("""Object.defineProperty(navigator, 'webdriver', {get: () => undefined});""")# 设置地理位置await context.grant_permissions(['geolocation'])await page.set_geolocation({"latitude": 40.71, "longitude": -74.01})# 添加随机延时await page.set_default_timeout(random.randint(30000, 60000))return page# 随机延时函数
async def random_sleep():await asyncio.sleep(random.uniform(2, 5))

3.3 代理设置

def create_proxy_context(playwright):return playwright.chromium.launch(proxy={"server": "http://proxy-server:port","username": "user","password": "pass"})

3.4 Cookie 和 Session 管理

# 保存 Cookie
storage = context.storage_state(path="auth.json")# 使用已保存的 Cookie
context = browser.new_context(storage_state="auth.json")

4. 高级功能

4.1 请求拦截

def handle_route(route):if route.request.resource_type == "image":route.abort()  # 阻止加载图片else:route.continue_()page.route("**/*", handle_route)

4.2 监听网络请求

def log_request(request):print(f"URL: {request.url}")print(f"Method: {request.method}")print(f"Headers: {request.headers}")page.on('request', log_request)

4.3 异步模式

from playwright.async_api import async_playwright
import asyncioasync def main():async with async_playwright() as p:browser = await p.chromium.launch()page = await browser.new_page()await page.goto('https://example.com')await browser.close()asyncio.run(main())

5. 实战示例

5.1 登录自动化

async def login(page, username, password):await page.goto('https://example.com/login')await page.fill('input[name="username"]', username)await page.fill('input[name="password"]', password)# 等待验证码加载(如果有)await page.wait_for_selector('.captcha-image')# 处理验证码(示例)captcha = await solve_captcha(page)await page.fill('input[name="captcha"]', captcha)await page.click('button[type="submit"]')await page.wait_for_navigation()

5.2 数据采集

async def scrape_data(page):data = []# 随机延时await random_sleep()# 获取数据elements = await page.query_selector_all('.item')for element in elements:title = await element.text_content()data.append({'title': title,'timestamp': datetime.now()})return data

6. 最佳实践

  1. 错误处理
try:await page.click('button')
except TimeoutError:print("元素未找到")
except Exception as e:print(f"发生错误: {e}")
  1. 性能优化
# 禁用图片和样式表加载
await context.route('**/*.{png,jpg,jpeg,gif,css}', lambda route: route.abort())# 设置请求超时
page.set_default_navigation_timeout(30000)
  1. 定期清理资源
# 定期清理浏览器上下文
async def cleanup():contexts = browser.contextsfor context in contexts:await context.close()await browser.close()

7. 调试技巧

  1. 使用 page.pause() 进行调试

  2. 开启详细日志:设置环境变量 DEBUG=pw:api

  3. 保存页面快照:page.screenshot()

  4. 使用 Playwright Inspector 进行元素定位

8. 注意事项

  1. 遵守网站的 robots.txt 规则

  2. 合理控制请求频率

  3. 做好异常处理和重试机制

  4. 定期更新 User-Agent 和代理

  5. 数据及时保存,避免丢失

  6. 注意内存管理,及时释放资源

这个教程涵盖了 Playwright 的主要使用方法和反爬虫策略。建议在实际使用时,根据具体需求选择合适的功能组合,并且要注意遵守网站的使用条款和爬虫规则。

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

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

相关文章

等保测评中的常见问题总结

在信息安全等级保护测评(等保测评)过程中,企业常遇到的主要问题及其改进建议如下: ### 1. **安全责任不清** - **问题**:对于等保测评中涉及的安全责任,尤其是在使用云服务或外包服务时,企业…

Python学习从0到1 day28 Python 高阶技巧 ⑤ 多线程

若事与愿违,请相信,上天自有安排,允许一切如其所是 —— 24.11.12 一、进程、线程 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。 进程 进程:就…

LeetCode【0018】四数之和

本文目录 1 中文题目2 求解方法:双指针两层循环2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给一个由 n n n 个整数组成的数组 n u m s nums nums ,和一个目标值 t a r g e t target target 。请找出并返回满足下述全部条件且不…

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易👍👍👍 创建两个.c 一个.h 1:test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…

智慧社区可视化解决方案:科技引领社区服务与管理新篇章

随着社会的发展,智慧社区作为新型城镇化发展目标和社区服务体系建设的重要举措,正逐步改变着我们的生活方式。智慧社区通过综合运用现代科学技术,整合区域资源,提升社区治理和服务水平,为居民提供更为便捷、高效、安全…

Nginx 的 proxy_pass 使用简介

proxy_pass 是 Nginx 中一个非常重要的指令,用于将请求代理到后端服务器。本文将详细介绍 proxy_pass 的基本用法、配置示例以及一些高级用法。 1. 基本概念 1.1 proxy_pass 概述 proxy_pass 指令用于将请求转发到后端服务器。它可以用于 HTTP 和 Stream 模块&am…

在 WPF 中,如何实现数据的双向绑定?

在 WPF 中,数据绑定是一个非常重要的特性,它允许 UI 与数据源之间自动同步。双向绑定是一种常见的绑定方式,当数据源更新时,UI 会自动更新;同样,当 UI 中的元素(如文本框)发生改变时…

[Docker#4] 镜像仓库 | 部分常用命令

目录 什么是 Docker Registry 镜像仓库生活案例 镜像仓库分类 镜像仓库工作机制 常用的镜像仓库 私有仓库 镜像仓库命令 镜像命令[部分] 容器命令[部分] 什么是 Docker Registry 定义:Docker Registry 负责存储、管理和分发镜像,并提供了登录认…

嵌入式学习-网络高级-Day03

嵌入式学习-网络高级-Day03 基于webserver的工业数据采集 HTTP协议 http简介 http特点 http协议格式 客户端请求数据格式 请求行: 请求头部 空行: 请求体 服务器响应数据格式 webserver源码分析 postman的使用 整体流程分析 任务 html html简介 html标签…

LeetCode34:在排序数组中查找元素第一个和最后一个位置

原题地址:. - 力扣(LeetCode) 题目描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须…

2024年Python最新下载安装教程,附详细图文,持续更新

大家好,我是Java徐师兄,今天为大家带来的是Python3 的下载安装教程,适用于所有 Python3 版本,感兴趣的可以看一下 文章目录 简介一、Python的下载1 网盘下载地址 (下载速度比较快,推荐)2 官网下载地址 二、…

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移:早发现,早解决技术细节:静态代码分析与兼容性测试应用场景 按需加载:优化性能,提升用户体验技术细节:模块化与懒加载实现应用场景 应用加密:保护应用代码安全&…

苍穹外卖 数据可视化

将营业额、用户数据、订单数据、商品销量top10数据全部使用Apache Echarts可视化,展现在前端,后端只需要按照需要的格式,为前端提供数据即可。 ReportController package com.sky.controller.admin;import com.sky.result.Result; import co…

漏洞与攻击技术详解

漏洞与攻击技术是网络安全领域中的重要议题,它们之间存在着密切的关系。以下是对漏洞与攻击技术的详细分析: 一、漏洞的定义与分类漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,这些缺陷使得攻击者能够在未授权的情况下访…

kafka面试题解答(四)

5、消费者组和分区数之间的关系是怎样的? 消费者组数小于等于分区数,消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费。 6、kafka如何知道哪个消费者消费哪个分区? 生产者把数据发送给各个分区&…

鸿蒙华为商城APP案例

模拟器运行效果如下: 鸿蒙版APP-华为商城-演示视频

C++【STL容器系列(二)】vector的模拟实现

文章目录 1. vector的结构2. vector的默认成员函数2.1构造函数2.1.1 默认构造2.1.2 迭代器构造2.1.3 用n个val初始化构造 2.2 拷贝构造2.3 析构函数2.4 operator 3. vector iterator函数3.1 begin 和 cbegin函数3.2 end() 和 cend()函数 4. vector的小函数4.1 size函数4.2 capa…

git修改当前分支名称并推送到远程仓库

git修改当前分支名称并推送到远程仓库 在Git中修改当前分支的名称可以通过两种主要方式进行:直接在本地修改分支名称,或者如果你已经推送了分支到远程仓库,你也需要更新远程分支的名称。以下是详细步骤: 修改本地分支名称 查看当…

第 8 章 - Go语言 数组与切片

在Go语言中,数组和切片是两种非常基础且重要的数据结构。它们都用来存储一系列相同类型的元素,但是它们之间存在一些关键的区别。下面我们将详细探讨数组和切片的定义、使用以及切片的动态特性。 数组的定义和使用 定义 在Go语言中,数组是…

Linux开发讲课49--- Linux 启动过程分析

理解运转良好的系统对于处理不可避免的故障是最好的准备。 启动过程非常简单。内核在单核上以单线程和同步状态启动,似乎可以理解。但内核本身是如何启动的呢?initrd(initial ramdisk) 和引导程序(bootloader)具有哪些功能&#…