社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 自动化神器 - DrissionPage

AirPython • 5 天前 • 42 次点击  

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

图片

引言

之前一直玩整站采集,采集所有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

END



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/187510