Pyppeteer是Puppeteer Javascript(无头) chrome/chromium 浏览器自动化库的Python非官方端口,Puppeteer是在Node.js中使用的,而Pyppeteer是专用于Python语言的。
本文档对应的是Pyppeteer的v0.0.25版本,从目前情况来看,Pyppeteer已经很久没更新了,但对于要求不是非常高的爬虫和自动化测试使用起来还是没问题的。
当前文章中会介绍一下安装、使用等一些注意事项,在后续的文章中会逐一介绍各个API类的功能。 Pyppeteer目前支持Python3.5、3.6、3.7,但不建议在3.5的版本中使用,最佳的使用环境为3.6+。
在已安装了Python3.6+的情况下,以windows为例,Win+R -> cmd -> 回车,打开cmd窗口。
输入:pip install pyppeteer
,等待安装完毕即可。
如果需要最新版(开发版)的pyppeteer,可以通过pip命令从github地址进行安装。
输入:pip install -U git+https://github.com/miyakogi/pyppeteer.git@dev
,等待安装完毕即可。
在第一次使用Pyppeteer时,它会自动下载最新版本的Chromium(~170MB Mac, ~282MB Linux, ~280MB Win),如果你不希望它自动下载,那么在运行任何Pyppeteer脚本之前,手动运行pyppeteer-install
命令即可下载(似乎这没什么用,普遍情况下我们都会采用自动下载的方式)。
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
dimensions = await page.evaluate('''() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}''')
print(dimensions)
#>>> {'width': 800, 'height': 600, 'deviceScaleFactor': 1}
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
Pyppeteer拥有几乎和Puppeteer一样的API,更多API详情可以查看后续文章。
Pyppeteer和Puppeteer类似,由于Python和Javascript在语法、特性、主要发展领域的一些差异,在使用及运行效率上略有区别,但不影响其结果。
Puppeteer使用对象(Python使用字典)组成选项传递给方法或函数,Pyppeteer可接受字典类型和关键字参数类型作为选项。
browser = await launch({'headless': True})
browser = await launch(headless=True)
在Python中, 不能用于方法名称,所以使用 P a g e . q u e r y S e l e c t o r ( ) 、 P a g e . q u e r y S e l e c t o r A l l ( ) 、 P a g e . x p a t h ( ) 代替 P a g e . 不能用于方法名称,所以使用Page.querySelector()、Page.querySelectorAll()、Page.xpath()代替Page. 不能用于方法名称,所以使用Page.querySelector()、Page.querySelectorAll()、Page.xpath()代替Page.()、Page.$ ( ) 、 P a g e . ()、Page. ()、Page.x()。Pyppeteer也有这些方法简写Page.J()、Page.JJ()、Page.Jx()。
Puppeteer的evaluate()采用原生的Javacript函数或Javascript表达式字符串,Pyppeteer采用Javascript字符串。Javascript字符串可以是函数或者表达式。Pyppeteer会自动尝试检查字符串是函数还是表达式,但有时会失败。如果表达式字符被视为函数并应发错误,可以添加force_expr=True参数,这将强制Pyppeteer把字符串视为表达式。
content = await page.evaluate('document.body.textContent', force_expr=True)
element = await page.querySelector('h1')
title = await page.evaluate('(element) => element.textContent', element)