关于python:0基础学爬虫爬虫基础之自动化工具-Pyppeteer-的使用

1次阅读

共计 4997 个字符,预计需要花费 13 分钟才能阅读完成。

大数据时代,各行各业对数据采集的需要日益增多,网络爬虫的使用也更为宽泛,越来越多的人开始学习网络爬虫这项技术,K 哥爬虫此前曾经推出不少爬虫进阶、逆向相干文章,为实现从易到难全方位笼罩,特设【0 根底学爬虫】专栏,帮忙小白疾速入门爬虫,本期为自动化工具 Pyppeteer 的应用。

概述

前两期文章中曾经介绍到了 Selenium 与 Playwright 的应用办法,它们的性能都十分弱小。而本期要讲的 Pyppeteer 与 Playwright 统一,都能够作为 Selenium 的替代者来应用。且与 Playwright 相比,Pyppeteer 的应用更加简略。

Pyppeteer 的应用

介绍

在上上期文章中,咱们介绍了 Selenium 暗藏特色的办法,其中应用到了 stealth.min.js 文件。在介绍文件的起源时咱们提到了 Puppeteer,Puppeteer 是一个基于 Node.js 的自动化工具。而这期要将的 Pyppeteer 就是 Puppeteer 的 Python 版。

Pyppeteer 是一个应用 Python 语言封装的 Google Chrome 浏览器的非官方 API。它能够用来进行自动化测试、网站爬虫和数据抓取等工作。

Pyppeteer 的底层是通过调用 Chrome 浏览器的 DevTools Protocol 接口来实现的。DevTools Protocol 是一个基于 WebSocket 协定的近程调试接口,能够让开发者管制和查看 Chrome 浏览器的行为。Pyppeteer 利用这个接口实现了对 Chrome 浏览器的齐全管制,包含加载页面、模仿用户操作、获取页面内容等等。

Pyppeteer 反对 Python 3.6 及以上版本,并且能够在 Windows、macOS 和 Linux 等操作系统上运行。它提供了简略易用的 API,能够不便地模仿用户在浏览器上的操作,例如点击链接、填写表单、触发事件等等。同时,它也反对对浏览器的调试、截屏、PDF 导出等高级性能。

Pyppeteer 的应用形式与其余 Python 库相似,能够通过 pip 包管理器进行装置。除了 Pyppeteer 自身外,还须要装置 asyncio 库和一个兼容的 Chrome 浏览器版本。在装置实现后,能够通过 Python 代码来管制浏览器的行为,实现各种自动化测试或数据抓取的工作。

装置

Pyppeteer 的装置与 Playwright 类似。

Pyppeteer 采纳了 async 机制,所以必须应用 Python 3.5 及以上版本。

首先应用 pip 装置 Pyppeteer 包:

pip install pyppeteer

装置实现后能够抉择执行 pyppeteer-install 下载用于 pyppeteer 的 chromium,这一步能够省略,因为第一次运行 Pyppeteer 时会自动检测是否装置了 chromium 浏览器,如果没有安装程序会主动进行装置配置。

应用

前两期文章中介绍到了 Selenium 与 Playwright 库的应用办法,因为自动化库的应用大同小异,所以这里只介绍 Pyppeteer 中比拟非凡的办法

Pyppeteer 基于异步实现,所以它反对异步操作。

启动

以百度热搜榜为例:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://top.baidu.com/board?tab=realtime')
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

示例代码中应用 launch 办法创立了一个浏览器对象 browser,设置了 headless=False 来敞开无头模式,这一行代码的作用相当于启动一个浏览器,await 的作用就是期待浏览器启动结束。

创立完浏览器后,应用到了 newPage 办法,创立了一个 Page 对象,这一步相当于关上了一个新的标签页,通过 await 期待标签页创立结束,而后调用 goto 办法关上指标网址,最初应用 close 办法敞开浏览器。

launch 详解

launch 办法用于启动浏览器过程并返回浏览器实例,它蕴含了多个参数:

参数 形容
ignoreHTTPSErrors(bool) 是否疏忽 HTTPS 谬误。默认为 False
headless(bool) 是否开启无头模式。默认为 True
executablePath(str) 可执行文件的门路,设置该参数能够指定已有的 Chrome 或 Chromium 浏览器。
slowMo(int \ float) 传入指定工夫(毫秒),用于延缓 Pyppeteer 的一些模仿操作。
args(List [str]) 传递给浏览器的额定参数。
dumpio(bool) 是否将 Pyppeteer 的输入信息传给 process.stdoutprocess.stderr。默认为 False
userDataDir(str) 用户数据文件夹。
env(dict) 浏览器环境。默认与 Python 过程雷同。
devtools(bool) 是否为每个标签页关上 DevTools 面板,默认为 False, 如果该参数为 True,则 headless 会被强制设置为 False
logLevel(int \ str) 日志级别。默认值与根记录器雷同。
autoClose(bool) 脚本实现时主动敞开浏览器过程。默认为 True
loop(asyncio.AbstractEventLoop) 事件循环。

