提pyppteer之前需要提另一个东西,selenium,相比只要是做爬虫的对selenium都不会陌生。作为一款超级爬虫工具 web自动化测试工具,经常被爬虫人员所使用来绕过一些js加密之类的东西(其实主要是懒)。pyppteer其实也是一个类似的测试工具,其来源于 Google 基于 Node.js 开发的一个工具—puppteer,其实就是puppteer的python实现,是由一个日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本(网上找到的作者相关描述好像只有-----一个日本作者)
其实原因很简单,selenium有时候并不怎么好用,因为:
1、对版本配置要求苛刻,chrome浏览器版本必须和驱动器版本对应,像我这种chrome会自动更新的人表示基本隔一段时间重新用都要重新去下驱动,真的挺麻烦的
2、有部分网页是可以检测到是否是使用了selenium的,所以使用selenium做爬虫的时候经常会遇到打开网页什么信息都没,这种一般就是网页做了相应的反爬。
注:由于pyppteer是由puppteer封装而来,所以所有puppteer有的问题pyppteer都有,而且可能还会有一些新的问题,用pyppteer仅仅是因为对于node.js还不够熟悉,pyppteer仅仅是一个过渡方案,最终还是需要掌握puppteer的。
Chromium 是一款独立的浏览器,是 Google 为发展自家的浏览器 Google Chrome 而开启的计划,相当于 Chrome的实验版,且 Chromium 是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。
pyppteer就是基于chromium进行的开发,而且并不强制需要预先下载浏览器(程序会自动检测有没有该浏览器,没有的话会自动下载)
python的一个异步协程库,内置了对于异步IO的支持,详细介绍可以看官方文档https://docs.python.org/3/library/asyncio.html,或者说有两篇知乎我觉得讲的也不错https://zhuanlan.zhihu.com/p/55783243
https://zhuanlan.zhihu.com/p/72887901
首先由于pyppteer采用了Python 的 async 机制,因此python版本要求为3.5以上(我用的是3.6.8,也是我目前认为最好的python版本)
直接pip install pyppeteer就行
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(headless =False)
page = await browser.newPage()
await page.goto('https://www.baidu.com/')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
该段代码会访问百度并且截图保存在example.png,结果如下
如果运行这段程序会发现页面只有1/4个屏幕,相当别扭,修改成以下代码即可解决问题
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(
{
'headless': False,
'dumpio': True,
'autoClose': False,
'args': [
'--no-sandbox',
'--window-size=1366,850'
]
}
)
page = await browser.newPage()
await page.setViewport({'width': 1366, 'height': 768})
await page.goto('https://www.baidu.com/')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
可以通过上面设置Windows-size和Viewport大小来实现网页完整显示。具体值还是得根据电脑分辨率自行调整(目前还没找到可以直接自动匹配大小的函数)
最后给一些常用的函数
# 是否启用JS,enabled设为False,则无渲染效果
await page.setJavaScriptEnabled(enabled=True)
# 等待
await asyncio.sleep(2)
# 滚动到页面底部
await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')
# 打印页面cookies
print(await page.cookies())
# 获取所有 html 内容
print(await page.content())
# 关闭浏览器
await browser.close()