什么是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
如果没有报错,证明安装成功
版本更新:
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())
打印结果如下:
关于为什么主动访问的和爬虫抓取的数据不同,是因为爬虫工具启动的浏览器有很多特征能被网站检测到,所以有安全意识的企业会设置一些屏蔽。像百度这种大企业,有强大安全团队和法务团队的公司,所以一般练练手就行了,不要做违法的事。