当前位置: 首页 > article >正文

一个非常好用便捷的web自动化爬虫工具Playwright

相比于selenium,Playwright不需要在本地安装浏览器和对应版本的chromedriver,之前一度苦恼谷歌浏览器经常自动更新,需要更换旧的浏览器才有对应的driver,现在不需要考虑浏览器,这点非常nice,以及Playwright可以在本地电脑同时运行几个浏览器,很方便。

Playwright 是一个用于自动化浏览器操作的库,可以帮助你通过代码控制浏览器进行抓取、测试等任务。它的主要特点是支持多种浏览器(Chromium, Firefox, WebKit)并提供了强大的功能,像模拟用户操作、处理动态页面、截图、录屏等。

Playwright的基本用法:

  1. 安装 Playwright: 使用 pip 安装 Playwright:

    pip install playwright
    playwright install  # 安装支持的浏览器
    
  2. 基础代码示例: Playwright 的操作非常简单,下面是一个基本的爬虫示例:

    from playwright.sync_api import sync_playwright
    
    with sync_playwright() as p:
        # 启动浏览器
        browser = p.chromium.launch(headless=False)  # headless=False 是为了看到浏览器界面
        page = browser.new_page()
    
        # 打开页面
        page.goto('https://example.com')
    
        # 获取页面标题
        title = page.title()
        print(f'Title: {title}')
    
        # 获取网页内容
        content = page.content()
        print(content)
    
        # 关闭浏览器
        browser.close()
    
  3. 异步版本: Playwright 也支持异步操作,可以使用 asyncawait 进行异步编程,来提高抓取效率:

    from playwright.async_api import async_playwright
    import asyncio
    
    async def run():
        async with async_playwright() as p:
            browser = await p.chromium.launch(headless=False)
            page = await browser.new_page()
            await page.goto('https://example.com')
            title = await page.title()
            print(f'Title: {title}')
            await browser.close()
    
    asyncio.run(run())
    
  4. 处理动态内容: Playwright 可以模拟复杂的用户交互,比如点击按钮、滚动页面、输入文本等,甚至能处理 SPA(单页应用)的动态加载。

    例如,模拟点击并等待新页面加载:

    page.click('button#loadMore')
    page.wait_for_selector('div#newContent')
    
  5. 截图与录屏: Playwright 可以轻松地进行截图和录屏操作。

    截图:

    page.screenshot(path='screenshot.png')
    

    录屏:

    page.start_video(path='video.mp4')
    
  6. Scrapy 与 Playwright 集成: Scrapy 和 Playwright 可以结合使用,特别适合处理动态内容的抓取。使用 scrapy-playwright 插件,可以让 Scrapy 调用 Playwright 来渲染和抓取动态页面。

    安装 scrapy-playwright

    pip install scrapy-playwright
    

    然后在 Scrapy 项目中启用 Playwright 中间件。

    配置 settings.py

    DOWNLOADER_MIDDLEWARES = {
        'scrapy_playwright.middlewares.ScrapyPlaywrightMiddleware': 800,
    }
    
    PLAYWRIGHT_BROWSER_TYPE = 'chromium'  # 或 'firefox', 'webkit'
    PLAYWRIGHT_LAUNCH_OPTIONS = {'headless': False}  # 非无头模式
    

    然后,在你的爬虫代码中使用 Playwright:

    import scrapy
    from scrapy_playwright.page import PageMethod
    
    class MySpider(scrapy.Spider):
        name = 'myspider'
    
        async def parse(self, response):
            # 你可以像普通的 Scrapy 响应那样使用 Playwright 页面
            page = await response.follow('https://example.com', callback=self.parse_page)
            yield page
    
        async def parse_page(self, response):
            # 在这里进行动态页面的抓取
            title = response.css('title::text').get()
            yield {'title': title}
    

Playwright 的强大之处在于它能有效处理现代网站的动态加载,尤其是像 SPA 这样的页面,你只需要少量代码就可以实现复杂的浏览器行为模拟。

Playwright 还提供了一些其他有用的指令和选项,像 --save-storage--load-storage,这些指令用于处理浏览器的存储数据,特别是 cookies 和本地存储(localStorage、sessionStorage)。这些功能对于模拟用户登录状态或在多次运行中保持会话非常有用。

以下是一些其他常见的 playwright 命令行选项和指令:

1. playwright codegen --save-storage

  • 用途:将浏览器的存储数据(cookies 和 localStorage)保存到指定文件中。
  • 使用场景:如果你登录了某个网站,想在下次使用时避免重新登录,可以通过这个选项保存浏览器的存储状态。

