DrissionPage 简介#
https://github.com/g1879/DrissionPage
DrissionPage 是一个用 Python 写的网页自动化工具,它把 Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式(就像用 Selenium 那样)和无浏览器模式(类似用 requests)之间自由切换。有了这个功能,不管是处理需要 JavaScript 渲染的动态网页内容,还是抓取简单的静态页面数据,DrissionPage 都能轻松搞定。
主要页面对象#
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 也更合理了。这对开发者调试和采集数据有很大帮助。
示例代码#
下面这个例子可以直接运行看看效果,它还会记录时间,能让你了解 Listen 功能怎么用:
from DrissionPage import ChromiumPage
from TimePinner import Pinner
from pprint import pprint
page = ChromiumPage()
page.listen.start('api/getkeydata') # 指定要监听的目标,然后启动监听
pinner = Pinner(True, False)
page.get('http://www.hao123.com/') # 打开这个网站
packet = page.listen.wait() # 等着拿到数据包
pprint(packet.response.body) # 把数据包里的内容打印出来
pinner.pin('用时', True)
运行这段代码后,会把监听得到的数据包内容和整个过程花的时间都输出出来,方便开发者分析性能和调试。
页面访问逻辑优化#
在 3.x 版本里,页面连接有两个主要问题:浏览器页面对象 get()
方法的 timeout
参数只对页面加载阶段有用,对连接阶段没用;加载策略 none
模式在实际中没什么用。这两个问题在 4.0 版本都解决了,而且用户可以自己控制什么时候终止连接。
使用场景#
网页自动化测试#
利用 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(1, 4): # 循环访问三页
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 都值得一试,能让我们更轻松地完成各种网页自动化任务。