爬虫-Pyppeteer技术

本文介绍了Pyppeteer,一个基于Puppeteer的Python版本,用于通过JavaScript控制Chrome或Chromium浏览器执行操作,特别适用于网络爬虫。文章详细讲解了Pyppeteer的安装、使用场景(如爬取百度首页热搜)以及注意事项,强调了其异步性能和与Selenium相比的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Pyppeteer

先了解一个工具:Puppeteer是Google基于Node.js开发的一个工具

有了它我们可以通过JavaScript来控制Chrome浏览器的一些操作

当然也可以用作网络爬虫上,其API极其完善,功能非常强大

Selenium当然同样可以做到

Pyppeteer实际上是Puppeteer的Python版本的实现

是一位来自于日本的工程师依据Puppeteer的一些功能开发出来的非官方版本

Pyppetter中,实际上背后也是有一个类似Chrome浏览器的Chromium浏览器在执行一些动作进行网页渲染

Chromium是谷歌公司为了开发Chrome而开发的一个开源项目,他们的内核是一样的,实现方式也是一样的,可以视为Chrome的开发版

Pyppeteer的优势

免去繁琐的环境配置作用,首次运行如果没有安装Chromium浏览器,程序会自动安装配置。

基于python的新特性async来实现的,它的执行可以支持异步操作,比selenium效率更高

Pyppeteer的安装

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

安装方式:

pip3 install pyppeteer

安装完成之后在命令行下测试:

>>>import pyppeteer

如果没有报错,证明安装成功

版本更新:

GitHub - pyppeteer/pyppeteer: Headless chrome/chromium automation library (unofficial port of puppeteer)

Pyppeteer API 文档

API Reference — Pyppeteer 0.0.25 documentation (miyakogi.github.io)

Pyppeteer的应用

1. 爬取百度首页热搜栏列表内容

'''
coding:utf-8
@Software:PyCharm
@Time:2024/4/12 15:28
@Author:吴祉峤
'''
import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch() # 启动浏览器
    page = await  browser.newPage() # 新建一个选项卡但未访问任何页面
    await page.goto('https://www.baidu.com/') # 跳转到目标页面进行加载
    # await page.waitForSelector('.productcarditem__destitle') # 等待选择器的节点信息加载,超时为止
    try:
        # 等待元素出现在页面中,并确保其为可见状态,设置超时时间为5000毫秒
        await page.waitForSelector('.title-content-title', {'visible': True, 'timeout': 5000})
        print("Element is visible")
    except Exception as e:
        print("Element did not appear within 5 seconds:", e)
    doc = pq(await page.content()) # 获取当前页面的源代码,是js渲染后的结果
    names = [item.text() for item in doc('.title-content-title').items()]
    print('Names:',names)
    await browser.close()

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

在以上爬取百度首页热搜栏列表内容时,发现主动访问时看到的是10个,但实际抓取的只有6个,因此有了下面的打印步骤。打印能看到pyppeteer在访问网页时实际看到的页面和我们主动访问的不大一致。

2.打印

eteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch() # 启动浏览器
    page = await  browser.newPage() # 新建一个选项卡但未访问任何页面
    await page.goto('https://www.baidu.com/') # 跳转到目标页面进行加载
    await page.pdf({
        'path': './example6.pdf',  # PDF 文件的保存路径
        'format': 'A4',  # 纸张格式
        'printBackground': True,  # 是否打印背景图形
        'margin': {  # 设置页边距
            'top': '20px',
            'right': '20px',
            'bottom': '20px',
            'left': '20px'
        }
    })
    await browser.close()

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

打印结果如下:

关于为什么主动访问的和爬虫抓取的数据不同,是因为爬虫工具启动的浏览器有很多特征能被网站检测到,所以有安全意识的企业会设置一些屏蔽。像百度这种大企业,有强大安全团队和法务团队的公司,所以一般练练手就行了,不要做违法的事。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值