puppeteer的使用:
目前网上的大多数资料都是基于js进行开发,今天我们剑走偏锋,介绍python中针对该工具开发的第三方工具库pyppeteer,具体的api操作咱就不谈了,官网上有,不咋此赘述,我们直接阐述如何利用pyppeteer做一个远程浏览器服务程序。在该项目考虑到在项目的隔离性,我实在docker容器搭建的该服务端程序,首先首选你需要下载chrome-linux.zip,这是服务端程序必备的工具,好处是他不需要安装,直接解压放在你需要的目录即可(当然也有windows版本chrome-win.zip),其实服务端程序很简单,就一句话打开浏览器,让他一直处于监听状态就行了,就这么简单。
puppeteer各版本下载地址:https://mohen.blog.csdn.net/article/details/108363449
服务端
from datetime import datetime
import traceback
import asyncio
from pyppeteer import launch, connect
async def browser_init():
executablePath_linux = "F:\\chrome-win32\\chrome.exe"
try:
await launch({
"headless": False,
"ignoreDefaultArgs": ['--enable-automation'],
'executablePath': executablePath_linux,
'args': [
# '--disable-gpu=True',
# '--disable-dev-shm-usage',
# '--disable-setuid-sandbox',
# '--no-first-run',
'--no-sandbox',
#'--no-zygote',
'--remote-debugging-address=0.0.0.0',
'--remote-debugging-port=9222',
'--start-maximized', # 窗口最大化模式
'--disable-infobars',
]
})
except Exception as e:
#trace = traceback.format_exc().replace("[", "(").replace("]", ")").replace("\n", "\t")
print(str(e))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(browser_init())
loop.run_forever()
对于代码不做过多赘述,参考官网api,即可看懂,我们lunch()中的几个字段 :
"headless":True ===> 使用无头模式启动浏览器
args:'--remote-debugging-address=0.0.0.0', '--remote-debugging-port=9222',这两个是自定义绑定服务器端ip地址和端口,方便客户端请求,以获取wsEndpoint.一旦设置了这两个参数,如果你再使用print(browser.wsEndpoint)语句打印wsEndpoint,是不可实现的,所以我们如何在接触不到的服务端程序的时候获取服务端浏览器的长链接地址呢?答案就是:
browserWSEndpoint = requests.get("http://127.0.0.1:19222/json/version").json().get("webSocketDebuggerUrl")
即可拿到所有该浏览器远程操作的所有参数。 当然重点就是wsEndpoint,拿到wsEndpoint后我们可以远程使用下面的函数进行远程连接
客户端
import asyncio
import requests
from pyppeteer import launch,connect
async def main(browserWSEndpoint):
browserWSEndpoint = requests.get("http://127.0.0.1:9222/json/version").json().get("webSocketDebuggerUrl")
# Windows 和 Linux 的目录不一样,情换成自己对应的executable文件地址
browser = await connect({"browserWSEndpoint":browserWSEndpoint})
page = await browser.newPage()
await page.goto("https://www.baidu.com/")
content = await page.content()
print(content)
await page.close()
if __name__ == '__main__':
browserWSEndpoint = requests.get("http://127.0.0.1:19222/json/version").json().get("webSocketDebuggerUrl")
print(browserWSEndpoint)
asyncio.get_event_loop().run_until_complete(main(browserWSEndpoint))