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

news/2025/3/1 3:15:34/

相比于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_playwrightwith 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 asyncioasync 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 PageMethodclass MySpider(scrapy.Spider):name = 'myspider'async def parse(self, response):# 你可以像普通的 Scrapy 响应那样使用 Playwright 页面page = await response.follow('https://example.com', callback=self.parse_page)yield pageasync 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.ppmy.cn/news/1575666.html

相关文章

Ubuntu22上安装MySQL8启动成功,远程无法连接

解决步骤: 1.首先验证网络是否通 ping Linux服务器ip 2.如果网络通&#xff0c;验证是否开放了访问 2.1在服务器上使用 sudo mysql -u root -p 并输入密码连接到mysql 2.2执行 SELECT User, Host FROM mysql.user; 查找一个Host列为’%的用户&#xff0c;这表示允许从任何主机连…

【无人集群系列---无人机集群编队算法】

【无人集群系列---无人机集群编队算法】 一、核心目标二、主流编队控制方法1. 领航-跟随法&#xff08;Leader-Follower&#xff09;2. 虚拟结构法&#xff08;Virtual Structure&#xff09;3. 行为法&#xff08;Behavior-Based&#xff09;4. 人工势场法&#xff08;Artific…

实现 Leaflet 多类型点位标记与聚合功能的实战经验分享

在现代的地理信息系统&#xff08;GIS&#xff09;应用中&#xff0c;地图功能是不可或缺的一部分。无论是展示商业网点、旅游景点还是公共服务设施&#xff0c;地图都能以直观的方式呈现数据。然而&#xff0c;当数据量较大时&#xff0c;地图上可能会出现大量的标记点&#x…

校园快递平台系统(小程序论文源码调试讲解)

第4章 系统设计 用户对着浏览器操作&#xff0c;肯定会出现某些不可预料的问题&#xff0c;但是不代表着系统对于用户在浏览器上的操作不进行处理&#xff0c;所以说&#xff0c;要提前考虑可能会出现的问题。 4.1 系统设计思想 系统设计&#xff0c;肯定要把设计的思想进行统…

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

白帽黑客系列教程之Windows驱动开发(64位环境)入门教程(二)

为什么要写这篇文章呢&#xff1f; 作为一名白帽黑客&#xff0c;如果想要学习ROOTKIT攻防技术&#xff0c;就必须要有能力进行驱动开发&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 在Windows操作系统的64位环境中&#xff0c;进行ROOTKIT攻…

【11】RUST使用cargo组织crate

文章目录 使用cargo组织crate重导出编译文档生成测试 cargo组织工作空间 TODOcrate.io账号 TODO暂时不看发布crate 使用cargo组织crate 重导出 在模块顶部使用pub use self::重导出&#xff0c;方便使用模块时候直接使用use mod_X::xxx。从而隐藏crate内部模块的结构。方便向…

边缘计算收益低的三大指标

边缘计算收益低的三大指标主要包括以下方面&#xff1a; 1. 资源贡献不足&#xff1a; 边缘计算的收益通常基于所提供的带宽、存储和计算资源来计算。如果设备的网络带宽有限、在线时间短或提供的存储容量较小&#xff0c;可能无法满足平台设定的最低贡献标准&#xff0c;从而导…