新模拟器playwright的Python代码封装

9 篇文章 0 订阅
4 篇文章 0 订阅

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)

运行结果:

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冒险岛_0_

您的打赏是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值