Pyppeteer 的基本使用方法

Pyppeteer 是 Puppeteer 的 Python 实现,用于控制 Chrome 进行网页渲染和网络爬虫。本文详细介绍了 Pyppeteer 的基本使用,包括 launch 方法的配置,如有头模式、调试模式、页面大小调整等,以及 Page 对象的各种操作,如提取网页资源、输入文本、点击操作、执行 JavaScript 代码等。Pyppeteer 支持异步操作,提供简洁易读的 API,是 Python 中进行浏览器自动化的好帮手。
摘要由CSDN通过智能技术生成

什么是 Puppeteer?

要想知道什么是 Pyppeteer,首先应该先了解一下 Puppeteer:

Puppeteer 是 Google 基于 Node.js 开发的一个工具,拥有 Puppeteer 即可通过 JavaScript 来控制 Chrome 浏览器的一些操作,也可以用于网络爬虫上,其 API 极其完善,功能非常强大。

什么是 Pyppeteer?

Pyppeteer 是 Puppeteer 的 Python 实现,Pyppetter 基于 Chromium 浏览器通过执行一些动作来进行网页渲染,Pyppeteer 基于 Python 的新特性 async 实现,因此它也支持异步操作,效率相对于 Selenium 也有一定的提高。

使用 Pyppeteer 进行页面渲染

在这里插入图片描述

豆瓣电影筛选页面页面是 JavaScript 渲染生成的,此处使用 Pyppeteer,模拟浏览器的操作,直接用浏览器把页面渲染出来,然后再直接获取渲染后的结果。

import asyncio

from lxml import etree
from faker import Faker
from pyppeteer import launch

fake = Faker()
URL = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'


async def main():
    browser = await launch()
    page = await browser.newPage()

    await page.setUserAgent(fake.user_agent())
    await page.goto(URL, options={
   'timeout': 10000})

    doc = etree.HTML((await page.content()))
    titles_xpath = "//div[@class='list']/a[@class='item']/div/img/@alt"
    titles = doc.xpath(titles_xpath)
    print(titles)

    await browser.close()


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

运行结果:

['心灵奇旅', '无依之地', '迈阿密的一夜', '捕鲸男孩', '绿洲', '我是大哥大 电影版', '除暴', '女人的碎片', '波斯语课', '穷途鼠的奶酪梦', '一秒钟', '刻在你心底的名字', '神奇女侠1984', '白虎', '玫瑰岛的不可思议的历史', '2020去死', '沐浴之王', '我和我的家乡', '夺冠', '信条']

具体分析如下:

使用 launch 方法新建一个 Browser 对象,相当于启动浏览器;接着 browser 调用 newPage 方法新建了一个 Page 对象,相当于浏览器新建一个选项卡,随后调用 setUserAgent 方法设置 User-Agent,然后 Page 对象调用了 goto 方法访问目标页面,相当于在浏览器中输入目标 URL,浏览器跳转到了对应页面进行加载;页面加载完成后再调用 content 方法获取当前浏览器页面的源代码,即 JavaScript 渲染后的结果;最后使用 lxml 进行解析并提取电影名称。

可以看到 Pyppeteer 的代码比 Selenium 更简洁易读,且环境配置更方便,还实现了异步爬取。

除此以外,我们还可以尝试 Pyppeteer 的其他功能:

import asyncio

from faker import Faker
from pyppeteer import launch

fake = Faker()
URL = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'


async def main():
    browser = await launch()
    page = await browser.newPage()

    await page.setViewport(viewport={
   'width': 1280, 'height': 800})
    await page.setUserAgent(fake.user_agent())
    await page.goto(URL, options={
   'timeout': 10000})

    await asyncio.sleep(4.12)
    await page.screenshot(path='screenshot.png')

    dimensions = await page.evaluate('''() => {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }''')
    print(dimensions)

    await browser.close()


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

运行结果:

{
   'width': 1263, 'height': 800, 'deviceScaleFactor': 1.0000000149011612}

此处使用 setViewport 方法设定了浏览器窗口大小并模拟了网页截图,此外还执行了自定义的 JavaScript 以获得特定的内容。

截图如下:
在这里插入图片描述
最后调用 evaluate 方法执行 JavaScript 代码,其传入一个函数,返回网页的宽高、像素大小比率,最后得到一个 JSON 格式的对象。

Pyppeteer 常用方法

launch

使用 Pyppeteer 的第一步是调用 launch 方法来启动浏览器,首先通过官方文档查看 launch 方法的定义:

pyppeteer.launcher.launch(options: dict=None, **kwargs) → pyppeteer.browser.Browser

launch 方法处于 launcher 模块中,参数没有在声明中特别指定,返回类型是 browser 模块中的 Browser 对象,launch 方法是 async 修饰的方法,因此调用时需要使用 await。

launch 方法的参数如下:

参数 描述
ignoreHTTPSErrors (bool) 是否要忽略 HTTPS 的错误,默认是 False。
headless (bool) 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。
executablePath (str) 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
slowMo (int or float) 通过传入指定的时间,可以减缓 Pyppeteer 的一些模拟操作。
args (List[str]) 在执行过程中可以传入的额外参数。
ignoreDefaultArgs (bool) 不使用 Pyppeteer 的默认参数,如果使用了这个参数,那么最好通过 args 参数来设定一些参数,否则可能会出现一些意想不到的问题。这个参数相对比较危险,慎用。
handleSIGINT (bool) 是否响应 SIGINT 信号,也就是可以使用 Ctrl + C 来终止浏览器程序,默认是 True。
handleSIGTERM (bool) 是否响应 SIGTERM 信号,一般是 kill 命令,默认是 True。
handleSIGHUP (bool) 是否响应 SIGHUP 信号,即挂起信号,比如终端退出操作,默认是 True。
dumpio (bool) 是否将 Pyppeteer 的输出内容传给 process.stdout 和 process.stderr 对象,默认是 False。
userDataDir (str) 即用户数据文件夹,即可以保留一些个性化配置和操作记录。
env (dict) 环境变量,可以通过字典形式传入。
devtools (bool) 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。
logLevel (int or str) 日志级别,默认和 root logger 对象的级别相同。
autoClose (bool) 当一些命令执行完之后,是否自动关闭浏览器,默认是 True。
loop (asyncio.AbstractEventLoop) 事件循环对象。

有头模式和调试模式

import asyncio

from faker import Faker
from pyppeteer import launch

fake = Faker()
URL = 'https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'


async def main():
    browser = await launch({
   'headless': False,
                            'devtools': True,
                            })
    page = await browser.newPage()

    await page.setUserAgent(fake.user_agent())
    await page.goto(URL, options={
   'timeout': 10000
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值