1. 环境配置
# 安装 Playwright
pip install playwright# 安装浏览器驱动
playwright install
2. 基础用法
2.1 基本结构
from playwright.sync_api import sync_playwrightdef main():with sync_playwright() as p:# 启动浏览器,headless=False 可以看到浏览器界面browser = p.chromium.launch(headless=False)context = browser.new_context()page = browser.new_page()# 访问网页page.goto('https://example.com')# 关闭浏览器browser.close()if __name__ == '__main__':main()
2.2 元素定位方法
# 1. 使用 Playwright Inspector(推荐)
# python -m playwright codegen https://example.com# 2. 常用选择器
page.click('text=按钮文字') # 文本选择器
page.click('role=button') # 角色选择器
page.click('.class-name') # CSS 选择器
page.click('#id-name') # ID 选择器
page.click('[data-testid=test-id]') # 测试 ID 选择器
page.click('xpath=//button') # XPath 选择器# 3. 组合选择器
page.click('.container >> text=点击这里')
2.3 基本操作
# 点击
page.click('button')# 输入文本
page.fill('input[name="username"]', '用户名')# 等待元素
page.wait_for_selector('.loading', state='hidden')# 获取文本
text = page.text_content('.content')# 截图
page.screenshot(path='screenshot.png')
3. 反爬虫策略
3.1 基础配置
def create_stealth_browser():with sync_playwright() as p:browser = p.chromium.launch(headless=True,args=['--disable-blink-features=AutomationControlled','--disable-infobars','--window-size=1920,1080','--start-maximized'])context = browser.new_context(viewport={'width': 1920, 'height': 1080},user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',java_script_enabled=True,ignore_https_errors=True)return browser, context
3.2 高级反爬策略
async def setup_stealth_page(context):page = await context.new_page()# 注入 JavaScript 以修改浏览器特征await page.add_init_script("""Object.defineProperty(navigator, 'webdriver', {get: () => undefined});""")# 设置地理位置await context.grant_permissions(['geolocation'])await page.set_geolocation({"latitude": 40.71, "longitude": -74.01})# 添加随机延时await page.set_default_timeout(random.randint(30000, 60000))return page# 随机延时函数
async def random_sleep():await asyncio.sleep(random.uniform(2, 5))
3.3 代理设置
def create_proxy_context(playwright):return playwright.chromium.launch(proxy={"server": "http://proxy-server:port","username": "user","password": "pass"})
3.4 Cookie 和 Session 管理
# 保存 Cookie
storage = context.storage_state(path="auth.json")# 使用已保存的 Cookie
context = browser.new_context(storage_state="auth.json")
4. 高级功能
4.1 请求拦截
def handle_route(route):if route.request.resource_type == "image":route.abort() # 阻止加载图片else:route.continue_()page.route("**/*", handle_route)
4.2 监听网络请求
def log_request(request):print(f"URL: {request.url}")print(f"Method: {request.method}")print(f"Headers: {request.headers}")page.on('request', log_request)
4.3 异步模式
from playwright.async_api import async_playwright
import asyncioasync def main():async with async_playwright() as p:browser = await p.chromium.launch()page = await browser.new_page()await page.goto('https://example.com')await browser.close()asyncio.run(main())
5. 实战示例
5.1 登录自动化
async def login(page, username, password):await page.goto('https://example.com/login')await page.fill('input[name="username"]', username)await page.fill('input[name="password"]', password)# 等待验证码加载(如果有)await page.wait_for_selector('.captcha-image')# 处理验证码(示例)captcha = await solve_captcha(page)await page.fill('input[name="captcha"]', captcha)await page.click('button[type="submit"]')await page.wait_for_navigation()
5.2 数据采集
async def scrape_data(page):data = []# 随机延时await random_sleep()# 获取数据elements = await page.query_selector_all('.item')for element in elements:title = await element.text_content()data.append({'title': title,'timestamp': datetime.now()})return data
6. 最佳实践
- 错误处理
try:await page.click('button')
except TimeoutError:print("元素未找到")
except Exception as e:print(f"发生错误: {e}")
- 性能优化
# 禁用图片和样式表加载
await context.route('**/*.{png,jpg,jpeg,gif,css}', lambda route: route.abort())# 设置请求超时
page.set_default_navigation_timeout(30000)
- 定期清理资源
# 定期清理浏览器上下文
async def cleanup():contexts = browser.contextsfor context in contexts:await context.close()await browser.close()
7. 调试技巧
-
使用
page.pause()
进行调试 -
开启详细日志:设置环境变量
DEBUG=pw:api
-
保存页面快照:
page.screenshot()
-
使用 Playwright Inspector 进行元素定位
8. 注意事项
-
遵守网站的 robots.txt 规则
-
合理控制请求频率
-
做好异常处理和重试机制
-
定期更新 User-Agent 和代理
-
数据及时保存,避免丢失
-
注意内存管理,及时释放资源
这个教程涵盖了 Playwright 的主要使用方法和反爬虫策略。建议在实际使用时,根据具体需求选择合适的功能组合,并且要注意遵守网站的使用条款和爬虫规则。