mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
编辑文档
This commit is contained in:
parent
93c9793285
commit
5e25e64b70
161
README.md
161
README.md
@ -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)
|
||||
|
||||
|
@ -21,11 +21,11 @@ DrissionPage 是一个基于 python 的网页自动化工具。
|
||||
除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
||||
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
||||
|
||||
# ✨️ 理念
|
||||
# 💡 理念
|
||||
|
||||
简洁!易用 !方便!
|
||||
|
||||
# 💡 特性和亮点
|
||||
# ☀️ 特性
|
||||
|
||||
作者经过长期实践,踩过无数坑,总结出的经验全写到这个库里了。
|
||||
|
||||
|
118
docs/_sidebar.md
118
docs/_sidebar.md
@ -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)
|
||||
|
||||
|
BIN
docs/入门指南/上手示例/gitee_1.jpg
Normal file
BIN
docs/入门指南/上手示例/gitee_1.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 130 KiB |
BIN
docs/入门指南/上手示例/gitee_2.jpg
Normal file
BIN
docs/入门指南/上手示例/gitee_2.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 168 KiB |
89
docs/入门指南/上手示例/控制浏览器.md
Normal file
89
docs/入门指南/上手示例/控制浏览器.md
Normal file
@ -0,0 +1,89 @@
|
||||
现在,我们通过一些例子,来直观感受一下 DrissionPage 的工作方式。
|
||||
|
||||
本示例演示使用`ChromiumPage`控制浏览器登录 gitee 网站。
|
||||
|
||||
# ✔️ 页面分析
|
||||
|
||||
网址:[https://gitee.com/login](https://gitee.com/login)
|
||||
|
||||
打开网址,按`F12`,我们可以看到页面元素如下:
|
||||
|
||||

|
||||
|
||||
用户名输入框`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 网站的操作。
|
90
docs/入门指南/上手示例/收发数据包.md
Normal file
90
docs/入门指南/上手示例/收发数据包.md
Normal file
@ -0,0 +1,90 @@
|
||||
本示例演示用`SessionPage`已收发数据包的方式采集 gitee 网站数据。
|
||||
|
||||
本示例不使用浏览器。
|
||||
|
||||
# ✔️ 页面分析
|
||||
|
||||
网址:[https://gitee.com/explore/all](https://gitee.com/explore/all)
|
||||
|
||||
这个示例的目标,要获取所有库的名称和链接,为避免对网站造成压力,我们只采集 3 页。
|
||||
|
||||
打开网址,按`F12`,我们可以看到页面元素如下:
|
||||
|
||||

|
||||
|
||||
从 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)
|
||||
```
|
1
docs/入门指南/上手示例/模式切换.md
Normal file
1
docs/入门指南/上手示例/模式切换.md
Normal file
@ -0,0 +1 @@
|
||||
# 施工中。。。
|
43
docs/入门指南/准备工作.md
Normal file
43
docs/入门指南/准备工作.md
Normal 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 浏览器路径到配置文件。现在,请重新执行上一步的代码,如果正确访问了百度,说明已经设置完成。
|
||||
|
||||
# ✔️ 说明
|
||||
|
||||
当您完成准备工作后,无须关闭浏览器,后面的上手示例可继续使用当前浏览器。
|
42
docs/入门指南/安装和导入.md
Normal file
42
docs/入门指南/安装和导入.md
Normal 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
|
||||
```
|
@ -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 文件,就不能使用默认配置文件记录配置,具体方法请查看“使用方法->打包程序”章节。
|
@ -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>`获取里面的元素,然后直接处理,非常方便。
|
||||
|
Loading…
x
Reference in New Issue
Block a user