mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
1.7.0
This commit is contained in:
parent
0d98abf5a0
commit
463633d553
119
README.zh-cn.md
119
README.zh-cn.md
@ -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 *
|
||||
|
Loading…
x
Reference in New Issue
Block a user