Py学习  »  Python

Python 自动化神器 - DrissionPage

AirPython • 1 周前 • 46 次点击  

搞爬虫的不会没听过拽神这个项目吧

图片

引言

之前一直玩整站采集,采集所有ebay,amazon,taobao,tiktok,dy,xhs,搞大数据采集的优点鄙视链,鄙视这种操控系列的。然而后面发现反而是这种小需求采集,业务需求特别大,不用破解不用大规模工程化,开发也简单。  下面这个工具是我常用工具之一,配合指纹浏览器很爽,直接放弃selenium

DrissionPage 简介

DrissionPage 是一个用 Python 写的网页自动化工具,它把 Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式(就像用 Selenium 那样)和无浏览器模式(类似用 requests)之间自由切换。有了这个功能,不管是处理需要 JavaScript 渲染的动态网页内容,还是抓取简单的静态页面数据,DrissionPage 都能轻松搞定。

这个工具提供了三种主要的页面对象,每种对象都有适合自己的使用场景。

  • ChromiumPage:主要用来直接操作浏览器,适合那些需要和网页进行交互的情况,比如点击按钮、输入文本、运行 JavaScript 脚本等。不过它的性能会受到浏览器的限制,运行速度可能没那么快,占用的内存也可能比较多。
  • WebPage:是个综合性的页面对象,它既能控制浏览器,又能收发数据包。它有两种模式,d 模式用来操作浏览器,功能很强大,但运行速度慢;s 模式主要处理数据包,速度快,适合数据包比较简单的情况。
  • SessionPage:是个轻量级的页面对象,专门用来发送和接收数据包,不需要和网页进行交互。它处理大规模数据爬取的效率很高,是这方面的理想选择。

功能特点

无缝切换模式

DrissionPage 让开发者可以在 Selenium 的浏览器驱动和 Requests 的会话之间随意切换。要是需要渲染网页,就用 Selenium;要是想快速抓取数据,就用 Requests。比如说,碰到一个既有动态内容又有静态内容的网页,就可以先用 SessionPage 快速拿到静态数据,再切换到 ChromiumPage 或者 WebPage 的 d 模式去处理动态内容。

简化的接口

DrissionPage 提供了统一的接口,把网页自动化和数据抓取的流程简化了。开发者不用再分别去学 Selenium 和 Requests 这两个库复杂的 API 了,能节省很多学习和开发的时间。就拿定位网页元素来说,DrissionPage 提供了和 Selenium 类似的 ele() 和 eles() 方法,支持好几种选择器类型(像 CSS 选择器、XPath),用起来特别方便。

灵活定制

它支持用户自己设置请求头、代理、超时时间这些东西,让网页抓取变得更灵活。在抓取数据的时候,有时候会碰到网站的反爬机制,这时候设置一下自定义请求头和代理,就能顺利绕过这些限制。

内置常用功能

DrissionPage 里面有很多常用的功能,比如等待元素加载、自动重试等。处理动态网页的时候,网页元素加载可能需要点时间,DrissionPage 的等待元素加载功能就能保证在元素加载好之后再进行操作,避免因为元素没加载完而出错。

多标签页操作

它可以同时操作浏览器里的多个标签页,就算标签页不是当前激活的状态,也不用切换就能操作。在需要同时处理多个网页的时候,这个功能就特别实用,能大大提高工作效率。

抓包功能升级 - Listen 功能

在 DrissionPage 4.0 版本里,抓包功能有了很大的提升,每个页面对象都内置了监听器,能力变强了,API 也更合理了。这对开发者调试和采集数据有很大帮助。

旧 API 变化

在旧版本(3.2)里,抓包功能主要靠 FlowViewer 和 wait.data_packets() 来实现,但存在漏抓数据、信息不全、API 设计不合理等问题。在 4.0 版本中,对旧的 API 做了很多调整:

  • 不再使用 FlowViewer,以后也不会再升级它了。
  • 删除了  wait.set_targets()
  • 删除了 wait.stop_listening() 方法。
  • 删除了 wait.data_packets() 方法。
  • DrissionPage.common 路径下的 FlowViewer 也被删掉了。

新 API

  • 每个标签页对象(包括 ChromiumFrame)都多了一个 listen 属性,有监听功能。
  • 可以用  listen.start() 和 listen.stop() 来启动和停止监听。
  • 用 listen.wait() 可以等待数据包。
  • 用 listen.steps() 能同步获取监听结果。
  • 增加了 listen.wait_silent() 来等待所有请求完成(包括不在目标范围内的请求)。
  • 监听结果的结构也优化了,请求和响应的数据分开存放。

示例

下面这个例子可以直接运行看看效果,它还会记录时间,能让你了解 Listen 功能怎么用:

from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint

page = ChromiumPage()
page.listen.start('api/getkeydata')  # 指定要监听的目标,然后启动监听
pinner = Pinner(TrueFalse)
page.get('http://www.hao123.com/')  # 打开这个网站
packet = page.listen.wait()  # 等着拿到数据包
pprint(packet.response.body)  # 把数据包里的内容打印出来
pinner.pin('用时'True)

