什么是 Pyppeteer?
要想知道什么是 Pyppeteer,首先应该先了解一下 Puppeteer:
Puppeteer 是 Google 基于 Node.js 开发的一个工具,拥有 Puppeteer 即可通过 JavaScript 来控制 Chrome 浏览器的一些操作,也可以用于网络爬虫上,其 API 极其完善,功能非常强大。
Pyppeteer 是 Puppeteer 的 Python 实现,Pyppetter 基于 Chromium 浏览器通过执行一些动作来进行网页渲染,Pyppeteer 基于 Python 的新特性 async 实现,因此它也支持异步操作,效率相对于 Selenium 也有一定的提高。
安装
pip install pyppeteer -i https://pypi.douban.com/simple
快速使用
import asyncio
from pyppeteer import launch
async def main():
options = {
"executablePath": r"C:\Program Files\Google\Chrome\Application\chrome.exe",
"headless": False,
"defaultViewport": {"width": 1920, "height": 1080},
"autoClose": True,
"dumpio": True,
"args": [
'--disable-infobars',
'--no-sandbox',
'--start-maximized',
],
}
browser = await launch(**options)
page = await browser.newPage()
await page.goto('https://www.baidu.com')
await asyncio.sleep(2)
page_text = await page.content() # 页面内容
print(page_text)
await browser.close()
if __name__ == '__main__':
# loop = asyncio.get_event_loop()
# loop.run_until_complete(main())
asyncio.run(main()) # python3.7以上版本使用
常用参数
参数 | 描述 |
---|---|
executablePath (str) | chrome.exe运行的路径 |
headless (bool) | 无头模式 |
autoClose (bool) | 自动关闭浏览器 |
dumpio (bool) | 设置True 解决浏览器多开卡死 |
args (List[str]) | 在执行过程中可以传入的额外参数 |
–disable-infobars | 关闭自动化提示框 |
–start-maximized | 窗口最大化模式 |
… | … |
页面解析
通过 Page 对象的 xpath 方法提取资源,并使用 getProperty 方法和 .jsonValue() 获取资源
name = await (await name_list[0].getProperty('textContent')).jsonValue()
url = await(await url_list[0].getProperty("href")).jsonValue()
输入点击
await map_page.type("#username", username)
await map_page.type("#password", pwd)
await map_page.click("#legal-agreement > label > div")
执行JS脚本
y = await pixabay_page.evaluate('document.documentElement.scrollTop')
滚动条刷新页面
temp = None
while True:
y = await pixabay_page.evaluate('document.documentElement.scrollTop')
if y == temp:
break
else:
print('滚动条刷新')
temp = y
await pixabay_page.evaluate('window.scrollBy(0, document.documentElement.clientHeight)')
await asyncio.sleep(2)
截图
await page.screenshot({'path': 'page.png'})
元素等待
await map_page.waitForXPath(f'//div[text()="{error_msg}"]', {'timeout': 10000})
切换iframe
frame_lst = mail_page.frames
for frame in frame_lst:
if frame.name == "iframeMail":
pass
cookies操作
cookie_lst = await verify_page.cookies()
for cookie in cookie_lst:
if cookie.get("name") == "session":
session = cookie.get("value")
print(session)
页面操作
# 刷新
await page.reload()
# 后退
await page.goBack()
# 前进
await page.goForward()
切换页面
await mail_page.bringToFront()