DrissionPage的使用
DrissionPage 是一个用于 Web 自动化测试和数据抓取的 Python 库,基于 Selenium 和 Playwright,它旨在提供更加高效和简化的接口,帮助开发者在网页自动化过程中更容易地进行操作、抓取数据、以及与浏览器进行交互。
1. DrissionPage 概述
DrissionPage 是一个封装了 Selenium 和 Playwright 的库,它使得 Web 自动化操作更加简便。它提供了统一的 API 来同时支持这两个常用的浏览器自动化框架。因此,使用 DrissionPage 你可以轻松切换不同的浏览器引擎,而无需关注底层的细节。它支持页面操作、网络请求监控、文件下载、截图等功能,非常适合用于 Web 数据抓取、网页自动化、浏览器行为模拟等任务。
2. DrissionPage 的安装
要使用 DrissionPage,首先需要安装它和它的依赖项。你可以通过以下命令来安装:
pip install drission
此外,DrissionPage 依赖于 Selenium 和 Playwright,通常会自动安装。你可以根据需要选择不同的浏览器引擎来运行。
3. DrissionPage 基本用法
以下是 DrissionPage 的一些基本使用方法,涵盖了浏览器实例化、页面操作、监听请求等常见的任务。
3.1 实例化浏览器对象
首先,你需要创建一个 DrissionPage 对象,这个对象会实例化一个浏览器,用于访问网页和执行自动化任务。
from drission import DrissionPage
# 创建一个DrissionPage对象,选择要使用的浏览器引擎(默认为Chromium)
page = DrissionPage(browser='chrome') # 或者使用 'firefox' 或 'webkit'
# 打开一个网页
page.get('https://www.example.com')
3.2 页面操作
DrissionPage 提供了类似于 Selenium 的操作方法,可以执行常见的浏览器操作。
1. 点击元素
# 点击页面上的一个按钮或链接
page.click('button.submit')
2. 输入文本
# 在文本框中输入内容
page.fill('input[name="username"]', 'myusername')
3. 获取页面内容
# 获取页面的标题
title = page.title()
print(title)
# 获取页面的 HTML 内容
html = page.content()
print(html)
3.3 监听网络请求
DrissionPage 还支持监听浏览器中的网络请求,这对于抓取 AJAX 请求返回的数据或其他网络操作非常有用。
# 设置监听数据包,捕获特定的请求
page.listen.start('https://www.example.com/api/data')
# 执行浏览器操作,触发数据请求
page.get('https://www.example.com')
# 等待监听到的数据包响应
response_data = page.listen.wait()
# 获取数据包的内容
json_data = response_data.response.body
print(json_data)
3.4 执行 JavaScript
如果需要执行一些 JavaScript 代码,DrissionPage 也提供了接口来执行。
# 执行JavaScript代码
page.execute_script('alert("Hello World")')
3.5 滚动页面
如果你需要滚动页面以加载更多内容,可以使用以下方法:
# 滚动页面到底部
page.scroll_to_bottom()
3.6 截图和录制视频
DrissionPage 还提供了截图和录制视频的功能。
# 截取屏幕截图
page.screenshot(path='screenshot.png')
# 开始录制视频
page.start_record_video(path='recording.mp4')
3.7 关闭浏览器
在操作完成后,可以关闭浏览器。
# 关闭浏览器
page.close()
4. 使用 DrissionPage 的优势
- 跨浏览器支持:你可以选择不同的浏览器引擎(Chrome, Firefox, Webkit)进行自动化操作,确保广泛的兼容性。
- 简化 API:
DrissionPage提供了高层的 API,减少了直接使用 Selenium 或 Playwright 时需要编写的代码量。 - 强大的数据抓取支持:可以监听网络请求,方便抓取由 JavaScript 动态加载的数据。
- 内置等待机制:内置的等待机制可以自动处理页面元素加载,避免了需要手动设置等待的麻烦。
- 易于扩展:你可以灵活地扩展
DrissionPage以满足特殊的业务需求,支持更多复杂的页面操作。
5. 与 Selenium 和 Playwright 的比较
DrissionPage 作为一个封装库,结合了 Selenium 和 Playwright 的优点。Selenium 是一个老牌的浏览器自动化工具,适用于许多不同的浏览器和应用场景,而 Playwright 提供了更现代的浏览器自动化功能,特别是在性能和对现代 Web 应用的支持上表现得更好。DrissionPage 提供了一个统一的接口,使得切换和使用这两者变得更加简单。
- Selenium:较为成熟,支持更多的浏览器和操作系统,适合传统的网页自动化。
- Playwright:性能更优,特别适用于现代 Web 应用和 SPA(单页应用),支持更高级的功能,如网页录制、视频录制、模拟设备等。
6. 总结
DrissionPage 是一个方便的浏览器自动化工具,它结合了 Selenium 和 Playwright 的优点,简化了自动化任务的实现。无论是抓取动态加载的内容、执行 JavaScript 操作,还是监听网络请求,DrissionPage 都提供了高层次的支持,适合快速实现 Web 自动化操作。
如果你需要处理复杂的网页自动化任务,特别是抓取由 JavaScript 动态加载的数据或监控网络请求,DrissionPage 会是一个非常有用的工具。
7.实例
通过DrissionPage获取BOSS直聘数据
from DrissionPage import ChromiumPage
import pandas as pd
# 定义一个Job类 来接受返回的数据
class JobInfo:
def __init__(self, bossName, bossTitle, jobName, salaryDesc, jobLabels, jobExperience, jobDegree, cityName,
brandName, brandIndustry, brandScaleName, welfareList):
self.bossName = bossName
self.bossTitle = bossTitle
self.jobName = jobName
self.salaryDesc = salaryDesc
self.jobLabels = jobLabels
self.jobExperience = jobExperience
self.jobDegree = jobDegree
self.cityName = cityName
self.brandName = brandName
self.brandIndustry = brandIndustry
self.brandScaleName = brandScaleName
self.welfareList = welfareList
def __str__(self):
return f'bossName:{self.bossName}, bossTitle:{self.bossTitle}, jobName:{self.jobName}, salaryDesc:{self.salaryDesc}, jobLabels:{self.jobLabels}, jobExperience:{self.jobExperience}, jobDegree:{self.jobDegree}, cityName:{self.cityName}, brandName:{self.brandName}, brandIndustry:{self.brandIndustry}, brandScaleName:{self.brandScaleName}, welfareList:{self.welfareList}'
# 定义一个属性名称到备注名称的映射
column_name_map = {
'bossName': '老板名字',
'bossTitle': '老板职称',
'jobName': '职位名称',
'salaryDesc': '薪资',
'jobLabels': '职位标签',
'jobExperience': '工作经验',
'jobDegree': '学历要求',
'cityName': '城市',
'brandName': '公司名称',
'brandIndustry': '公司行业',
'brandScaleName': '公司规模',
'welfareList': '公司福利'
}
# 实例化一个浏览器对象
page = ChromiumPage()
# 设置监听的数据包
page.listen.start('https://www.zhipin.com/wapi/zpgeek/search/joblist.json')
# 设置浏览器访问的地址
page.get("https://www.zhipin.com/web/geek/job?query=C%23&city=101280600")
# 定义一个列表来存放JobInfo对象
job_info_list = []
# 循环获取数据
for i in range(10):
print(f'正在获取第{i + 1}页的数据')
# 等待数据包的加载
res_data = page.listen.wait()
# 获取数据包的内容
json_data = res_data.response.body
# 取出json数据中的职位信息
job_list = json_data['zpData']['jobList']
# 遍历职位信息
for job in job_list:
# 取出职位信息中的数据
bossName = job['bossName']
bossTitle = job['bossTitle']
jobName = job['jobName']
salaryDesc = job['salaryDesc']
jobLabels = job['jobLabels']
jobExperience = job['jobExperience']
jobDegree = job['jobDegree']
cityName = job['cityName']
brandName = job['brandName']
brandIndustry = job['brandIndustry']
brandScaleName = job['brandScaleName']
welfareList = job['welfareList']
# 实例化一个JobInfo对象
job_info = JobInfo(bossName, bossTitle, jobName, salaryDesc, jobLabels, jobExperience, jobDegree, cityName,
brandName, brandIndustry, brandScaleName, welfareList)
# 将JobInfo对象添加到列表中
job_info_list.append(job_info)
# 打印JobInfo对象
for job_info in job_info_list:
print(job_info)
# 点击下一页
page.ele('css:.options-pages a:last-of-type').click()
# 将数据持久化存储到excel中
# 将字典转换为DataFrame
df = pd.DataFrame([job_info.__dict__ for job_info in job_info_list])
# 重命名列名
df.rename(columns=column_name_map, inplace=True)
# 将DataFrame写入到excel中
df.to_excel('BossJob.xlsx', index=False)
# 关闭浏览器
page.close()