【无标题】使用 Playwright 实现跨 Chromium、Firefox、WebKit 浏览器自动化操作
环境安装
首先要安装 Playwright 及其依赖库,命令如下:
Bash
pip install playwright pillow pytesseract
playwright install
这里安装了 Playwright、Pillow(用于图像处理)、pytesseract(用于 OCR 识别),并安装了所需的浏览器驱动2。
代码示例
以下是一个简单的使用 Playwright 实现跨浏览器自动化操作的 Python 代码示例:
Python
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
# 启动 Chromium 浏览器
browser_chromium = await p.chromium.launch(headless=False)
page_chromium = await browser_chromium.new_page()
await page_chromium.goto("https://www.example.com")
await page_chromium.screenshot(path="chromium_screenshot.png")
await browser_chromium.close()
# 启动 Firefox 浏览器
browser_firefox = await p.firefox.launch(headless=False)
page_firefox = await browser_firefox.new_page()
await page_firefox.goto("https://www.example.com")
await page_firefox.screenshot(path="firefox_screenshot.png")
await browser_firefox.close()
# 启动 WebKit 浏览器
browser_webkit = await p.webkit.launch(headless=False)
page_webkit = await browser_webkit.new_page()
await page_webkit.goto("https://www.example.com")
await page_webkit.screenshot(path="webkit_screenshot.png")
await browser_webkit.close()
asyncio.run(main())
在上述代码中,使用 async_playwright
异步启动不同的浏览器(Chromium、Firefox、WebKit),然后打开指定的网页并进行截图,最后关闭浏览器。
反爬与动态内容处理
现代网站存在诸多反爬机制和动态内容,Playwright 可以很好地应对这些问题。例如,对于 JS 动态渲染与加载的页面,Playwright 会自动加载页面并等待 JS 执行;对于 JS 挑战(如滑动验证),可以模拟真实用户滑动或点击操作;对于图片验证码识别,可以截图验证码区域,利用 OCR 自动识别;对于登录态维护,可以使用 Playwright 的 cookie 管理来保持会话2。
并发优化
可以结合 asyncio
实现并发操作,提高爬取效率。以下是一个简单的并发示例:
Python
import asyncio
from playwright.async_api import async_playwright
async def scrape_page(browser_type):
async with async_playwright() as p:
browser = await getattr(p, browser_type).launch(headless=False)
page = await browser.new_page()
await page.goto("https://www.example.com")
await page.screenshot(path=f"{browser_type}_screenshot.png")
await browser.close()
async def main():
tasks = [scrape_page("chromium"), scrape_page("firefox"), scrape_page("webkit")]
await asyncio.gather(*tasks)
asyncio.run(main())
在这个示例中,使用 asyncio.gather
并发地对不同浏览器进行操作,提高了爬取效率。