目录
HTTP身份认证
context = browser.new_context(
http_credentials={"username": "2025110155", "password": "123456"}
)
page = context.new_page()
HTTP(S) 代理
launch中的proxy参数设置(全局代理)
browser = chromium.launch(proxy={
"server": "http://myproxy.com:8088",
"username": "us",
"password": "pd"
})
launch_persistent_context中设置
要在固定的上下文中使用代理,可以使用launch_persistent_context()方法
browser = playwright.chromium.launch_persistent_context('path/to/context', proxy={'server': 'http://your-proxy-server:port'})
使用环境变量设置代理
这种方式可以在不修改代码的情况下改变代理设置。
import os
os.environ['HTTP_PROXY'] = 'http://your_proxy_address:your_proxy_port'
os.environ['HTTPS_PROXY'] = 'http://your_proxy_address:your_proxy_port'
事件监控
playwright中的page.on提供了多种事件的捕获监控,如下:
Page.on(self: Page, event: Literal["close"], f: (Page) -> None) 页面关闭事件 Page.on(self: Page, event: Literal["console"], f: (ConsoleMessage) -> None) 页面上发生控制台日志事件。 Page.on(self: Page, event: Literal["crash"], f: (Page) -> None) 页面崩溃事件。 Page.on(self: Page, event: Literal["dialog"], f: (Dialog) -> None) 页面弹出对话框事件。 Page.on(self: Page, event: Literal["domcontentloaded"], f: (Page) -> None) DOM 内容加载完成事件。 Page.on(self: Page, event: Literal["download"], f: (Download) -> None) 页面上触发下载事件。 Page.on(self: Page, event: Literal["filechooser"], f: (FileChooser) -> None) 页面弹出文件选择对话框事件。 Page.on(self: Page, event: Literal["frameattached"], f: (Frame) -> None) 子框架附加到页面事件。 Page.on(self: Page, event: Literal["framedetached"], f: (Frame) -> None) 子框架从页面分离事件。 Page.on(self: Page, event: Literal["framenavigated"], f: (Frame) -> None) 子框架导航事件。 Page.on(self: Page, event: Literal["load"], f: (Page) -> None) 页面加载完成事件。 Page.on(self: Page, event: Literal["pageerror"], f: (Error) -> None) 页面上发生错误事件。 Page.on(self: Page, event: Literal["popup"], f: (Page) -> None) 页面弹出弹出窗口事件。 Page.on(self: Page, event: Literal["request"], f: (Request) -> None) 页面发出网络请求事件。 Page.on(self: Page, event: Literal["requestfailed"], f: (Request) -> None) 页面上的请求失败事件。 Page.on(self: Page, event: Literal["requestfinished"], f: (Request) -> None) 页面上的请求完成事件。 Page.on(self: Page, event: Literal["response"], f: (Response) -> None) 页面接收到网络响应事件。 Page.on(self: Page, event: Literal["websocket"], f: (WebSocket) -> None) 页面上发生 WebSocket 事件。 Page.on(self: Page, event: Literal["worker"], f: (Worker) -> None) 页面上发生 Worker 事件。
from playwright.sync_api import sync_playwright, Playwright, expect
from functools import partial
def on_close(event, par1, par2):
print(f'页面关闭了{event}{par1}{par2}')
def on_request(request, extra_param):
if request.url.endswith('.js'):
print(f"存在还有JavaScript请求,Request URL: {request.url}, Extra Param: {extra_param}")
def documentManage(playwright: Playwright, url):
browser = playwright.chromium.launch(headless=False)
context = browser.new_context(storage_state="cookies.json") # 传入storage_state参数,加载cookies
page = context.new_page()
page.goto(url, wait_until='commit', timeout=50000)
page.set_viewport_size({'width': 1920, 'height': 1080})
page.reload() # 刷新页面
# 通过url支持获取URL、js、css、图片等资源文件链接;status 获取请求结果状态;headers 获取请求头
page.on('request', lambda request: print(request.url))
page.on('response', lambda response: print(response.json()))
page.on('request', lambda request: on_request(request, extra_param='测试闭包传参'))
page.on('close', partial(on_close, par1=123, par2='测试'))
page.wait_for_timeout(2000)
context.close()
browser.close()
上面代码中使用了from functools import partial,解决事件监控时的函数传参问题,监控函数第一个传参为事件本身,如on_close中的event实际代表close。当然后面的网络拦截中也适用。
数据拦截及修改
中止请求使用route.abort()
page.route('**/*.{png,jpg}', lambda route: route.abort()) # lambda函数中可以加条件判断语句来控制需要拦截的特定内容
page.route("**/*", lambda route: route.abort() if 'documentManage' in route.request.url else route.continue_())
修改响应数据通过使用 APIRequestContext 获取原始响应,然后将响应传递给 route.fulfill()。
page.route('**/*', lambda route: route.fulfill(
status=200,
body='{"message": "数据被拦截且修改"}'
))

2297

被折叠的 条评论
为什么被折叠?