运行这段代码后,会把监听得到的数据包内容和整个过程花的时间都输出出来,方便开发者分析性能和调试。

页面访问逻辑优化

在 3.x 版本里,页面连接有两个主要问题:浏览器页面对象 get() 方法的 timeout 参数只对页面加载阶段有用,对连接阶段没用;加载策略 none 模式在实际中没什么用。这两个问题在 4.0 版本都解决了,而且用户可以自己控制什么时候终止连接。另外,还对连接逻辑做了优化,避免出现卡死的情况。

API 变化

  • 页面对象的  page_load_strategy 属性改名叫 load_mode 了。
  • set.load_strategy 改成 set.load_mode 了。

行为变化

  • get() 方法的 timeout 参数现在对整个过程都有用了。
  • timeout 参数对不是  get() 方法触发的页面加载(像点击链接)也能起作用。
  • SessionPage 和 WebPage 的 s 模式,如果收到空数据,会自动重试。
  • SessionPage 的 get() 方法可以打开本地文件了。

新的 none 加载模式

在旧版本里,none 加载策略是页面连接成功就马上停止加载,实际用处不大。在新版本里,这个模式改成:除非页面加载完成,否则程序不会主动停止加载(就算超时了也不会),同时连接状态不会阻碍程序运行,用户可以自己判断状态,主动停止加载。这样用户就有很大的自由,可以等关键数据包或者元素出现了,就主动停止页面加载,大大提高执行效率。

示例

还是用上面那个例子的代码,不过把加载模式设置成  none,等拿到数据就主动停止加载。

from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint

page = ChromiumPage()
page.set.load_mode.none()  # 设置加载模式为 none
page.listen.start('api/getkeydata')  # 指定监听目标并启动监听
pinner = Pinner(TrueFalse)
page.get('http://www.hao123.com/')  # 访问网站
packet = page.listen.wait()  # 等待数据包
page.stop_loading()  # 主动停止加载
pprint(packet.response.body)  # 打印数据包正文
pinner.pin('用时'True)

使用场景

网页自动化测试

利用 Selenium 的功能,模拟用户在网页上的操作,进行自动化测试。可以对网页的各种功能,像登录、注册、提交表单等进行测试,保证网页稳定可靠。

数据抓取

用 Requests 来获取静态页面的数据,碰到复杂页面就切换到浏览器模式。这样能快速高效地抓取各种网站的数据,像新闻、商品信息、社交网络数据等。

爬虫开发

结合它灵活的模式切换和强大的元素定位功能,DrissionPage 很适合开发各种类型的爬虫。可以根据网站的特点选择合适的模式,提高爬虫的效率和稳定性。

使用示例

操控浏览器

用 ChromiumPage 对象可以轻松实现浏览器的自动化操作,比如登录、填写表单等。

from DrissionPage import ChromiumPage

page = ChromiumPage()
page.get('https://gitee.com/login')  # 打开登录页面
# 找到账号输入框
user_login = page.ele('#user_login')
user_login.input('您的账号')  # 输入账号
# 找到密码输入框
user_password = page.ele('#user_password')
user_password.input('您的密码')  # 输入密码
# 找到登录按钮并点击
login_button = page.ele('@value=登 录')
login_button.click()

爬取数据

用 SessionPage 对象可以高效地爬取数据,不用和网页进行复杂的交互。

from DrissionPage import SessionPage

page = SessionPage()
for i in range(14):  # 循环访问三页
    page.get(f'https://gitee.com/explore/all?page={i}')  # 打开每一页
    # 找到所有项目链接元素
    links = page.eles( '.title project - namespace - path')
    for link in links:  # 遍历每个链接元素
        print(link.text, link.link)  # 打印链接的文本和地址

页面分析

用 WebPage 对象可以在浏览器模式和数据包模式之间灵活切换,适应不同的分析需求。

from DrissionPage import WebPage

page = WebPage()
page.get('https://gitee.com/explore/all')  # 打开页面
page.change_mode()  # 切换模式
# 找到项目列表元素
items = page.ele('.ui relaxed divided items explore - repo__list').eles('.item')
for item in items:  # 遍历每个项目
    print(item('t:h3').text)  # 打印项目标题
    print(item('.project - desc mb - 1').text)  # 打印项目描述

总结

DrissionPage 是个功能强大、使用方便的 Python 开源包,它为网页自动化和数据抓取提供了高效又灵活的解决方案。通过整合 Selenium 和 Requests 的功能,提供了无缝切换模式和简单的接口,让开发者能更专注于业务逻辑。不管是新手开发者还是有经验的专业人士,DrissionPage 都值得一试,能让我们更轻松地完成各种网页自动化任务。

在实际使用的时候,我们可以根据具体需求选择合适的页面对象和模式,结合它丰富的功能和方便的操作方法,提高开发效率和代码质量。同时,也要注意遵守网站的爬虫规则,合理使用这个工具,别给网站造成不必要的麻烦。


来源丨CodeGank

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184353
 
46 次点击