python爬虫利器之Playwright

Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium、Pyppeteer 等,都可以驱动浏览器进行各种自动化操作。它的功能也非常强大,对市面上的主流浏览器都提供了支持,API 功能简洁又强大。虽然诞生比较晚,但是现在发展得非常火热。

1. Playwright 的特点

  • Playwright 支持当前所有主流浏览器,包括 Chrome 和 Edge(基于 Chromium)、Firefox、Safari(基于 WebKit) ,提供完善的自动化控制的 API。
  • Playwright 支持移动端页面测试,使用设备模拟技术可以使我们在移动 Web 浏览器中测试响应式 Web 应用程序。
  • Playwright 支持所有浏览器的 Headless 模式和非 Headless 模式的测试。
  • Playwright 的安装和配置非常简单,安装过程中会自动安装对应的浏览器和驱动,不需要额外配置 WebDriver 等。
  • Playwright 提供了自动等待相关的 API,当页面加载的时候会自动等待对应的节点加载,大大简化了 API 编写复杂度。

本节我们就来了解下 Playwright 的使用方法。

2. 安装

要使用 Playwright,需要 Python 3.7 版本及以上,请确保 Python 的版本符合要求。

要安装 Playwright,可以直接使用 pip3,命令如下:

pip3 install playwright

安装完成之后需要进行一些初始化操作:

playwright install

这时候 Playwrigth 会安装 Chromium, Firefox and WebKit 浏览器并配置一些驱动,我们不必关心中间配置的过程,Playwright 会为我们配置好。

具体的安装说明可以参考:https://setup.scrape.center/playwright。

安装完成之后,我们便可以使用 Playwright 启动 Chromium 或 Firefox 或 WebKit 浏览器来进行自动化操作了。

3. 基本使用

Playwright 支持两种编写模式,一种是类似 Pyppetter 一样的异步模式,另一种是像 Selenium 一样的同步模式,我们可以根据实际需要选择使用不同的模式。

同步方式:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.new_page()
        page.goto('https://www.baidu.com')
        page.screenshot(path=f'screenshot-{browser_type.name}.png')  # 截图保存(无是否无头无关)
        print(page.title())  # 页面标题
        browser.close()

 

 

异步方式:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        for browser_type in [p.chromium, p.firefox, p.webkit]:
            browser = await browser_type.launch()
            page = await browser.new_page()
            await page.goto('https://www.baidu.com')
            await page.screenshot(path=f'screenshot-{browser_type.name}.png')
            print(await page.title())
            await browser.close()

asyncio.run(main())

 

 

 

 

示例:

1)

from playwright.sync_api import sync_playwright


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    page.goto("https://www.cnblogs.com/yoyoketang/")
    print(page.content())

 

说明:

1. page.content() 获取整个页面的HTML的内容

 

2)

from playwright.sync_api import sync_playwright


with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    page.goto("https://www.cnblogs.com/yoyoketang/")
    # print(page.content())
    # 获取某个元素的HTML
    blog = page.locator('#blogTitle')
    print(blog.inner_html())
   print(blog.inner_text())

说明:

page.locator: 定位到某个标签元素

.inner_html(): 包含HTML的内容

.inner_text(): 去除HTML之后的纯文本内容(会被格式化, 依赖于页面的展示,只有展示的才会获取到)

 

.text_content: 获取某个元素内的所有文本内容, 包含子元素内容,隐藏元素

 

 

3)

from playwright.sync_api import sync_playwright



with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    page.goto("https://www.cnblogs.com/yoyoketang/")
    # print(page.content())
    # 获取某个元素的HTML
    blog = page.locator('#blogTitle')
    # print(blog.inner_html())
    
    # print(blog.inner_text())
    # print(blog.text_content())

    print(blog.all_inner_texts())
    print(blog.all_text_contents())

all_inner_texts() 和 all_text_contents() 也是用于获取页面上的文本,但是返回的是list列表

 

posted @ 2024-01-16 09:08  X-Wolf  阅读(113)  评论(0编辑  收藏  举报