ZetCode

Python Playwright

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何使用 Playwright 在 Python 中自动化浏览器。

Playwright

Playwright 是由 Microsoft 创建的跨浏览器自动化库。它支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。

Playwright 可用于 Node、Python、.NET 和 JVM。

Playwright 允许在无头模式(默认模式)下使用浏览器,该模式在没有 UI 的情况下工作。这对于脚本编写非常有用。

$ pip install --upgrade pip
$ pip install playwright
$ playwright install

我们安装 Playwright 库和浏览器驱动程序。

Python Playwright 获取标题

在第一个示例中,我们获取网页的标题。

main.py
#!/usr/bin/python

from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:

    webkit = playwright.webkit

    browser = webkit.launch()
    page = browser.new_page()

    url = 'http://webcode.me'
    page.goto(url)

    title = page.title()
    print(title)

    browser.close()

该示例检索并打印一个小型网页的标题。

from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:
...

我们以同步方式使用 Playwright。

webkit = playwright.webkit

我们使用 Webkit 驱动程序。

browser = webkit.launch()
page = browser.new_page()

我们启动浏览器并创建一个新页面。默认浏览器模式是无头的;也就是说,不显示 UI。

url = 'http://webcode.me'
page.goto(url)

我们导航到指定的 URL。

title = page.title()
print(title)

我们获取标题并打印它。

$ ./main.py
My html page

Python Playwright 创建截图

在接下来的示例中,我们创建一个网页截图。

main.py
#!/usr/bin/python

from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:

    webkit = playwright.webkit
    browser = webkit.launch()
    page = browser.new_page()

    url = 'http://webcode.me'
    page.goto(url)

    page.screenshot(path='shot.png')
    browser.close()

使用 screenshot 函数创建截图;path 属性指定文件名。

Python Playwright 异步示例

下一个示例是前一个示例的异步版本。

main.py
#!/usr/bin/python

import asyncio

from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as playwright:

        webkit = playwright.webkit
        browser = await webkit.launch()
        page = await browser.new_page()

        url = 'http://webcode.me'
        await page.goto(url)
        await page.screenshot(path='shot.png')

        await browser.close()

asyncio.run(main())

对于异步版本,我们使用 async/await 关键字和 asyncio 模块。

Python Playwright 设置 HTTP 标头

使用 set_extra_http_headers 函数,我们可以为客户端指定 HTTP 标头。

main.py
#!/usr/bin/python

from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:

    webkit = playwright.webkit
    browser = webkit.launch()
    page = browser.new_page()

    page.set_extra_http_headers({"User-Agent": "Python program"})

    url = 'http://webcode.me/ua.php'
    page.goto(url)

    content = page.text_content('*')
    print(content)

    browser.close()

我们将 User-Agent 标头设置为请求,然后导航到 http://webcode.me/ua.php URL,该 URL 将 User-Agent 标头返回给客户端。

$ ./main.py 
Python program

Python Playwright 点击元素

在下一个示例中,我们使用 click 点击 button 元素。点击按钮后,会在输出 div 元素中显示一条文本消息。

main.py
#!/usr/bin/python

import time
from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:

    webkit = playwright.webkit
    browser = webkit.launch(headless=False)
    page = browser.new_page()

    url = 'http://webcode.me/click.html'
    page.goto(url)

    time.sleep(2)

    btn = page.locator('button');
    btn.click()

    output = page.locator('#output');
    print(output.text_content())

    time.sleep(1)

    browser.close()

该示例启动浏览器。

browser = webkit.launch(headless=False)

要启动 UI,我们将 headless 选项设置为 False

time.sleep(2)

我们稍微放慢程序的速度。

btn = page.locator('button');
btn.click()

我们使用 locator 定位按钮元素,并使用 click 点击它。

output = page.locator('#output');
print(output.text_content())

我们定位输出元素并获取其文本内容。

$ ./main.py
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 ...

Python Playwright 定位元素

在下一个示例中,我们使用 locator 查找元素。

main.py
#!/usr/bin/python

from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:

    webkit = playwright.webkit
    browser = webkit.launch()
    page = browser.new_page()

    url = 'http://webcode.me/os.html'
    page.goto(url)

    els = page.locator('ul li').all();

    for e in els:
        print(e.text_content())

    browser.close()

程序查找所有 li 标签并打印其内容。

$ ./main.py
Solaris
FreeBSD
Debian
NetBSD
Windows

来源

Python Playwright 文档

在本文中,我们使用了 Python Playwright 库。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程