• 什么是pyppteer
  • 为什么用pyppteer
  • pyppteer两大重点
  • chromium
  • asyncio
  • 安装与使用
  • 版本要求
  • 安装
  • 使用


什么是pyppteer

提pyppteer之前需要提另一个东西,selenium,相比只要是做爬虫的对selenium都不会陌生。作为一款超级爬虫工具

为什么用pyppteer

其实原因很简单,selenium有时候并不怎么好用,因为:
1、对版本配置要求苛刻,chrome浏览器版本必须和驱动器版本对应,像我这种chrome会自动更新的人表示基本隔一段时间重新用都要重新去下驱动,真的挺麻烦的
2、有部分网页是可以检测到是否是使用了selenium的,所以使用selenium做爬虫的时候经常会遇到打开网页什么信息都没,这种一般就是网页做了相应的反爬。

注:由于pyppteer是由puppteer封装而来,所以所有puppteer有的问题pyppteer都有,而且可能还会有一些新的问题,用pyppteer仅仅是因为对于node.js还不够熟悉,pyppteer仅仅是一个过渡方案,最终还是需要掌握puppteer的。

pyppteer两大重点

chromium

Chromium 是一款独立的浏览器,是 Google 为发展自家的浏览器 Google Chrome 而开启的计划,相当于 Chrome的实验版,且 Chromium 是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。

Puppeteer如何工作 puppeteer原理_Chrome


pyppteer就是基于chromium进行的开发,而且并不强制需要预先下载浏览器(程序会自动检测有没有该浏览器,没有的话会自动下载)

asyncio

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,结果如下

Puppeteer如何工作 puppeteer原理_Puppeteer如何工作_02


如果运行这段程序会发现页面只有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()