Python爬虫Pyppeteer使用详解:异步抓取与Selenium替代方案

沈亦白
沈亦白
发布时间:2026-10-13 | 3人浏览过
原创

本文深入解析Pyppeteer作为Selenium替代方案的用法。介绍其基于Python async机制的异步优势,详解launch方法的headless、args等关键参数配置,并通过实例演示如何自动处理Chromium依赖及结合pyquery解析JS渲染页面,实现高效网页数据抓取。

引言

Pyppeteer简介与优势

在使用Selenium进行网页自动化时,常面临环境配置的繁琐问题:需手动安装Chrome或Firefox等浏览器,下载对应驱动,并配置Python Selenium库,大规模部署时尤为头疼。为此,本节介绍一个功能相似的替代工具——Pyppeteer。

Pyppeteer简介

需注意,本文讲解的是Pyppeteer,而非Puppeteer。Puppeteer是Google基于Node.js开发的工具,允许通过JavaScript控制Chrome浏览器操作,也可用于网络爬虫,其API完善且功能强大。Pyppeteer则是Puppeteer的Python版本实现,由一位日本工程师基于Puppeteer部分功能开发,属于非官方版本。

Pyppeteer运行背后依赖类似Chrome的Chromium浏览器执行动作以完成网页渲染。首先简述Chrome与Chromium的关系。

Chromium是Google为研发Chrome启动的完全开源项目,两者基于相同源代码构建。Chrome的新功能先在Chromium上实现,验证稳定后移植,因此Chromium更新频率更高且包含更多新功能,但用户群体相对小众。两款浏览器“同根同源”,拥有相同Logo但配色不同:Chrome由蓝、红、绿、黄四色组成,Chromium则由不同深度的蓝色构成。

Pyppeteer依赖于Chromium浏览器运行。使用Pyppeteer可免去繁琐的环境配置:若首次运行时未安装Chromium,程序会自动安装和配置。此外,Pyppeteer基于Python的新特性async实现,支持异步操作,执行效率较Selenium有所提升。

环境安装与快速上手

环境安装

由于Pyppeteer采用Python的async机制,其运行要求的Python版本为3.5及以上。


pip install pyppeteer

快速上手

- 爬取http://quotes.toscrape.com/js/ 全部页面数据


import asyncio
from pyppeteer import launch
from lxml import etree
 
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://quotes.toscrape.com/js/')
page_text = await page.content()
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="quote"]')
print(len(div_list))
await browser.close()
 
asyncio.get_event_loop().run_until_complete(main())

结合协程


from pyppeteer import launch
import asyncio
from lxml import etree

# 实例化浏览器对象(谷歌测试版)
async def main():
  bro = await launch()
  # 新建一个空白页
  page = bro.newPage()
  page.goto('http://quotes.toscrape.com/js/')

  # 获取page当前显示页面的源码数据
  page_text = await page.content()

  return page_text

def parse(task):
  page_text = task.result()
  tree = etree.HTML(page_text)
  div_list = tree.xpath('//div[@class="quote"]')
  for div in div_list:
    content = div.xpath('./span[1]/text()')
    print(content)

c = main()
task = asyncio.ensure_future(c)
task.add_done_callback(parse)
loop = asyncio.get_event_loop()
loop.run_until_complete(c)

解释:

launch方法会新建一个Browser对象,然后赋值给browser,接着调用newPage方法相当于在浏览器中新建一个选项卡,同时生成Page对象。随后Page对象调用goto方法,相当于在浏览器中输入该URL,浏览器跳转至对应页面进行加载。加载完成后,再调用content方法,返回当前浏览器页面的源代码。

进一步地,我们可以使用pyquery对获取的页面进行解析,从而得到JavaScript渲染后的结果。在此过程中,无需配置Chrome浏览器或浏览器驱动,免去了繁琐步骤,同样达到了Selenium的效果,并实现了异步抓取。

launch方法参数详解

详细用法

  • 开启浏览器
  • 调用launch方法即可,相关参数介绍:
    • ignoreHTTPSErrors (bool): 是否忽略HTTPS错误,默认值为False。
    • headless (bool): 是否启用Headless模式(无界面模式)。若devtools参数为True,则该参数自动设为False,否则为True(默认开启无界面模式)。
    • executablePath (str): 可执行文件路径。若指定此参数,则无需使用默认Chromium,可指定已有的Chrome或Chromium路径。
    • args (List[str]): 执行过程中可传入的额外参数列表。
    • devtools (bool): 是否为每个页面自动开启调试工具,默认值为False。若将此参数设为True,则headless参数将失效,被强制设为False。
  • 关闭提示条:”Chrome 正受到自动测试软件的控制”,这个提示条有点烦,那咋关闭呢?这时候就需要用到 args 参数了,禁用操作如下:
    • browser = await launch(headless=False, args=['--disable-infobars'])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表