尝试在树莓派上使用Playwright
Update: Playwright now full supports ARM64.Just Update to v1.17.0.
起因
想要写个Py脚本搞定某个网站的签到功能,然而登陆入口有reCAPTCHA
验证,签发的Session有效期又只有不到一星期.正面搞定自动登录签到难度几乎是Hard
级别了.但是此网站还提供了Login By Google
,第三方登陆可以绕过万恶的reCAPTCHA
.计划通!
Playwright
当然想想也知道,模拟请求的方式对Google登陆来讲几乎没戏,因此还是上无头浏览器吧.在浏览器控制库选择方面,考虑到很多人用的selenium
最新的正式版还停留在2018 12月,因此我选择了最近风头正劲的Playwright.在我的体验中,Playwright的auto-wait是个很棒的Feature,没必要再纠结sleep几秒了.同时还支持以编程的方式阻断或修改特定的网络请求等奇妙特性.
在本地的测试中,我用Firefox driver,导航到Google Login,等待二步验证,完成登陆并签到一气呵成.由于Playwright驱动的是Firefox本身而不是用于测试自动化的Gecko Driver
,因此甚至没有遇到Google的不安全预警.计划通!
Playwright on ARMv7
然鹅,当我尝试部署到树莓派上时,却发现Playwright官方不支持armv7架构(啊这...)
在issue区也有相关的讨论,大概集中于Playwright包含一些定制的浏览器二进制文件,而这些定制版本不提供某些平台的二进制
这一问题.不过Playwright提供了改变定制浏览器存放目录的环境变量,通过这种方法可以自己引入浏览器二进制文件.
使用Chromium浏览器.
在各个浏览器的选择中,Chromium Driver是直接套用的原生版本,因此我们也只需要下载ARM平台二进制即可.RUN apt-get update && \ apt-get install -y \ chromium \ nodejs
- 安装x86_64平台的Linux Whl包,可在
https://pypi.org/project/playwright/#files
下载到. - 将whl重命名为
playwright-1.9.2-py3-none-any.whl
,即可在所有架构上安装. 安装whl
pip install playwright-1.9.2-py3-none-any.whl
删除Playwright自带Node环境,更换为arm架构node.这里以Py3.9为例.
rm /usr/local/lib/python3.9/site-packages/playwright/driver/node && \ ln -s /usr/bin/node /usr/local/lib/python3.9/site-packages/playwright/driver/node
新建个存放Chromium的文件夹,后面的步骤中需要通过环境变量方式指定Playwright使用此文件夹.(注意 chromium-854489是指定的版本号,不能改变)
mkdir -p ~/pw-browser/chromium-854489/chrome-linux RUN ln -s /usr/bin/chromium ~/pw-browser/chromium-854489/chrome-linux/chrome
增加环境变量
PLAYWRIGHT_BROWSERS_PATH=~/pw-browser
运行脚本,发现可以正常使用Chromium.
绕过安全校验
与Firefox不同.Chromium的自动化测试模式会被Login via Google识别,从而提示不安全的浏览器,并阻止登陆.
一般来讲,你可以在Google账户设置中允许不安全应用.比如在这里:https://myaccount.google.com/lesssecureapps
但是对于打开了二重验证的账号来讲,这个选项是无法选择的.因此,我采取了另一种办法.
- 在非自动化模式下打开Chromium.
- 登陆账号,通过二重验证.
- 将浏览器的Userdir文件夹复制到另一个位置.
在脚本中使用持久化上下文的方式,导入之前复制的userdir.
user_data_dir="/home/pi/.config/chromium/"#userdir目录 browser = p.chromium.launch_persistent_context(user_data_dir)
- 你会发现,Google账号已经自动登录到浏览器上了,直接跳转即可.
请问博主,我看维基上说树莓派4B已经支持armV8了,这样能否直接编译aarch64版本的playwright.whl文件再用playwright install 下载浏览器驱动呢
实际上 playwright使用的是自己编译的浏览器来进行驱动,而他的浏览器暂时不支持ARMv8,因此playwright的whl架构和这个问题关系不大.不过目前Playwright已经发布了ARM版本的浏览器驱动了.