Pyppeteer使用简介

/ 0评 / 5

说明

在工作中实现、改造相关消息发送功能代码时,有一个分支功能,指定网页截图后邮件发送。
对于服务端怎么进行网页截图很感兴趣。经过查找资料和学习,了解了这一完整过程。
主要是使用pyppeteer模块,调用chromium浏览器相关api进行实现。
本篇文章主要介绍pyppeteer的入门使用。

简介

pyppeteer 是Python语言的puppeteer非官方版本。
puppeteer模块又是什么?
puppeteer是一个 Node 库,它提供了一个高级 API 来通过DevTools 协议控制 Chrome 或 Chromium 。
Puppeteer默认无头运行,但可以配置为运行完整(非无头)Chrome 或 Chromium。
pyppeteer 依赖 asyncio库(asyncio是一个异步协程库)

pyppeteer 采用了 Python 的 async/await 机制,pyppeteer使用Python版本 >=3.6

安装

在第一次使用pyppeteer的时候也会自动下载并安装chromium浏览器

使用命令来安装pyppeteer

pip3 install pyppeteer

chromium 浏览器安装,可以使用下面命令自动下载最新版本安装到pyppeteer 的默认位置。

pyppeteer-install

Chrome 浏览器和 Chromium 浏览器

在 Pyppetter 中,实际上它背后也是有一个类似 Chrome 浏览器的 Chromium 浏览器在执行一些动作进行网页渲染,首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。
Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。
查看源图像

window 下 安装完 pyppeteer ,会在 python 安装目录下的 Scripts 目录下 有 pyppeteer-install.exe 和 pyppeteer-install-script.py 两个文件,执行 任意一个都可以安装 chromium 浏览器到 pyppeteer 的默认位置。

安装完成后,导入pyppeteer进行测试是否安装成功

如没有报错,则安装成功。

使用

pyppeteer的实现思路是,创建一个浏览器和一个页面。调用chromium的相关API接口,操纵chromium进行浏览器的相关动作实现。
例如可以进行
1、网页截图
2、网页生成pdf
3、web自动化测试工具
更多的使用场景可以参照puppeteer,因为pyppeteer就是python语言的实现。

1、代码示例

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://baidu.com')
    await page.screenshot({'path': 'example.png'})
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

运行上面代码就会对百度首页进行截图,但会发现并没有浏览器弹出运行,这是因为 Pyppeteer 默认使用的是无头浏览器,如果想要浏览器显示,需要在launch 函数中设置参数 “headless =False”

2、cookie的设置

cookie_str = """BIDUPSID=D41CCBA0C15D0A36625810606BDEE480; PSTM=1604559086; BDUSS=5yN25aUWx2aFA0Q1l5LTV2cG00dkZOU1ZSRVp6YkZVOVh"""
cookie_list = cookie_str.split(';')
for item in cookie_list:
    info = item.split('=')
    cookie_data = {
        'url': 'http://www.baidu.com',
        'name': info[0].strip(),
        'value': info[1].replace('\n', '')
    }
    print(cookie_data)
    await page.setCookie(cookie_data)

指定浏览器页面大小

await page.setViewport({'width': 1920, 'height': 906})

3、绕过 webdriver 检测

pyppeteer 的最底层是封装的puppeteer,是 js 库,是和网站源码交互最深的方式。
在 pyppeteer 中提供了一个方法:evaluateOnNewDocument(),该方法是将一段 js 代码加载到页面文档中,当发生页面导航、页面内嵌框架导航的时候加载的 js 代码会自动执行,那么当页面刷新的时候该 js 也会执行,这样就保证了修改网站的属性持久化的目的。
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }') 

4、设置UA

ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
await page.setUserAgent(ua)

5、launch常用参数

ignoreHTTPSErrors(bool):是否忽略 HTTPS 错误。默认为 False
headless指定浏览器是否以无头模式运行,默认是True。
args 指定给浏览器实例传递的参数,
--disable-infobars 代表关闭浏览上方的“Chrome 正受到自动测试软件的控制”,
--window-size=1920,1080是设置浏览器的显示大小,
--no-sandbox 是 在 docker 里使用时需要加入的参数。
关闭提示条:”Chrome 正受到自动测试软件的控制”,这个提示条有点烦,那咋关闭呢?这时候就需要用到 args 参数了,禁用操作如下:browser = await launch(headless=False, args=['--disable-infobars'])

遇到的问题

windows python3.6版本遇到的问题

1、python中运行websockets程序时报:ImportError: cannot import name ‘Deque’
Python版本和websockets版本不匹配造成

pip uninstall websockets
pip install websockets==6.0

2、运行错误 RuntimeWarning: coroutine 'Browser._targetCreated' was never awaited

pip uninstall pyee
pip install pyee==6.0.0

参考资料

https://pypi.org/project/pyppeteer/

https://zhaoqize.github.io/puppeteer-api-zh_CN/

https://blog.csdn.net/freeking101/article/details/93331204

发表评论

您的电子邮箱地址不会被公开。

*