This commit is contained in:
g1879 2020-12-07 09:31:20 +08:00
parent 0d98abf5a0
commit 463633d553

View File

@ -2,8 +2,6 @@
***
## 项目介绍
DrissionPage即 driver 和 session 组合而成的 page。
是个基于 python 的 Web 自动化操作集成工具。
它实现了 selenium 和 requests 之间的无缝切换。
@ -23,15 +21,11 @@ DrissionPage即 driver 和 session 组合而成的 page。
**交流QQ群** 897838127
## 理念
**理念**
**简洁、易用 、可扩展**
## 背景
**背景**
requests 爬虫面对要登录的网站时要分析数据包、JS 源码构造复杂的请求往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
使用 selenium可以很大程度上绕过这些坑但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
@ -80,7 +74,7 @@ session 模式下的页面元素类,可获取元素属性值,也可在其下
***
## 与 selenium 代码对比
**与 selenium 代码对比**
以下代码实现一模一样的功能,对比两者的代码量:
@ -194,9 +188,7 @@ class_name = element('xpath://div[@id="div_id"]/@class')
text = element('xpath://div[@id="div_id"]/text()[2]')
```
## 与 requests 代码对比
**与 requests 代码对比**
以下代码实现一模一样的功能,对比两者的代码量:
@ -239,9 +231,7 @@ with open(f'{save_path}\\img.png', 'wb') as fd:
page.download(url, save_path, 'img') # 支持重命名,处理文件名冲突
```
## 模式切换
**模式切换**
用 selenium 登录网站,然后切换到 requests 读取网页。两者会共享登录信息。
@ -263,9 +253,7 @@ print('登录后title', page.title, '\n') # 登录后 session 模式的输
登录后title 个人资料 - 码云 Gitee.com
```
## 获取并打印元素属性
**获取并打印元素属性**
```python
# 接上段代码
@ -290,9 +278,7 @@ Git 命令学习 https://oschina.gitee.io/learn-git-branching/
Git 命令学习
```
## 下载文件
**下载文件**
```python
url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'
@ -304,7 +290,9 @@ page.download(url, save_path)
***
## 安装
## 安装及导入
**安装**
```
pip install DrissionPage
@ -314,7 +302,7 @@ pip install DrissionPage
若要使用 driver 模式,须配置 chrome 和 **对应版本** 的 chromedriver。[[chromedriver下载]](http://npm.taobao.org/mirrors/chromedriver)
easy_set 工具中的 get_match_driver() 方法可自动识别 chrome 版本并下载匹配的 driver 。
## 导入模块
**导入模块**
```python
from DrissionPage import MixPage
@ -334,7 +322,7 @@ from DrissionPage import MixPage
- 将两个路径写入系统变量
- 在代码中填写路径
### 使用 get_match_driver() 方法
**使用 get_match_driver() 方法**
若你选择第一种方式,请在第一次使用前,运行以下代码,程序会自动检测电脑安装的 chrome 版本,下载对应 driver并记录到 ini 文件。
@ -370,9 +358,7 @@ get_match_driver(ini_path='ini文件路径', save_path='保存路径', chrome_pa
Tips当指定 chrome_path 时,检测成功后程序会把这个路径写进 ini 文件。
### 使用 set_paths() 方法
**使用 set_paths() 方法**
若上一种方法失败,可自行下载 chromedriver.exe然后运行以下代码把路径记录到 ini 文件中。
@ -418,15 +404,11 @@ Tips
- 推荐使用绿色版 chrome并手动设置路径避免浏览器升级造成与 chromedriver 版本不匹配。
- 调试项目时推荐设置 debugger_address使用手动打开的浏览器再用程序接管好处多多。
### 其它方法
**其它方法**
若你不想使用 ini 文件(如要打包项目时),可在系统路径写入以上两个路径,或在程序中填写。后者的使用方法见下一节。
## 创建驱动器对象 Drission
## Drission 对象
> 创建的步骤不是必须若想快速上手可跳过本节。MixPage 会自动创建该对象。
@ -468,16 +450,14 @@ drission = Drission(driver_options, session_options, proxy=proxy)
DriverOptions 和 SessionOptions 用法详见下文。
## 使用页面对象 MixPage
## MixPage 对象
MixPage 页面对象封装了常用的网页操作,并实现 driver 和 session 模式之间的切换。
MixPage 须控制一个 Drission 对象并使用其中的 driver 或 session如没有传入MixPage 会自己创建一个(使用传入的配置信息或从默认 ini 文件读取)。
Tips: 多对象协同工作时,可将一个 MixPage 中的 Drission 对象传递给另一个,使多个对象共享登录信息或操作同一个页面。
### 创建对象
**创建对象**
创建对象方式有3种简易、传入 Drission 对象、传入配置。可根据实际需要选择。
@ -494,9 +474,7 @@ page = MixPage(drission, mode='s', timeout=5) # session 模式等待时间5
page = MixPage(driver_options=do, session_options=so) # 默认 d 模式
```
### 访问网页
**访问网页**
```python
# 默认方式
@ -509,9 +487,7 @@ page.get(url, retry=5, interval=0.5)
Tips若连接出错程序会自动重试2次可指定重试次数和等待间隔。
### 切换模式
**切换模式**
在 s 和 d 模式之间切换,切换时会自动同步 cookies 和正在访问的 url。
@ -521,9 +497,7 @@ page.change_mode(go=False) # go 为 False 表示不跳转 url
Tips使用某种模式独有的方法时会自动跳转到该模式。
### 页面属性
**页面属性**
```python
page.url # 当前访问的 url
@ -542,9 +516,7 @@ page.current_tab_num # 返回当前标签页序号
page.current_tab_handle # 返回当前标签页 handle
```
### 页面操作
**页面操作**
调用只属于 d 模式的方法,会自动切换到 d 模式。详细用法见 APIs。
@ -583,7 +555,7 @@ page.chrome_downloading() # 获取 chrome 正在下载的文件列表
page.process_alert(mode, text) # 处理提示框
```
### cookies 的使用
**cookies 的使用**
MixPage 支持获取和设置 cookies具体使用方法如下
@ -599,6 +571,8 @@ Tips:
- d 模式设置 cookies 后要刷新页面才能看到效果。
- s 模式可在 ini 文件、SessionOptions、配置字典中设置 cookies在 MixPage 初始化时即可传入d 模式只能用 set_cookies() 函数设置。
## 查找元素
ele() 返回第一个符合条件的元素eles() 返回所有符合条件的元素列表。
@ -766,11 +740,14 @@ shadow_root_element.is_valid() # 返回元素是否还在 dom 内
**Tips:** 以上属性或方法获取到的元素是普通的 DriverElement用法参考上文所述。
## 对接 selenium 及 requests
DrissionPage 代码可与 selenium 及 requests 代码无缝拼接。既可直接使用 selenium 的 WebDriver 对象,也可导出自身的 WebDriver 给 selenium 代码使用。requests 的 Session 对象也可直接传递。使已有项目的迁移非常方便。
DrissionPage 代码可与 selenium 及 requests 代码无缝拼接。既可直接使用 selenium 的 WebDriver 对象,也可导出自身的 WebDriver 给 selenium 代码使用。requests 的
Session 对象也可直接传递。使已有项目的迁移非常方便。
### selenium 转 DrissionPage
**selenium 转 DrissionPage**
```python
driver = webdriver.Chrome()
@ -780,7 +757,7 @@ page = MixPage(Drission(driver)) # 把 driver 传递给 Drission创建 MixPa
print(page.title) # 打印结果:百度一下,你就知道
```
### DrissionPage 转 selenium
**DrissionPage 转 selenium**
```python
page = MixPage()
@ -791,7 +768,7 @@ print(driver.title) # 打印结果:百度一下,你就知道
element = driver.find_element_by_xpath('//div') # 使用 selenium 原生功能
```
### requests 转 DrissionPage
**requests 转 DrissionPage**
``` python
session = requets.Session()
@ -801,7 +778,7 @@ page = MixPage(drission, mode='s')
page.get('https://www.baidu.com')
```
### DrissionPage 转 requests
**DrissionPage 转 requests**
```python
page = MixPage('s')
@ -814,7 +791,7 @@ response = session.get('https://www.baidu.com')
## requests 功能使用
### 连接参数
**连接参数**
除了在创建时传入配置信息及连接参数如有必要s 模式下也可在每次访问网址时设置连接参数。
@ -830,9 +807,7 @@ Tips
- 如果连接参数内没有指定s 模式会根据当前域名自动填写 Host 和 Referer 属性
- 在创建 MixPage 时传入的 Session 配置是全局有效的
### Response 对象
**Response 对象**
requests 获取到的 Response 对象存放在 page.response可直接使用。如
@ -850,7 +825,7 @@ selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下
因此 DrissionPage 封装了 download 方法,整合了两者优点,可从 selenium 获取登录信息,用 requests 进行下载。
弥补了 selenium 的不足,使下载简洁高效。
### 功能
**功能**
- 指定下载路径
- 重命名文件,可不填写扩展名,程序自动补充
@ -859,7 +834,7 @@ selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下
- 支持 post 方式
- 支持自定义连接参数
### 演示
**演示**
```python
url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' # 文件 url
@ -876,7 +851,7 @@ page.download(url, save_path, 'img', 'rename', show_msg=True)
chrome 的配置很繁琐,为简化使用,本库提供了常用配置的设置方法。
### DriverOptions 对象
**DriverOptions 对象**
DriverOptions 对象继承自 selenium.webdriver.chrome.options 的 Options 对象,在其基础上增加了以下方法:
@ -897,9 +872,7 @@ options.set_proxy(proxy) # 设置代理地址
options.set_paths(driver_path, chrome_path, debugger_address, download_path, user_data_path, cache_path) # 设置浏览器相关的路径
```
### 使用方法
**使用方法**
```python
do = DriverOptions() # 读取默认 ini 文件创建 DriverOptions 对象
@ -923,7 +896,7 @@ do.save('default') # 保存当前设置到默认 ini 文件
## Session 设置
### SessionOPtions 对象
**SessionOPtions 对象**
SessionOptions 对象用于管理 Session 的配置信息。它创建时默认读取默认 ini 文件配置信息,也可手动设置所需信息。
@ -933,9 +906,7 @@ headers、cookies、auth、proxies、hooks、params、verify、cert、adapters
**Tips:** cookies 可接收 dict、list、tuple、str、RequestsCookieJar 等格式的信息。
### 使用方法
**使用方法**
```python
so = SessionOptions() # 读取默认 ini 文件创建 SessionOptions 对象
@ -964,7 +935,7 @@ so.save('default') # 保存当前设置到默认 ini 文件
Tips建议把常用配置文件保存到别的路径以防本库升级时配置被重置。
### ini 文件内容
**ini 文件内容**
ini 文件默认拥有三部分配置paths、chrome_options、session_options初始内容如下。
@ -1019,9 +990,7 @@ headers = {
}
```
### OptionsManager 对象
**OptionsManager 对象**
OptionsManager 对象用于读取、设置和保存配置。
@ -1037,9 +1006,7 @@ manager.save('D:\\settings.ini') # 保存到指定路径 ini 文件
manager.save('default') # 保存当前设置到默认 ini 文件
```
### 使用示例
**使用示例**
```python
from DrissionPage.configs import *