第一章、探索DrissionPage:Python下的高效网页自动化与浏览器控制
1、DrissionPage初识
DrissionPage 是一个基于 Python 的网页自动化工具,它结合了浏览器控制和数据包收发的能力,旨在提供一种既便利又高效的网页自动化解决方案。以下是 DrissionPage 的一些详细介绍和特性:
-
双模式支持 :DrissionPage 提供了两种模式,分别是
requests
模式和selenium
模式。requests
模式适合静态网页抓取,而selenium
模式适合处理动态网页和需要用户操作的网页。 -
强大的自研内核:DrissionPage 采用全自研的内核,提供了许多实用功能,并且在常用功能上做了整合和优化。与 Selenium 相比,DrissionPage 有以下优点:
- 无 webdriver 特征,无需为不同版本的浏览器下载不同的驱动。
- 运行速度更快。
- 可以跨 iframe 查找元素,无需切入切出。
- 把 iframe 看作普通元素,获取后可直接在其中查找元素,逻辑更清晰。
- 可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换。
- 可以直接读取浏览器缓存来保存图片,无需用 GUI 点击另存。
- 可以对整个网页截图,包括视口外的部分(90以上版本浏览器支持)。
- 可处理非
open
状态的 shadow-root。
-
亮点功能:DrissionPage 内置了无数人性化设计和便捷功能,包括:
- 极简的语法规则,集成大量常用功能,代码更优雅。
- 定位元素更加容易,功能更强大稳定。
- 无处不在的等待和自动重试功能,使不稳定的网络变得易于控制,程序更稳定,编写更省心。
- 提供强大的下载工具,操作浏览器时也能享受快捷可靠的下载功能。
- 允许反复使用已经打开的浏览器,无需每次运行从头启动浏览器,调试超方便。
- 使用 ini 文件保存常用配置,自动调用,提供便捷的设置,远离繁杂的配置项。
- 内置 lxml 作为解析引擎,解析速度成几个数量级提升。
- 使用 POM 模式封装,可直接用于测试,便于扩展。
- 高度集成的便利功能,从每个细节中体现。
-
安装与升级:DrissionPage 可以通过 pip 进行安装和升级,命令如下:
# 安装 pip install DrissionPage # 升级指定版本 pip install DrissionPage==4.0.0b17
。
-
导包与简单示例 :DrissionPage 提供了不同的页面类,如
ChromiumPage
、SessionPage
和WebPage
,以适应不同的使用场景。以下是一个简单的使用示例:pythonfrom DrissionPage import ChromiumPage page = ChromiumPage() page.get('https://www.baidu.com') page('#kw').input('DrissionPage') page('#su').click() page.wait.load_start() links = page.eles('tag:h3') for link in links: print(link.text)
。
DrissionPage 的设计理念是"简洁而强大",它将 Driver(驱动)和 Session(会话)的概念结合起来,形成了 Drission,意为"拽神",而 Page 表示以页面为单位操作。DrissionPage 支持 Windows、Linux、Mac 系统,以及 Python 3.6 及以上版本,适用于 Chromium 内核浏览器和 electron 应用。
6.扩展
iframe
是 HTML 中的一个元素,全称为"inline frame",即内联框架。它允许在一个网页中嵌入另一个网页。iframe
可以用于多种目的,比如:
- 内容嵌入:在主页面中嵌入第三方网站的内容,比如视频、地图、文档等。
- 广告展示:在网页中嵌入广告,这些广告通常由第三方提供。
- 多文档交互:在一个页面中显示多个文档,用户可以在这些文档之间交互。
- 模块化布局:将页面分割成多个区域,每个区域可以独立加载和操作。
iframe
的基本语法如下:
html
<iframe src="url" title="description" width="width" height="height"></iframe>
src
属性指定了要嵌入的页面的 URL。title
属性提供了对iframe
内容的描述,这对于辅助技术(如屏幕阅读器)是有用的。width
和height
属性定义了iframe
的尺寸。
iframe
也有一些安全和隐私方面的考虑,比如跨域问题。如果 iframe
中的内容来自不同的域,那么出于安全考虑,浏览器会限制主页面与 iframe
内容之间的交互,这被称为同源策略。此外,iframe
也可能被用于点击劫持攻击,因此现代网站通常会采取一些措施来防止这种攻击,比如设置 X-Frame-Options
响应头。
在网页设计中,iframe
是一个非常有用的工具,但也需要谨慎使用,以确保网站的安全性和用户体验。
2、尝试DrissionPage操作浏览器
2.1、启动浏览器
python
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('https://DrissionPage.cn')
上述代码执行后会跳转到浏览器界面并打开到DrissionPage的网页,但初次使用可能会遇到浏览器异常,这里就需要设置默认启动的浏览器;
这里的浏览器路径不一定是 Chrome,Edge 等 Chromium 内核的浏览器都可以。
打开浏览器,在地址栏输入chrome://version (Edge 输入edge://version ),回车然后复制可执行文件路径即可。
2.2、设置或保存浏览器地址
再次通过代码启动,这个地址可以根据自己的需求进行调整
python
from DrissionPage import Chromium, ChromiumOptions
path = r'C:\Program Files (x86)\Google\Chrome\Application\chrone.exe' # 请改为你电脑内Chrome可执行文件路径
co = ChromiumOptions().set_browser_path(path) # 设置默认启动浏览器
tab = Chromium(co).latest_tab
tab.get('https://DrissionPage.cn')
如果不想每次设置这个地址,可以将配置保存到指定文件中,如下代码所示:
python
from DrissionPage import Chromium, ChromiumOptions
path = r'C:\Program Files (x86)\Google\Chrome\Application\chrone.exe' # 请改为你电脑内Chrome可执行文件路径
"""
会保存这个配置后续默认使用这个:D:\miniconda3\lib\site-packages\DrissionPage\_configs\configs.ini
"""
ChromiumOptions().set_browser_path(path).save()
tab = Chromium().latest_tab
tab.get('https://DrissionPage.cn')
执行后会输出保存的地址
python
配置已保存到文件:D:\miniconda3\lib\site-packages\DrissionPage\_configs\configs.ini
以后程序可自动从文件加载配置。
3、登录账号操作
python
from DrissionPage import Chromium
# 启动或接管浏览器,并创建标签页对象
tab = Chromium().latest_tab
# 跳转到登录页面
tab.get('https://gitee.com/login')
# 定位到账号文本框,获取文本框元素并输入密码
tab.ele('#user_login').input('你自己的账号') # #是按照id属性查找元素
# 定位到密码文本框并输入密码
tab.ele('#user_password').input('账号密码')
# 选中勾选框保存账号
tab.ele('#user_remember_me').input('checked')
# 点击登录按钮
tab.ele('@value=登 录').click() # @是按照value属性作为查找条件
4、网页分析
使用用于收发数据包的页面类SessionPage
其中.text获取元素的文本,.link获取元素的href或src属性。
python
from DrissionPage import SessionPage
# 创建页面对象
page = SessionPage()
# 访问某一页的网页
num = 2 # 页码
page.get(f'https://gitee.com/explore/Artificial-Intelligence?page={num}')
# 获取所有开源库<a>元素列表
links = page.eles('@class=title project-namespace-path') # 列表
# 遍历所有<a>元素
for link in links:
# 打印链接信息,text是仓库名,link是仓库地址
print(link.text, link.link)
输出:
python
D:\miniconda3\python.exe F:\datasets\DrissionPage\2.网页分析.py
北京智云视图科技有限公司/HyperLPR https://gitee.com/zeusees/HyperLPR
明月心/PaddleOCRSharp https://gitee.com/raoyutian/PaddleOCRSharp
MindSpore/graphengine https://gitee.com/mindspore/graphengine
之江天枢/Dubhe https://gitee.com/zhijiangtianshu/Dubhe
MindSpore/mindinsight https://gitee.com/mindspore/mindinsight
inspur-inna/inna1.0 https://gitee.com/inspur-inna/inna1.0
唉可悲/tianruoocr-cl https://gitee.com/wanglifree/tianruoocr-cl
MindSpore/community https://gitee.com/mindspore/community
endless/idCardCv https://gitee.com/endlesshh/idCardCv
MindSpore/course https://gitee.com/mindspore/course
百度开源/Senta https://gitee.com/baidu/Senta
wzpan/wukong-robot https://gitee.com/wzpan/wukong-robot
Ascend/ModelLink https://gitee.com/ascend/ModelLink
Ascend/samples https://gitee.com/ascend/samples
MindSpore/mindformers https://gitee.com/mindspore/mindformers
Process finished with exit code 0