禁用提示条

与 Selenium 一样,Pyppeteer 管制浏览器时会提醒 Chrome 正受到自动测试软件的管制。能够通过 设置 launch 办法中的 args 参数来敞开提醒。

browser = await launch(headless=False, args=['--disable-infobars'])

用户数据长久化

自动化工具如 Selenium、Playwright 都有一个特色,就是每一次运行的时候创立的都是一个全新的浏览器,它不会记录用户之前的行为。如第一次运行时我登录了某个网站,而第二次运行时再次进入该网站时仍旧须要登录。这是因为自动化工具没有记录用户行为信息。Pyppeteer 中,如果须要记录用户的行为信息,能够通过设置 launch 办法中的 userDataDir 办法来实现。

browser = await launch(headless=False, args=['--disable-infobars'], userDataDir='./userdata')

设置了用户数据文件夹后运行代码,会生成一个 userdata 文件夹,其中就存储着用户上次管制浏览器时记录的一些行为数据。

执行 JS 语句

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://top.baidu.com/board?tab=realtime')
    dimensions = await page.evaluate('''() => {
           return {
               width: document.documentElement.clientWidth,
               height: document.documentElement.clientHeight,
               deviceScaleFactor: window.devicePixelRatio,
           }
       }''')
    print(dimensions)
    await browser.close()
# {'width': 783, 'height': 583, 'deviceScaleFactor': 1}

通过调用 Page 对象下的 evaluate 办法能够执行一段 JS 语句。

反检测

Pyppeteer 的反检测形式与 Selenium 和 Playwright 有些区别,然而思维是一样的。

首先须要装置 pyppeteer_stealth 库,它的作用就是用来暗藏特色。

pip install pyppeteer_stealth

以无头模式为例:

import asyncio
from pyppeteer import launch
from pyppeteer_stealth import stealth


async def main():
    browser = await launch()
    page = await browser.newPage()
    # 暗藏特色
    await stealth(page)
    
    await page.goto('https://bot.sannysoft.com/')
    await page.screenshot(path='page.png')
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())

暗藏特色前:

[](https://imgse.com/i/p9w2ogH)

暗藏特色后:

期待

waitForSelector:期待符合条件的节点加载实现

waitForFunction:期待某个 JavaScript 办法执行结束或返回后果

waitForRequest:期待某个特定的申请收回

waitForResponse:期待某个特定申请对应的响应

waitForNavigation:期待页面跳转,如果页面加载失败则抛出异样

waitFor:通用期待

waitForXpath:期待合乎 Xpath 的节点加载进去

选择器

Pyppeteer 提供了一些比拟有意思的选择器办法。

J():返回匹配到的第一个节点,等同于 querySelector 办法。

JJ():返回匹配到的所有节点,等同于 querySelectorAll 办法。

JJeval():执行 JS 脚本并返回一个 JSON 对象,等同于 querySelectorAllEval 办法。

Jeval():执行 JS 脚本并返回执行后果,等同于 querySelectorEval 办法。

Jx():通过 Xpath 匹配符合条件的内容,等同于 xpath 办法。

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.goto('https://top.baidu.com/board?tab=realtime')
    # 期待元素加载
    await page.waitForXPath('//div[@class="c-single-text-ellipsis"]')
    element_j = await page.J('.c-single-text-ellipsis')
    element_jj = await page.JJ('.c-single-text-ellipsis')
    # 打印元素的文本信息
    print(await (await element_j.getProperty('textContent')).jsonValue())
    for element in element_jj:
        # 打印元素的文本信息
        print(await (await element.getProperty('textContent')).jsonValue())

    await browser.close()

asyncio.get_event_loop().run_until_complete(main())
"""
运行后果:青年强则国家强 
青年强则国家强 
乌代表举自家国旗寻衅暴揍俄代表 
英王加冕礼彩排:黄金钻石马车亮眼 
平庸岗位上的奋斗故事 
俞敏洪倡议 24 节气都放假 
7 人吃自助 4 小时炫 300 多个螃蟹 
  .
  .
  .
"""

总结

Pyppeteer 相似于轻量级的 Playwright,它应用起来更加简略,且 Pyppeteer 与 Playwright 一样都反对异步,性能方面也比拟强。毛病就是它基于 Chromium 内核,资源耗费比拟大,不反对其它浏览器,而且 Pyppeteer 的作者近年来都没对该库进行保护,导致存在一些 bug。

正文完
 0