命令格式

playwright codegen --save-storage=<path-to-file> [URL]

示例

playwright codegen --save-storage=storage.json https://example.com

这条命令会启动一个浏览器,加载指定的 URL,然后登录账号之后,手动关闭浏览器,指令将在浏览器会话结束后将 cookies 和 localStorage 保存到 storage.json 文件中。

2. playwright codegen --load-storage

  • 用途:在启动时加载之前保存的存储数据(例如 cookies 和 localStorage)。这对于模拟登录状态非常有用。
  • 使用场景:你可以在一个爬虫脚本中使用这个选项来加载之前保存的会话数据,从而跳过登录流程,直接开始抓取数据。

命令格式

playwright codegen --load-storage=<path-to-file> [URL]

示例

playwright codegen --load-storage=storage.json https://example.com

这条命令会加载之前保存的 storage.json 文件中的 cookies 和 localStorage 数据,然后启动浏览器并直接访问页面,从而实现跳过登录等操作。

3. playwright codegen --headless

  • 用途:以无头模式启动浏览器,通常用于不需要显示浏览器界面的情况。
  • 使用场景:在生产环境或后台任务中,你可能不需要浏览器的 UI,只希望浏览器在后台运行。

命令格式

playwright codegen --headless [URL]

示例

playwright codegen --headless https://example.com

这条命令会启动浏览器,但不会显示浏览器窗口。适用于后台自动化任务。

4. playwright codegen --record-har

  • 用途:记录 HTTP 请求和响应的数据,生成 HAR 文件。
  • 使用场景:对于性能分析、抓取网站数据等任务,可以记录所有的网络请求,并保存为 HAR 格式文件。

命令格式

playwright codegen --record-har=<path-to-har-file> [URL]

示例

playwright codegen --record-har=network.har https://example.com

这条命令会记录页面加载过程中所有的网络请求,并将它们保存为 network.har 文件。HAR 文件可以用于分析请求性能、请求详情等。

5. playwright codegen --lang

  • 用途:指定生成代码的语言。Playwright 默认生成 JavaScript 代码,但你可以通过此选项指定生成 Python、TypeScript 等语言的代码。
  • 使用场景:如果你希望生成特定语言的 Playwright 代码,可以使用此选项。

命令格式

playwright codegen --lang=<language> [URL]

示例

playwright codegen --lang=python https://example.com

这条命令会生成 Python 格式的 Playwright 脚本。

6. playwright codegen --trace

  • 用途:启用 Playwright 追踪(trace)功能,记录浏览器的操作轨迹。追踪数据可以帮助你分析浏览器的行为,调试脚本。
  • 使用场景:当你需要调试或记录浏览器操作过程时,追踪功能非常有用。

命令格式

playwright codegen --trace [URL]

示例

playwright codegen --trace https://example.com

这条命令会在你执行操作时记录追踪数据,之后你可以查看每一步操作的详细日志。

7. playwright codegen --timeout

  • 用途:设置等待操作的超时时间。比如,在页面加载时,如果某个元素未能及时出现,Playwright 会等待直到超时或者元素出现。
  • 使用场景:在一些网络不稳定或页面加载较慢的情况下,设置合适的超时时间可以避免超时错误。

命令格式

playwright codegen --timeout=<milliseconds> [URL]

示例

playwright codegen --timeout=10000 https://example.com

这条命令会将超时时间设置为 10 秒,等待页面加载或元素的出现。

是的,Playwright 提供了许多常用的指令来帮助你进行浏览器操作。以下是一些常见的 Playwright 指令及其功能介绍:

1. 启动和关闭浏览器

  • launch():启动一个浏览器实例。可以选择无头模式或可视模式。

    browser = p.chromium.launch(headless=True)  # 无头模式
    browser = p.chromium.launch(headless=False)  # 可视模式
    
  • close():关闭浏览器实例。

    browser.close()
    

2. 页面操作

  • new_page():创建一个新的标签页。

    page = browser.new_page()
    
  • goto(url):导航到指定的 URL。

    page.goto('https://example.com')
    
  • reload():重新加载页面。

    page.reload()
    
  • close():关闭当前页面(标签页)。

    page.close()
    

3. 等待和同步

  • wait_for_selector(selector):等待某个元素出现在页面上,适用于动态内容加载。

    page.wait_for_selector('div#content')
    
  • wait_for_timeout(ms):等待指定的毫秒数。

    page.wait_for_timeout(2000)  # 等待 2 秒
    
  • wait_for_navigation():等待页面完成导航(即加载完毕)。

    page.wait_for_navigation()
    

