相比于selenium,Playwright不需要在本地安装浏览器和对应版本的chromedriver,之前一度苦恼谷歌浏览器经常自动更新,需要更换旧的浏览器才有对应的driver,现在不需要考虑浏览器,这点非常nice,以及Playwright可以在本地电脑同时运行几个浏览器,很方便。
Playwright 是一个用于自动化浏览器操作的库,可以帮助你通过代码控制浏览器进行抓取、测试等任务。它的主要特点是支持多种浏览器(Chromium, Firefox, WebKit)并提供了强大的功能,像模拟用户操作、处理动态页面、截图、录屏等。
Playwright的基本用法:
-
安装 Playwright: 使用 pip 安装 Playwright:
pip install playwright playwright install # 安装支持的浏览器
-
基础代码示例: 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()
-
异步版本: Playwright 也支持异步操作,可以使用
async
和await
进行异步编程,来提高抓取效率: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())
-
处理动态内容: Playwright 可以模拟复杂的用户交互,比如点击按钮、滚动页面、输入文本等,甚至能处理 SPA(单页应用)的动态加载。
例如,模拟点击并等待新页面加载:
page.click('button#loadMore') page.wait_for_selector('div#newContent')
-
截图与录屏: Playwright 可以轻松地进行截图和录屏操作。
截图:
page.screenshot(path='screenshot.png')
录屏:
page.start_video(path='video.mp4')
-
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 是一个非常强大的工具。