田敏
返回博客列表
技术

DrissionPage的使用

田敏
2024-12-012 分钟阅读
PythonBackend

DrissionPage 是一个用于 Web 自动化测试和数据抓取的 Python 库,基于 SeleniumPlaywright,它旨在提供更加高效和简化的接口,帮助开发者在网页自动化过程中更容易地进行操作、抓取数据、以及与浏览器进行交互。

1. DrissionPage 概述

DrissionPage 是一个封装了 Selenium 和 Playwright 的库,它使得 Web 自动化操作更加简便。它提供了统一的 API 来同时支持这两个常用的浏览器自动化框架。因此,使用 DrissionPage 你可以轻松切换不同的浏览器引擎,而无需关注底层的细节。它支持页面操作、网络请求监控、文件下载、截图等功能,非常适合用于 Web 数据抓取、网页自动化、浏览器行为模拟等任务。

2. DrissionPage 的安装

要使用 DrissionPage,首先需要安装它和它的依赖项。你可以通过以下命令来安装:

pip install drission

此外,DrissionPage 依赖于 SeleniumPlaywright,通常会自动安装。你可以根据需要选择不同的浏览器引擎来运行。

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)进行自动化操作,确保广泛的兼容性。
  • 简化 APIDrissionPage 提供了高层的 API,减少了直接使用 Selenium 或 Playwright 时需要编写的代码量。
  • 强大的数据抓取支持:可以监听网络请求,方便抓取由 JavaScript 动态加载的数据。
  • 内置等待机制:内置的等待机制可以自动处理页面元素加载,避免了需要手动设置等待的麻烦。
  • 易于扩展:你可以灵活地扩展 DrissionPage 以满足特殊的业务需求,支持更多复杂的页面操作。

5. 与 Selenium 和 Playwright 的比较

DrissionPage 作为一个封装库,结合了 Selenium 和 Playwright 的优点。Selenium 是一个老牌的浏览器自动化工具,适用于许多不同的浏览器和应用场景,而 Playwright 提供了更现代的浏览器自动化功能,特别是在性能和对现代 Web 应用的支持上表现得更好。DrissionPage 提供了一个统一的接口,使得切换和使用这两者变得更加简单。

  • Selenium:较为成熟,支持更多的浏览器和操作系统,适合传统的网页自动化。
  • Playwright:性能更优,特别适用于现代 Web 应用和 SPA(单页应用),支持更高级的功能,如网页录制、视频录制、模拟设备等。

6. 总结

DrissionPage 是一个方便的浏览器自动化工具,它结合了 SeleniumPlaywright 的优点,简化了自动化任务的实现。无论是抓取动态加载的内容、执行 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()
版权协议:MIT返回列表