4. 元素操作

  • click(selector):点击指定的元素。

    page.click('button#submit')
    
  • type(selector, text):向指定的输入框输入文本。

    page.type('input#search', 'Playwright')
    
  • fill(selector, text):向指定的输入框填写文本(比 type 更直接)。

    page.fill('input#email', 'test@example.com')
    
  • select_option(selector, value):选择下拉框中的某个选项。

    page.select_option('select#dropdown', 'option_value')
    
  • hover(selector):将鼠标悬停在指定元素上。

    page.hover('button#dropdown')
    
  • evaluate(script):执行 JavaScript 代码并返回结果。

    result = page.evaluate('() => window.location.href')
    print(result)  # 打印当前页面的 URL
    

5. 获取页面内容

  • title():获取页面的标题。

    title = page.title()
    print(title)
    
  • content():获取页面的 HTML 内容。

    content = page.content()
    print(content)
    
  • inner_html(selector):获取指定元素的 HTML 内容。

    html = page.inner_html('div#content')
    print(html)
    
  • inner_text(selector):获取指定元素的文本内容。

    text = page.inner_text('h1')
    print(text)
    
  • text_content(selector):获取指定元素的文本(包含空格和换行)。

    text = page.text_content('p#description')
    print(text)
    

6. 截图和录屏

  • screenshot(path):对页面截图并保存为图片文件。

    page.screenshot(path='screenshot.png')
    
  • start_video(path):开始录制页面的视频。

    page.start_video(path='video.mp4')
    
  • stop_video():停止视频录制。

    page.stop_video()
    

7. 多页面与浏览器上下文操作

  • new_browser_context():创建一个新的浏览器上下文,可以模拟多个用户会话。

    context = browser.new_context()
    page = context.new_page()
    
  • close_browser_context():关闭浏览器上下文。

    context.close()
    
  • cookies():获取当前浏览器上下文的 cookies。

    cookies = context.cookies()
    print(cookies)
    
  • add_cookies(cookies):向浏览器上下文中添加 cookies。

    context.add_cookies([{'name': 'key', 'value': 'value', 'domain': 'example.com'}])
    

8. 调试与开发者工具

  • pause():暂停脚本执行,可以帮助你调试。

    page.pause()
    
  • screenshot(path, full_page=True):对整个页面进行截图,包含滚动区域。

    page.screenshot(path='full_page_screenshot.png', full_page=True)
    

9. 浏览器信息

  • version():获取浏览器的版本信息。
    version = browser.version()
    print(version)
    

10. 自动化文件上传

  • set_input_files(selector, file_path):模拟文件上传。
    page.set_input_files('input[type="file"]', '/path/to/file.jpg')
    

小结

Playwright 提供了大量的 API 供我们与浏览器交互,从简单的网页导航到复杂的用户行为模拟,再到与浏览器环境(如 cookies、网络请求等)进行交互,都可以通过这些指令完成。对于抓取动态网页和进行 Web 自动化测试,Playwright 是一个非常强大的工具。


http://www.kler.cn/a/569860.html

相关文章:

  • 大数据分析中的机器学习基础:从原理到实践
  • Dwall 动态壁纸自动匹配
  • 蓝桥杯深秋的苹果
  • 数据图表ScottPlot.WPF用法示例
  • HTTP 协议的发展历程:从 HTTP/1.0 到 HTTP/2.0
  • 【Linux】TCP协议
  • VScode C语言学习开发环境;运行提示“#Include错误,无法打开源文件stdio.h”
  • 计算机毕设-基于springboot的社团管理系统的设计与实现(附源码+lw+ppt+开题报告)
  • 小红的回文子串
  • 企业微信获取用户信息
  • MySQL增删改查(进阶)
  • 时序论文41 | Medformer:基于多粒度patch的时序分类模型
  • [含文档+PPT+源码等]精品基于Python实现的微信小程序的在线医疗咨询系统
  • 汽车智能钥匙低频PKE天线
  • 基于C#的CANoe CLR Adapter开发指南
  • 达梦数据库如何收集表和索引的统计信息
  • C# 使用 Newtonsoft.Json 序列化和反序列化对象实例
  • 线上JVM OOM问题,如何排查和解决?
  • Linux运维——软件管理
  • Ubuntu 20.04环境下安装cuda、cuDNN和pytorch