编辑文档

This commit is contained in:
g1879 2023-01-08 23:10:54 +08:00
parent 93c9793285
commit 5e25e64b70
18 changed files with 390 additions and 283 deletions

161
README.md
View File

@ -1,12 +1,14 @@
# ✨️简洁!易用 !方便!✨️
#
DrissionPage即 driver 和 session 组合而成的 page。
是个基于 python 的 Web 自动化操作集成工具。
它用 POM 模式封装了页面和元素常用的方法,
自带一套简洁直观优雅的元素定位语法,
实现了浏览器和 requests 之间的无缝切换,
可兼顾浏览器自动化的便利性和 requests 的高效率,
更棒的是,它的使用方式非常简洁和人性化,代码量少,对新手友好。
DrissionPage 是一个基于 python 的网页自动化工具。
它既能控制浏览器,也能收发数据包,甚至能把两者合而为一,
可兼顾浏览器自动化的便利性和 requests 的高效率。
它功能强大,内置无数人性化设计和便捷功能。
它的语法简洁而优雅,代码量少,对新手友好。
**使用文档:** 📒[点击打开](http://g1879.gitee.io/drissionpage)
@ -14,17 +16,26 @@ DrissionPage即 driver 和 session 组合而成的 page。
**联系邮箱:** g1879@qq.com
## 📕 背景
# 📕 背景
用 requests 做数据采集面对要登录的网站时要分析数据包、JS 源码构造复杂的请求往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。因此,这个库将它们合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
用 requests 做数据采集面对要登录的网站时要分析数据包、JS 源码构造复杂的请求往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。
因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
一切从简,尽量提供简单直接的使用方法,对新手更友好。
# 🔆 3.0 版隆重推出
# 💡 理念
以前的版本是对 selenium 进行重新封装实现的。从 3.0 开始,作者另起炉灶,对底层进行了重新开发,摆脱对 selenium 的依赖,增强了功能,提升了运行效率。
3.0 全新开发的页面对象是`WebPage`,支持 chromium 内核的浏览器(如 chrome 和 edge。除了保持之前的功能比依赖 selenium 的`MixPage`有以下优点:
简洁!易用 !方便!
# ☀️ 特性和亮点
作者经过长期实践,踩过无数坑,总结出的经验全写到这个库里了。
## 🎇 强大的自研内核
本库采用全自研的内核,内置了 N 多实用功能,对常用功能作了整合和优化,对比 selenium有以下优点
- 无 webdriver 特征,不会被网站识别
@ -36,64 +47,34 @@ DrissionPage即 driver 和 session 组合而成的 page。
- 把 iframe 看作普通元素,获取后可直接在其中查找元素,逻辑更清晰
- 可以同时操作浏览器中的多个标签页,即使标签页为非激活状态
- 可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换
- 可以直接读取浏览器缓存来保存图片,无需用 GUI 点击
- 可以直接读取浏览器缓存来保存图片,无需用 GUI 点击
- 可以对整个网页截图包括视口外的部分90以上版本浏览器支持
- 对 Linux 提供良好支持
新版是自己实现的功能,开发不会受太多限制,以后将主要对`WebPage`进行更新。
3.0 版已经发布,目前正在测试,欢迎试用并提出意见,让我做得更好。
# 💡 特性和亮点
作者踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
## 🎉 特性
- 代码高度集成,以简洁的代码为第一追求。
- 页面对象可在浏览器和 requests 间任意切换,保留登录状态。
- 极简单但强大的元素定位语法,支持链式操作,代码极其简洁。
- 两种模式提供一致的 API使用体验一致。
- 人性化设计,集成众多实用功能,大大降低开发工作量。
## 🎇 亮点功能
- 每次运行程序可以反复使用已经打开的浏览器。如手动设置网页到某个状态,再用程序接管,或手动处理登录,再用程序爬内容。无须每次运行从头启动浏览器,超级方便。
- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置 API远离繁杂的配置项。
- 极致简明的定位语法,支持直接按文本定位元素,支持直接获取前后兄弟元素和父元素等。
- 强大的下载工具,操作浏览器时也能享受快捷可靠的下载功能。
- 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等。
- 访问网址带自动重试功能,可设置间隔和超时时间。
- 访问网页能自动识别编码,无须手动设置。
- 链接参数默认自动生成`Host``Referer`属性。
- 可随时直接隐藏或显示浏览器进程窗口,非 headless 或最小化。
- 可自动下载合适版本的 chromedriver免去麻烦的配置。
- d 模式查找元素内置等待,可任意设置全局等待时间或单次查找等待时间。
- 点击元素集成 js 点击方式,一个参数即可切换点击方式。
- 点击支持失败重试,可用于保证点击成功、判读网页遮罩层是否消失等。
- 输入文本能自动判断是否成功并重试,避免某些情况下输入或清空失效的情况。
- d 模式下支持全功能的 xpath可直接获取元素的某个属性selenium 原生无此功能。
- 支持直接获取`shadow-root`,和普通元素一样操作其下的元素。
- 支持直接获取`after``before`伪元素的内容。
- 可以在元素下直接使用 > 以 css selector 方式获取当前元素直接子元素。原生不支持这种写法。
- 可简单地使用 lxml 来解析 d 模式的页面或元素,爬取复杂页面数据时速度大幅提高。
- 输出的数据均已转码及处理基本排版,减少重复劳动。
- 可方便地与 selenium 或 requests 原生代码对接,便于项目迁移。
- 使用 POM 模式封装,可直接用于测试,便于扩展。
- d 模式配置可同时兼容`debugger_address`和其它参数,原生不能兼容。
- 还有很多这里不一一列举…………
除了以上优点,本库还内置了无数人性化设计。
# 🍀 简单演示
- 极简的语法规则。集成大量常用功能,代码更优雅
- 定位元素更加容易,功能更强大稳定
- 无处不在的等待和自动重试功能。使不稳定的网络变得易于控制,程序更稳定,编写更省心
- 提供强大的下载工具。操作浏览器时也能享受快捷可靠的下载功能
- 允许反复使用已经打开的浏览器。无须每次运行从头启动浏览器,调试超方便
- 使用 ini 文件保存常用配置,自动调用,提供便捷的设置,远离繁杂的配置项
- 内置 lxml 作为解析引擎,解析速度成几个数量级提升
- 使用 POM 模式封装,可直接用于测试,便于扩展
- 高度集成的便利功能,从每个细节中体现
- 还有很多细节,这里不一一列举,欢迎实际使用中体验:)
☘️ **与 selenium 代码对比**
# 🌟 简单演示
## ⭐ **与 selenium 代码对比**
以下代码实现一模一样的功能,对比两者的代码量:
🌿 用显性等待方式定位第一个文本包含`some text`的元素
✨️ 用显性等待方式定位第一个文本包含`some text`的元素
```python
# 使用 selenium
@ -103,17 +84,17 @@ element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH,
element = page('some text')
```
🌿 跳转到第一个标签页
✨️ 跳转到第一个标签页
```python
# 使用 selenium
driver.switch_to.window(driver.window_handles[0])
# 使用 DrissionPage
page.to_tab(0)
page.to_tab(page.tabs[0])
```
🌿 按文本选择下拉列表
✨️ 按文本选择下拉列表
```python
# 使用 selenium
@ -126,7 +107,7 @@ select_element.select_by_visible_text('text')
element.select('text')
```
🌿 拖拽一个元素
✨️ 拖拽一个元素
```python
# 使用 selenium
@ -136,7 +117,7 @@ ActionChains(driver).drag_and_drop(ele1, ele2).perform()
ele1.drag_to(ele2)
```
🌿 滚动窗口到底部(保持水平滚动条不变)
✨️ 滚动窗口到底部(保持水平滚动条不变)
```python
# 使用 selenium
@ -146,18 +127,7 @@ driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, docu
page.scroll.to_bottom()
```
🌿 设置 headless 模式
```python
# 使用 selenium
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# 使用 DrissionPage
set_headless()
```
🌿 获取伪元素内容
✨️ 获取伪元素内容
```python
# 使用 selenium
@ -168,9 +138,7 @@ text = webdriver.execute_script('return window.getComputedStyle(arguments[0], ":
text = element.pseudo_after
```
🌿 shadow-root 操作
selenium 新增了`ShadowRoot`,但功能实在是太少。
✨️ shadow-root 操作
```python
# 使用 selenium
@ -184,17 +152,7 @@ ele = shadow_element.ele('tag:div')
ele.click()
```
🌿 用 xpath 直接获取属性或文本节点(返回文本)
```python
# 使用 selenium 无此功能
# 使用 DrissionPage
class_name = element('xpath://div[@id="div_id"]/@class')
text = element('xpath://div[@id="div_id"]/text()[2]')
```
🌿 随时让浏览器窗口消失和显示
✨️ 随时让浏览器窗口消失和显示Windows系统
```python
# selenium 无此功能
@ -204,13 +162,11 @@ page.hide_browser() # 让浏览器窗口消失
page.show_browser() # 重新显示浏览器窗口
```
注:本功能只支持 Windows。
☘️ **与 requests 代码对比**
## ⭐ **与 requests 代码对比**
以下代码实现一模一样的功能,对比两者的代码量:
🌿 获取元素内容
✨️ 获取元素内容
```python
url = 'https://baike.baidu.com/item/python'
@ -218,22 +174,21 @@ url = 'https://baike.baidu.com/item/python'
# 使用 requests
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
response = requests.get(url, headers=headers)
html = etree.HTML(response.text)
element = html.xpath('//h1')[0]
title = element.text
# 使用 DrissionPage
page = MixPage('s')
page = WebPage('s')
page.get(url)
title = page('tag:h1').text
```
Tips: DrissionPage 自带默认`headers`
🌿 下载文件
✨️ 下载文件
```python
url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
@ -249,9 +204,9 @@ with open(f'{save_path}\\img.png', 'wb') as fd:
page.download(url, save_path, 'img') # 支持重命名,处理文件名冲突,自动创建目标文件夹
```
☘️ **模式切换**
## ⭐ **模式切换**
selenium 登录网站,然后切换到 requests 读取网页。两者会共享登录信息。
浏览器登录网站,然后切换到 requests 读取网页。两者会共享登录信息。
```python
page = WebPage() # 创建页面对象,默认 driver 模式
@ -300,7 +255,7 @@ Git 命令学习
[点击跳转到使用文档](http://g1879.gitee.io/drissionpage)
# 🎯️ 版本历史
# 🔖 版本历史
[点击查看版本历史](http://g1879.gitee.io/drissionpage/#/%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2)

View File

@ -21,11 +21,11 @@ DrissionPage 是一个基于 python 的网页自动化工具。
除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
一切从简,尽量提供简单直接的使用方法,对新手更友好。
# ✨️ 理念
# 💡 理念
简洁!易用 !方便!
# 💡 特性和亮点
# ☀️ 特性
作者经过长期实践,踩过无数坑,总结出的经验全写到这个库里了。

View File

@ -1,66 +1,74 @@
* [⭐️ 1 概述](README.md)
* [📣 1 概述](README.md)
* [☀️ 2 特性和亮点](#)
* [💖 2.1 贴心设计](特性和亮点\贴心设计.md)
* [🌟 2.2 特性演示](#)
* [⭐ 与 requests 对比](特性和亮点\特性演示\与requests代码对比.md)
* [⭐ 与 selenium 对比](特性和亮点\特性演示\与selenium代码对比.md)
* [⭐ 模式切换](特性和亮点\特性演示\模式切换.md)
* [⭐ 获取并打印元素属性](特性和亮点\特性演示\获取并打印元素属性.md)
* [⭐ 下载文件](特性和亮点\特性演示\下载文件.md)
* [🧭 2 入门指南](#)
* [🔥 2.1 基本概念](入门指南\基本概念.md)
* [👍 2.2 快速上手](入门指南\快速上手.md)
* [🍀 2.3 特性演示](#)
* [🌿 与 requests 对比](入门指南\特性演示\与requests代码对比.md)
* [🌿 与 selenium 对比](入门指南\特性演示\与selenium代码对比.md)
* [🌿 模式切换](入门指南\特性演示\模式切换.md)
* [🌿 获取并打印元素属性](入门指南\特性演示\获取并打印元素属性.md)
* [🌿 下载文件](入门指南\特性演示\下载文件.md)
* [💖 2.4 贴心设计](入门指南\贴心设计.md)
* [🛠 3 WebPage 使用方法](#)
* [🔨 3.0 简介](WebPage使用方法\3.0概述.md)
* [🔨 3.1 创建页面对象](WebPage使用方法\3.1创建页面对象.md)
* [🔨 3.2 访问网页](WebPage使用方法\3.2访问网页.md)
* [🔨 3.3 查找元素](WebPage使用方法\3.3查找元素.md)
* [🔨 3.4 获取元素信息](WebPage使用方法\3.4获取元素信息.md)
* [🔨 3.5 元素操作](WebPage使用方法\3.5元素操作.md)
* [🔨 3.6 获取网页信息](WebPage使用方法\3.6获取网页信息.md)
* [🔨 3.7 页面操作](WebPage使用方法\3.7页面操作.md)
* [🔨 3.8 标签页操作](WebPage使用方法\3.8标签页操作.md)
* [🔨 3.9 iframe操作](WebPage使用方法\3.9iframe操作.md)
* [🔨 3.10 动作链](WebPage使用方法\3.10动作链.md)
* [🌏 2.1 基本概念](入门指南\基本概念.md)
* [🌏 2.2 安装和导入](入门指南\安装和导入.md)
* [🌏 2.3 准备工作](入门指南\准备工作.md)
* [🌏 2.4 上手示例](#)
* [🌐 控制浏览器](入门指南\上手示例\控制浏览器.md)
* [🌐 收发数据包](入门指南\上手示例\收发数据包.md)
* [🌐 模式切换](入门指南\上手示例\模式切换.md)
* [🛠 4 MixPage 使用方法](#)
* [🔨 4.1 创建页面对象](MixPage使用方法\创建页面对象.md)
* [🔨 4.2 访问网页](MixPage使用方法\访问网页.md)
* [🔨 4.3 查找页面元素](MixPage使用方法\查找页面元素.md)
* [🔨 4.4 获取元素信息](MixPage使用方法\获取元素信息.md)
* [🔨 4.5 元素操作](MixPage使用方法\元素操作.md)
* [🔨 4.6 获取网页信息](MixPage使用方法\获取网页信息.md)
* [🔨 4.7 页面操作](MixPage使用方法\页面操作.md)
* [🔨 4.8 cookies 的使用](MixPage使用方法\cookies的使用.md)
* [🔨 4.9 Drission 对象](MixPage使用方法\Drission对象.md)
* [🔨 4.10 对接 selenium 及 requests 代码](MixPage使用方法\对接selenium及requests代码.md)
* [🔨 4.11 使用其它系统或浏览器](MixPage使用方法\使用其它系统或浏览器.md)
* [🔨 4.12 DriverPage 和 SessionPage](MixPage使用方法\DriverPage和SessionPage.md)
* [🛠 3 使用方法](#)
* [📝 5 启动配置](#)
* [🗒️ 5.1 概述](启动配置\概述.md)
* [🗒️ 5.2 浏览器启动配置](启动配置\浏览器启动配置.md)
* [🗒️ 5.3 Session 启动配置](启动配置\Session启动配置.md)
* [🗒️ 5.4 使用配置文件](启动配置\使用配置文件.md)
* [🔨 3.0 简介](WebPage使用方法\3.0简介.md)
* [🔨 3.1 创建页面对象](WebPage使用方法\3.1创建页面对象.md)
* [🔨 3.2 访问网页](WebPage使用方法\3.2访问网页.md)
* [🔨 3.3 查找元素](WebPage使用方法\3.3查找元素.md)
* [🔨 3.4 获取元素信息](WebPage使用方法\3.4获取元素信息.md)
* [🔨 3.5 元素操作](WebPage使用方法\3.5元素操作.md)
* [🔨 3.6 获取网页信息](WebPage使用方法\3.6获取网页信息.md)
* [🔨 3.7 页面操作](WebPage使用方法\3.7页面操作.md)
* [🔨 3.8 标签页操作](WebPage使用方法\3.8标签页操作.md)
* [🔨 3.9 iframe操作](WebPage使用方法\3.9iframe操作.md)
* [🔨 3.10 动作链](WebPage使用方法\3.10动作链.md)
* [🧰 6 进阶使用](#)
* [⚙️ 6.1 打包程序](进阶使用\打包程序.md)
* [⚙️ 6.2 监听浏览器网络](进阶使用\监听浏览器网络.md)
* [⚙️ 6.3 下载文件](进阶使用\下载文件.md)
* [📝 4 启动配置](#)
* [🗒️ 4.1 概述](启动配置\概述.md)
* [🗒️ 4.2 浏览器启动配置](启动配置\浏览器启动配置.md)
* [🗒️ 4.3 Session 启动配置](启动配置\Session启动配置.md)
* [🗒️ 4.4 使用配置文件](启动配置\使用配置文件.md)
* [🧰 5 进阶使用](#)
* [⚙️ 5.1 打包程序](进阶使用\打包程序.md)
* [⚙️ 5.2 监听浏览器网络](进阶使用\监听浏览器网络.md)
* [⚙️ 5.3 下载文件](进阶使用\下载文件.md)
* [🛠 6 旧版使用方法](#)
* [🔨 6.1 创建页面对象](MixPage使用方法\创建页面对象.md)
* [🔨 6.2 访问网页](MixPage使用方法\访问网页.md)
* [🔨 6.3 查找页面元素](MixPage使用方法\查找页面元素.md)
* [🔨 6.4 获取元素信息](MixPage使用方法\获取元素信息.md)
* [🔨 6.5 元素操作](MixPage使用方法\元素操作.md)
* [🔨 6.6 获取网页信息](MixPage使用方法\获取网页信息.md)
* [🔨 6.7 页面操作](MixPage使用方法\页面操作.md)
* [🔨 6.8 cookies 的使用](MixPage使用方法\cookies的使用.md)
* [🔨 6.9 Drission 对象](MixPage使用方法\Drission对象.md)
* [🔨 6.10 对接 selenium 及 requests 代码](MixPage使用方法\对接selenium及requests代码.md)
* [🔨 6.11 使用其它系统或浏览器](MixPage使用方法\使用其它系统或浏览器.md)
* [🔨 6.12 DriverPage 和 SessionPage](MixPage使用方法\DriverPage和SessionPage.md)
* [⚡️ 7 示例和技巧](#)
* [🌠 自动登录码云](示例和技巧\自动登录码云.md)
* [🌠 采集猫眼电影TOP100榜](示例和技巧\采集猫眼电影TOP100榜.md)
* [🌠 下载星巴克产品图片](示例和技巧\下载星巴克产品图片.md)
* [🌠 下载豆瓣图书封面图片](示例和技巧\下载豆瓣图书封面图片.md)
* [🌠 多线程操作多标签页](示例和技巧\多线程操作多标签页.md)
* [🌠 自动登录码云](示例和技巧\自动登录码云.md)
* [🌠 采集猫眼电影TOP100榜](示例和技巧\采集猫眼电影TOP100榜.md)
* [🌠 下载星巴克产品图片](示例和技巧\下载星巴克产品图片.md)
* [🌠 下载豆瓣图书封面图片](示例和技巧\下载豆瓣图书封面图片.md)
* [🌠 多线程操作多标签页](示例和技巧\多线程操作多标签页.md)
* [🔖 9 版本历史](版本历史.md)

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

View File

@ -0,0 +1,89 @@
现在,我们通过一些例子,来直观感受一下 DrissionPage 的工作方式。
本示例演示使用`ChromiumPage`控制浏览器登录 gitee 网站。
# ✔️ 页面分析
网址:[https://gitee.com/login](https://gitee.com/login)
打开网址,按`F12`,我们可以看到页面元素如下:
![](gitee_1.jpg)
用户名输入框`id``'user_login'`,密码输入框`id``'user_password'`,登录按钮`value``'登 录'`
我们可以用这三个属性定位这三个元素,然后对其输入数据和点击。
# ✔️ 示例代码
您可以把以下代码复制到编辑器,把账号和密码改为您自己的,可直接执行看到运行结果。
```python
from DrissionPage import ChromiumPage
# 创建页面对象,并启动或接管浏览器
page = ChroiumPage()
# 跳转到登录页面
page.get('https://gitee.com/login')
# 定位到账号文本框,获取文本框元素
ele = page.ele('#user_login')
# 输入对文本框输入账号
ele.input('你的账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('你的密码')
# 点击登录按钮
page.ele('@value=登 录').click()
```
# ✔️ 示例详解
首先,我们导入用于控制浏览器的类`ChromiumPage`
```python
from DrissionPage import ChromiumPage
```
接下来,我们创建一个`ChromiumPage`对象。
```python
page = ChromiumPage()
```
`get()`方法用于访问参数中的网址。它会等待页面完全加载,再继续执行后面的代码。您也可以修改等待策略,如等待 DOM 加载而不等待资源下载,就停止加载,这将在后面的章节说明。
```python
page.get('https://gitee.com/login')
```
`ele()`方法用于查找元素,它返回一个`ChromiumElement`元素对象,可用于对元素的操作。
`'#user_login'`是定位符文本,`#`意思是按`id`属性查找元素。
值得一提的是,`ele()`内置了等待,如果元素未加载,它会执行等待,直到元素出现或到达时限。默认超时时间 10 秒。
```python
ele = page.ele('#user_login')
```
`input()`方法用于对元素输入文本。
```python
ele.input('你的账号')
```
我们也可以进行链式操作。
```python
page.ele('#user_password').input('你的密码')
```
输入账号密码后,以相同的方法获取按钮元素,并对其执行点击操作。
不同的是,这次通过其`value`属性作为查找条件。`@`表示按属性名查找。
```python
page.ele('@value=登 录').click()
```
到这里,我们已完成了自动登录 gitee 网站的操作。

View File

@ -0,0 +1,90 @@
本示例演示用`SessionPage`已收发数据包的方式采集 gitee 网站数据。
本示例不使用浏览器。
# ✔️ 页面分析
网址:[https://gitee.com/explore/all](https://gitee.com/explore/all)
这个示例的目标,要获取所有库的名称和链接,为避免对网站造成压力,我们只采集 3 页。
打开网址,按`F12`,我们可以看到页面元素如下:
![](gitee_2.jpg)
从 html 代码中可以看到,所有开源项目的标题都是`class`属性为`'title project-namespace-path'``<a>`元素。我们可以遍历这些`<a>`元素,获取它们的信息。
同时,我们观察到,列表页网址是以页数为参数访问的,如第一页 url 为`https://gitee.com/explore/all?page=1`,页数就是`page`参数。因此我们可以通过修改这个参数访问不同的页面。
# ✔️ 示例代码
以下代码可直接运行并查看结果:
```python
from DrissionPage import SessionPage
# 创建页面对象
page = SessionPage()
# 爬取3页
for i in range(1, 4):
# 访问某一页的网页
p.get(f'https://gitee.com/explore/all?page={i}')
# 获取所有开源库<a>元素列表
links = p.eles('.title project-namespace-path')
# 遍历所有<a>元素
for link in links:
# 打印链接信息
print(link.text, link.link)
```
输出:
```
小熊派开源社区/BearPi-HM_Nano https://gitee.com/bearpi/bearpi-hm_nano
明月心/PaddleSegSharp https://gitee.com/raoyutian/PaddleSegSharp
RockChin/QChatGPT https://gitee.com/RockChin/QChatGPT
TopIAM/eiam https://gitee.com/topiam/eiam
以下省略。。。
```
# ✔️ 示例详解
首先,我们导入用于收发数据包的类`SessionPage`
```python
from DrissionPage import SessionPage
```
接下来,我们创建一个`SessionPage`对象。
```python
page = SessionPage()
```
然后我们循环 3 次,以构造每页的 url每次都用`get()`方法访问该页网址。
```python
for i in ranage(1, 4):
    p.get(f'https://gitee.com/explore/all?page={i}')
```
访问网址后,我们用页面对象的`eles()`获取页面中所有`class`属性为`'title project-namespace-path'`的元素对象。
`eles()`方法用于查找多个符合条件的元素,返回由它们组成的`list`
这里查找的条件是`class`属性,`.`表示按`class`属性查找元素。
```python
links = p.eles('.title project-namespace-path')
```
最后,我们遍历获取到的元素列表,获取每个元素的属性并打印出来。
`.text`获取元素的文本,`.link`获取元素的`href``src`属性。
```python
for link in links:
print(link.text, link.link)
```

View File

@ -0,0 +1 @@
# 施工中。。。

View File

@ -0,0 +1,43 @@
在开始之前,我们先进行一些简单设置。
如果只使用收发数据包功能,无须任何准备工作。
如果要控制浏览器,须设置浏览器路径。以下用 Chrome 作为演示。其它 Chromium 内核浏览器设置方法是一样的。
# ✔️ 执行步骤
## 📍 关闭已打开的 Chrome
多个 Chrome 会造成冲突,如果已有打开的 Chrome 浏览器,请关闭。
后面在"创建页面对象"章节再介绍多 Chrome 浏览器共存的方法。
## 📍 尝试启动浏览器
执行以下代码,如果正常启动了浏览器并且访问了百度,则可跳过后面的步骤。
```python
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://www.baidu.com')
```
## 📍 设置路径
如果上面的步骤成功访问了百度,可跳过本条。
如果提示出错,请新建一个临时 py 文件,并输入以下代码,填入您电脑里的 Chrome 浏览器 exe 文件路径,然后执行。
!>**注意:**<br>这段代码只要运行一次即可,不要写到正式程序里。
```python
from DrissionPage.easy_set import set_paths
set_paths(chrome_path=r'这里修改为您的Chrome浏览器exe文件路径', check_version=False)
```
执行这段代码会记录您电脑的 Chrome 浏览器路径到配置文件。现在,请重新执行上一步的代码,如果正确访问了百度,说明已经设置完成。
# ✔️ 说明
当您完成准备工作后,无须关闭浏览器,后面的上手示例可继续使用当前浏览器。

View File

@ -0,0 +1,42 @@
# ✔️ 安装
## 📍 安装
请使用 pip 安装 DrissionPage
```shell
pip install DrissionPage
```
## 📍 升级
```shell
pip install DrissionPage --upgrade
```
# ✔️ 导入
`WebPage`是功能最全面的页面类,既可控制浏览器,也可收发数据包。通常程序从导入它开始。
```python
from DrissionPage import WebPage
```
也可以根据具体需要,导入相应的类:
```python
# ChromiumPage 只控制浏览器,不能收发数据包
from DrissionPage import ChromiumPage
# SessionPage 只用于收发数据包,不能控制浏览器
from DrissionPage import SessionPage
# 浏览启动参数管理器,用于控制浏览器启动参数
from DrissionPage import DriverOptions
# Session对象启动参数管理器用于控制Session对象启动参数
from DrissionPage import SessionOptions
# 动作链类,用于模拟一连串鼠标键盘动作
from DrissionPage import ActionChains
```

View File

@ -1,122 +0,0 @@
# ✔️ 安装
```shell
pip install DrissionPage
```
升级:
```shell
pip install DrissionPage --upgrade
```
# ✔️ 导入
根据实际须要导入相应对象:
```python
from DrissionPage import WebPage # 集成两种模式,推荐使用
from DrissionPage import MixPage # 集成两种模式基于selenium
from DrissionPage import ChromiumPage # 只控制浏览器无须切换s模式
from DrissionPage import SessionPage # 只收发数据包,无须使用浏览器
from DrissionPage import DriverOptions # 浏览启动参数管理器
from DrissionPage import SessionOptions # Session对象启动参数管理器
```
# ✔️ 第一次使用
如果只使用 s 模式是无须初始化的,导入后就可以直接使用。
如果使用 d 模式,`WebPage`须指定浏览器执行文件路径。`MixPage`还须下载与浏览器版本匹配的 driver 文件。这里只介绍`WebPage`需要的设置。
多数情况下,如果系统内安装了 Chrome 浏览器,或在系统路径中指定了 Chrome 执行文件DrissionPage 运行时会自动从系统路径和注册表Windows中寻找路径可直接运行无须设置。
如果程序没有找到路径,或需要手动设置,可使用以下方法:
新建一个**临时文件** ,修改并运行以下代码,作用是手动指定 Chrome 路径,记录到配置文件,以后程序会自动读取其中的配置,无须再写。
```python
from DrissionPage.easy_set import set_paths
# 请将以下路径修改为本机实际路径
set_paths(chrome_path=r"D:\chrome\chrome.exe") # 浏览器执行文件路径
```
!> **注意:**<br>这段代码只用于设置配置文件中的路径信息,**运行一次即可**,勿写到正式程序里 。
除了把配置信息写在配置文件,还能把信息直接写在代码里,后面章节再详细叙述。
# ✔️ 上手示例
现在,我们通过一些例子,来直观感受一下 DrissionPage 的工作方式。
## 📍 用 d 模式登录 gitee 网站
网址https://gitee.com/login
此示例演示使用控制浏览器的方式自动登录 gitee 网站。
!> **注意:**<br>如果您有已打开的 Chrome 浏览器,请先关闭,否则会造成冲突。后面在 [创建页面对象](%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%5C%E4%BD%BF%E5%88%9B%E5%BB%BA%E9%A1%B5%E9%9D%A2%E5%AF%B9%E8%B1%A1.md) 章节再介绍多 Chrome 浏览器共存的方法。
```python
from DrissionPage import WebPage
# 用 d 模式创建页面对象(默认模式)
page = WebPage()
# 跳转到登录页面
page.get('https://gitee.com/login')
# 定位到账号文本框并输入账号
page.ele('#user_login').input('你的账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('你的密码')
# 点击登录按钮
page.ele('@value=登 录').click()
```
## 📍 用 s 模式爬取 gitee 网站开源列表
以下代码可直接运行:
```python
from DrissionPage import WebPge
# 用 s 模式创建页面对象
page = WebPage('s')
for i in range(1, 4):# 爬取3页
# 跳转到第几页
p.get(f'https://gitee.com/explore/all?page={i}')
# 遍历所有库链接并打印
for link in p.eles('.title project-namespace-path'):
print(link.text, link.link)
```
结果:
```
小熊派开源社区/BearPi-HM_Nano https://gitee.com/bearpi/bearpi-hm_nano
明月心/PaddleSegSharp https://gitee.com/raoyutian/PaddleSegSharp
RockChin/QChatGPT https://gitee.com/RockChin/QChatGPT
TopIAM/eiam https://gitee.com/topiam/eiam
以下省略。。。
```
## 📍 `ChromiumPage``SessionPage`
上面两个例子都不用转换模式,可以不需要用`WebPage`,而使用对应模式的页面对象也可以,使用方法是一样的。
```python
from DrissionPage import ChromiumPage
from DrissionPage import SessionPage
d_page = ChromiumPage() # 用于控制浏览器
s_page = SessionPage() # 用于收发数据包
# 以下省略……
```
# ✔️ 说明
无论电脑安装的 Chrome 能否正常使用,都建议使用绿色版 Chrome并且设置`user_data_path`
如果计划程序打包成 exe 文件,就不能使用默认配置文件记录配置,具体方法请查看“使用方法->打包程序”章节。

View File

@ -42,7 +42,8 @@ element = page('some text', timeout=10)
# ✔️ 无需切入切出,逻辑清晰
使用过 selenium 的人都知道selenium 同一时间只能操作一个标签页或`<iframe>`元素,要操作其它标签页,或`<iframe>`元素,须要用`switch_to()`方法切换,操作后还要切换回来。如果是多级`<iframe>`,还要逐级切入,相当麻烦。
使用过 selenium 的人都知道selenium 同一时间只能操作一个标签页或`<iframe>`元素,要操作其它标签页,或`<iframe>`元素,须要用`switch_to()`
方法切换,操作后还要切换回来。如果是多级`<iframe>`,还要逐级切入,相当麻烦。
DrissionPage 则无需这些麻烦的操作,它把每个标签页和`<iframe>`都看作独立的对象,可以同时并发操作,而且可以直接跨多层`<iframe>`获取里面的元素,然后直接处理,非常方便。