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

1. 环境配置

# 安装 Playwright
pip install playwright

# 安装浏览器驱动
playwright install

2. 基础用法

2.1 基本结构

from playwright.sync_api import sync_playwright

def 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 asyncio

async 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.contexts
    for 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 的主要使用方法和反爬虫策略。建议在实际使用时,根据具体需求选择合适的功能组合,并且要注意遵守网站的使用条款和爬虫规则。

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

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

相关文章

C语言数据结构与算法--简单实现栈的出栈与入栈

(一)栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表,如铁路调度。如下 图: (二)栈的的表现形式 栈有两种表示形式:栈的表示和实现、栈的 链式表示。 1.栈的表示…

数据分析-46-时间序列显示之如何精准可视化多个时间序列数据

文章目录 1 可视化1.1 可视化的重要性1.2 数据加载探索2 可视化单个时间序列2.1 无连接线的散点图2.2 带连接线的散点图2.3 无点的线图2.4 填充区域的线图3 可视化多个时间序列3.1 无连接的散点图(差的设计)3.2 带连接的散点图(好的设计)3.3 直接标注的曲线(优的设计)4 参考附录…

ubuntu24.04播放语音视频

直接打开ubuntu自带的video播放.mp4文件,弹窗报错如下: 播放此影片需要插件 MPEG-4 AAC 编码器安装方式: sudo apt install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt install ffmpeg验证AA…

python第七次作业

01.设计一个函数,可以传入一个或多个单词的字符串,并返回该字符串,但所有五个或更多字母的单词都前后颠倒 a input("输入:") print(a) #将一句话以空格为分界拆分为单个单词 b a.split(" ") ls_1 [] ls_2 []for i i…

精挑细选的五款GIS工具箱,你需要了解的优缺点

本文将为大家介绍五款功能各异的GIS工具箱,包括GISBox、QGIS、MapTiler、Saga GIS和Whitebox GAT。每款工具箱都有其独特的功能和应用场景,能够满足不同类型的GIS任务需求。无论是数据处理、空间分析、影像处理还是可视化需求,这些工具都能为…

Trimble X12三维激光扫描仪正在改变游戏规则【上海沪敖3D】

Trimble X12 三维激光扫描仪凭借清晰、纯净的点云数据和亚毫米级的精度正在改变游戏规则。今天的案例我们将与您分享,X12是如何帮助专业测量咨询公司OR3D完成的一个模拟受损平转桥运动的项目。 由于习惯于以微米为单位工作,专业测量机构OR3D是一家要求…

Appium配置2024.11.12

百度得知:谷歌从安卓9之后不再提供真机layout inspector查看,仅用于支持ide编写的app调试用 所以最新版android studio的android sdk目录下已经没有了布局查看工具... windows x64操作系统 小米k30 pro手机 安卓手机 Android 12 第一步&#xff1a…

ctfshow-web入门-反序列化(web271-web278)

目录 1、web271 2、web272 3、web273 4、web274 5、web275 6、web276 7、web277 8、web278 laravel 反序列化漏洞 1、web271 laravel 5.7&#xff08;CVE-2019-9081&#xff09; poc <?php namespace Illuminate\Foundation\Testing{use Illuminate\Auth\Generic…

005_ipc概述及信号量

【信号量】 在Linux系统中&#xff0c;信号量主要用于进程间的同步。Linux提供了两种类型的信号量&#xff1a;POSIX信号量和System V信号量&#xff0c;信号量&#xff08;Semaphore&#xff09;是一种同步机制&#xff0c;用于多线程或进程间的同步和互斥。信号量可以控制对…

SSA-CNN-LSTM-MATT多特征分类预测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

有手就会:java 环境变量配置 - 包含windows、macos、linux和vscode的详细配置步骤

java 环境变量配置 本文旨在帮助用户完成Java环境变量的配置&#xff0c;涵盖Windows、Linux和macOS三大操作系统。对于每个系统&#xff0c;不仅提供了通过命令行设置环境变量的方法&#xff0c;还介绍了如何在VSCode中进行相应配置以启动Java项目&#xff0c;确保开发者能够…

Error response from daemon:

指出在尝试解析 auth.docker.io&#xff08;Docker Hub 的一个域名&#xff0c;用于身份验证和镜像拉取&#xff09;时&#xff0c;DNS 查询超时了。这通常意味着你的 Docker 客户端无法通过配置的 DNS 服务器&#xff08;在这个案例中是 &#xff09;来解析域名 解决方案&…

127.WEB渗透测试-信息收集-ARL(18)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a; 这一行是对应使用的指纹 这个界面是springbot 如果存在漏洞&#xff0c;他的信息里面可…

字节、快手、Vidu“打野”升级,AI视频小步快跑

文&#xff5c;白 鸽 编&#xff5c;王一粟 继9月份版本更新之后&#xff0c;光锥智能从生数科技联合创始人兼CEO唐家渝朋友圈获悉&#xff0c;Vidu大模型将于本周再次进行版本升级&#xff0c;Vidu-1.5版本即将上线。 此版本更新方向仍是重点延伸大模型的泛化能力和主体…

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员&#xff0c;终于找到一个真正免费的&#xff0c;遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

CentOS下如何安装Nginx

1、下载nginx 官方网站 http://nginx.org 下载链接&#xff1a;http://nginx.org/download/ 下载完成后的安装包&#xff1a; 2、使用解压命令进行解压 tar -zxvf nginx-1.13.7.tar.gz3、在安装所需的安装环境 安装gcc环境 yum install gcc-c安装第三方开发包 - PCRE(P…

Springboot 不同版本的配置文件怎么知道差异

起因 今天配置一个 Springboot-3.3.5 的 redis-starter&#xff0c;结果一直提示链接不上 redis java.net.ConnectException: Connection refused我反复对比了新项目和老项目的 redis 配置文件格式&#xff0c;是一模一样的&#xff01; Debug 过程 配置中增加了如下配置 …

Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分&#xff0c;考虑后Diffusion Policy的重要性很高&#xff0c;加之后续还有一系列基于其的改进工作 故独立成本文&#xff0c;且写的过程中 …

计算机新手练级攻略——写博客

目录 计算机新手练级攻略——写博客计算机新手写博客的好处加深知识点建立个人IP可能有额外的收入 如何写博客确定博客主题方向选择博客平台学习基础技能一定要有互动性持之以恒&#xff0c;克服惰性Just do it&#xff01;&#xff01;&#xff01; 计算机新手练级攻略——写博…

哥德巴赫猜想渐行渐远

我现在的工作&#xff0c;表明经典分析可能出了问题&#xff0c;如此则连Vinogradov的三素数定理都不成立了&#xff0c;更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立&#xff0c;由于我指出Siegel定理不成立&#xff0c;陈景润和张益唐的工作就不成立。…