1、Python代码实现封装调用
事件监听
page对象提供了一个on方法,它可以用来监听页面中各个事件,比如close、console、load、request、response等等。
比如我们可以监听response事件,response事件可以在每次网络请求得到响应的时候触发,我们可以设置对应的回调方法获取对应的Response的全部信息。
结果返回响应内容和页面标题、传入路径可以保存截图
import pprint
import asyncio
from playwright.sync_api import sync_playwright
from playwright.async_api import async_playwright
# 普通请求类似于requets库
def pt_request():
with sync_playwright() as p:
context = p.request.new_context()
response = context.get("https://example.com/user/repos")
print(response.status)
print(response.status_text)
# 浏览器请求
async def main(url,headers=None,img_path=None,handel_flow_func=None):
async with async_playwright() as p:
# for browser_type in [p.chromium, p.firefox, p.webkit]: #可以指定任意三个浏览器
browser_type = p.chromium
browser = await browser_type.launch(headless=False) # headless设置为False为显示打开的浏览器,slow_mo=50
context = await browser.new_context(ignore_https_errors=True) # 解决net::ERR_CERT_COMMON_NAME_INVALID报错问题
page = await context.new_page()
# 如果指定监听函数的话
if handel_flow_func:
page.on('response', handel_flow_func) # 监听浏览器中的response事件,获取加载的所有流量
await page.wait_for_load_state('networkidle')
# 设置请求头
if headers:
await page.set_extra_http_headers(headers=headers)
await page.goto(url)
# 如果指定截图保存路径的话
if img_path:
await page.screenshot(path=img_path) # 保存截图
get_title = await page.title()
page_text = await page.content()
print(get_title)
# 关闭浏览器
await context.close()
await browser.close()
# 判断需要获取的数据类型
return {"Response": page_text, 'Title': get_title}
# 封装获取html函数
def browser_request(url, headers=None,img_path=None,handel_flow_func=None):
# html = asyncio.get_event_loop().run_until_complete(main(url, cookie))
loop1 = asyncio.new_event_loop()
asyncio.set_event_loop(loop1)
loop = asyncio.get_event_loop()
data = loop.run_until_complete(main(url, headers, img_path, handel_flow_func=handel_flow_func))
loop1.close()
return data
# 用于监听浏览器的Responses事件
def on_response(response):
print(f'Statue {response.status}:{response.url}')
if __name__ == "__main__":
url = 'https://www.baidu.com'
data = browser_request(url=url, img_path='test.png', handel_flow_func=on_response)
print(data)
运行结果: