PYppeteer的原作者已经很久没更新了,提交上去的代码也没人整理,联系也联系不上,谷歌官方的Puppeteer已经更新了好几个版本,一些bug已经解决,以及很多新的功能,这些在当前python的库里都无法享受到,在网上偶尔看到其他的库,感觉也不错,值得尝试下。
20200216更新:已经有其他人接棒这个库了,新地址https://github.com/pyppeteer/pyppeteer ,是个好消息,如果实在是等不了这个新库的发展,可以先看看下面其他语言的调用方式。
PuPHPeteer
A Puppeteer bridge for PHP, supporting the entire API.https://github.com/nesk/puphpeteer
这个是库php版本的puppeteer,同pyppeteer一样都不是谷歌官方出的,这个库和pyppeteer的区别是他是通过php来连接puppeteer也就是依然需要node.js和puppeteer环境,而python版本的pyppeteer是纯python重写的,本身并不需要安装node.js。
好处是他只是连接,代码需要的不多,相当于加载对方,本身不涉及逻辑方面问题,解决了PYppeteer那种重写跟不上官方库的问题。
具体安装我就不写了,对于php和node.js实在是不熟悉。大家自行搜索吧,很多人已经写的很详细了。
PyExecJS
我最近也在学php但是毕竟没有python熟悉,看到上面的PuPHPeteer就想到,既然php可以连接puppeteer,那么python为什么不这样做呢。看了puPHPeteer的代码发现只有两个关键脚本PuppeteerConnectionDelegate.js和Puppeteer.php,看了下跟设想的一致,那么我们就可以用PyExecJS这个库,PyExecJS是一个可以加载JavaScript脚本同时也支持node.js的python第三方库,通过它就可以直接加载puppteeer的代码了,可以享受到最新版本的功能,只是这种加载方式不够优雅,但因为网页模拟在程序中占比本身就很小,通过这种加载方式来运行也没什么问题。
但是我并不会写node.js的代码,网上puppeteer的例子有很多,并且找到了https://github.com/zhentaoo/puppeteer-deep 这个puppeteer的例子库,把里面的稍微更改下加载到python里就可以了。
环境部署
安装Puppeteer
node.js环境就官网下载进行安装即可,我们直接说Puppeteer这个库的安装,由于安装它后需要下载一个chromium的浏览器,导致国内无法直接安装,有人写了适合国内的可以下载的版本,我们就使用这个命令进行安装即可。
npm install puppeteer-chromium-resolver --save
安装PyExecJS
pip install PyExecJS
编写python脚本
import execjs
# os.environ["EXECJS_RUNTIME"] = "Node" #我本机只有node.js,这里就不需要设置了。
# os.environ["NODE_PATH"] = os.getcwd()+"/node_modules"
# print(execjs.get().name)
#如果返回值: JScript
# 如果想要切换,用os.environ["EXECJS_RUNTIME"] = "XXX",如果刚安装完其他JS引擎,必须配置环境变量,还可能需要重启电脑或重启IDE。
# 如果windows上装有Node.js , 可以切换Node
print(execjs.get().name)
#返回值: Node.js (V8)
parser = execjs.compile("""
const puppeteer = require('puppeteer');
let request = require('request-promise-native');
//使用 puppeteer.launch 启动 Chrome
async function aa(canshu){
var cc=123;
return cc;
const browser = await puppeteer.launch({
headless: false, //有浏览器界面启动
slowMo: 100, //放慢浏览器执行速度,方便测试观察
args: [ //启动 Chrome 的参数,详见上文中的介绍
'–no-sandbox',
'--window-size=1280,960'
],
});
const page = await browser.newPage();
await page.goto('https://www.so.com/s?ie=utf-8&fr=chrome_address_bar&src=home_chrome_address_bar&q='+canshu);
await page.close();
await browser.close();
}
""")
parser.call('aa','天气')
node.js的代码可以如上直接粘贴进去,也可以写成js文件用python进行打开,parser = execjs.compile(open('so.js',encoding='utf-8').read())
这样就可以了,如果浏览器无法打开,就看看是不是chromium下载失败,手动设置下自己的chrome路径(参考前面的文章,PYppeteer的chrome launch里面的设置)。如果真确定要这样使用,最好还是先运行一遍js文件,确认自身没问题再使用python进行加载。
本文由三分醉博客原创,转载请注明:https://www.sanfenzui.com/puphpeteer-and-pyexecjs-the-substitutes-of-pyppeteer.html
文章同步更新在知乎:三分醉 - 知乎