Web自动化工具分享 | playwright
实现动态加载的Web自动化工具
当涉及到js动态加载的网页数据时,往往需要通过实例化一个浏览器对象去实现,一般有以下工具可以做到:
1. selenium
Selenium 可以与多种浏览器进行集成,包括 Chrome、Firefox、Safari 等,它提供了针对不同浏览器的驱动程序,以便与浏览器进行通信和控制。
可以编写脚本来模拟用户在浏览器中的行为,例如点击按钮、填写表单、提交表单、导航到不同页面等。它还支持获取页面元素、执行 JavaScript、处理 AJAX 请求和响应等功能。
Selenium 可以与多种编程语言一起使用,包括 Python、Java、C#、Ruby 等,因此您可以根据自己的喜好和需求选择适合的语言进行自动化开发。
最普遍最传统的做法就是selenium了,但是在打包镜像时配置环境麻烦,需要安装浏览器、配置对应版本的驱动文件,因此不算是最适合容器中使用的自动化工具。
更多请参考 👉 python模块详解 | selenium
2. pyppeteer
Pyppeteer 是一个 Python 库,用于使用 Headless Chrome(无头浏览器)进行 Web 自动化。它是基于 Google 的 Puppeteer 项目开发的,提供了使用 Python 进行浏览器自动化的功能。
Pyppeteer 允许您通过编写 Python 代码控制浏览器,导航到网页,执行操作(如点击按钮、填写表单等),获取页面内容,进行截图等。它还支持处理 JavaScript 执行、等待页面加载、处理 AJAX 请求和响应等高级功能。
与 Playwright 相比,Pyppeteer 的重点是使用 Headless Chrome 进行自动化,而不涵盖多浏览器支持。因此,如果您的需求是针对 Chrome 浏览器进行自动化,Pyppeteer 是一个很好的选择。
请注意,由于 Pyppeteer 是通过使用 Chrome DevTools Protocol 与浏览器进行通信,因此需要安装 Chromium 或 Chrome 浏览器的某个版本。
此工具已于多年前停止更新,同样在打包镜像时配置环境麻烦,不建议使用。
更多请参考 👉 python模块详解 | pyppeteer
3. playwright
Playwright 是一个用于浏览器自动化的开源工具集,它由 Microsoft 开发和维护。它支持多种浏览器(如 Chrome、Firefox、Safari 和 Edge),提供了一组易用的 API,可用于自动化浏览器操作,包括页面导航、元素查找和操作、表单填充、截图等。
Playwright 的特点之一是它具有跨浏览器的能力,这意味着您可以使用相同的代码在不同的浏览器中执行自动化任务,而不需要编写适配特定浏览器的代码。
除了跨浏览器支持,Playwright 还提供了一些其他功能,如支持多标签页、处理复杂的浏览器交互(如拖放、悬停等)、模拟设备和网络条件等。
Playwright 使用 Node.js 编写,同时提供了 Python 和其他编程语言的 API。这使得它成为一个功能强大且灵活的工具,适用于各种自动化测试和爬虫任务。
并且支持同步、异步的运行方式,正合我意。
简单使用
import asyncio
from playwright.async_api import async_playwright
from pyquery import PyQuery
async def parse_pv_uv_pw(url):
async with async_playwright() as playwright:
browser = await playwright.firefox.launch()
page = await browser.new_page()
await page.goto(url)
await page.wait_for_selector('#busuanzi_container_page_pv #busuanzi_value_site_pv')
doc = PyQuery(await page.content())
pv = doc('#busuanzi_value_site_pv').text()
uv = doc('#busuanzi_value_site_uv').text()
await browser.close()
print(pv,uv)
asyncio.get_event_loop().run_until_complete(parse_pv_uv_pw("https://chenxuefan.cn"))
默认超时时间是30秒,如果需要自定义:
await page.goto(url, timeout=10000000) # 毫秒
单位是毫秒,1秒=1000毫秒
更多语法
更多用法正在不断探索中。。。
打包镜像
在打包支持playwright
运行所需的环境的时候,需要安装相关依赖,如下所示:
FROM python:3.10
ENV TZ=Asia/Shanghai \
workdir=/chenxuefan.cn
MAINTAINER Billy_Chen
WORKDIR $workdir
RUN apt-get update -y
RUN apt-get upgrade -y
RUN apt-get -y install libgtk-3-0 libgdk-pixbuf2.0-0 libdbus-glib-1-2 libx11-xcb1 libxkbcommon-x11-0 libxcb1 \
libxcomposite1 libxcursor1 libatk1.0-0 libatk-bridge2.0-0
RUN apt-get -y install libcups2 libdbus-1-3 libatspi2.0-0 libxcomposite1 \
libxdamage1 libxfixes3 libxrandr2 libgbm1 libdrm2 libxkbcommon0 libasound2 libwayland-client0
RUN pip install --upgrade pip
COPY ./requirements.txt $workdir
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple/
RUN python3 -m pip install playwright
RUN python3 -m playwright install --force firefox
由于依赖比较多,分成了两次去运行。原因是考虑到了docker在打包是分层和缓存的工作机制,如果我在打包时,第一条安装依赖的命令成功,第二条因为网络等的原因失败了,那么重新打包的时候,就可以直接接上第一条的进度,直接来到第二条继续运行。
更多请参考 👉 分层构建 & 使用缓存