mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
2.4.0
This commit is contained in:
parent
df5fb27dee
commit
d975e5c812
52
README.md
52
README.md
@ -1,6 +1,6 @@
|
||||
# 简洁!易用 !方便!
|
||||
# ✨️简洁!易用 !方便!✨️
|
||||
|
||||
# 简介
|
||||
# ⭐️ 简介
|
||||
|
||||
DrissionPage,即 driver 和 session 组合而成的 page。
|
||||
是个基于 python 的 Web 自动化操作集成工具。
|
||||
@ -10,22 +10,24 @@ DrissionPage,即 driver 和 session 组合而成的 page。
|
||||
可兼顾 selenium 的便利性和 requests 的高效率,
|
||||
更棒的是,它的使用方式非常简洁和人性化,代码量少,对新手友好。
|
||||
|
||||
点击打开:[使用文档](http://g1879.gitee.io/drissionpage)
|
||||
点击打开:📒[使用文档](http://g1879.gitee.io/drissionpage)
|
||||
|
||||
**交流QQ群:** 897838127 **联系邮箱:** g1879@qq.com
|
||||
**交流QQ群:** 897838127
|
||||
|
||||
## 背景
|
||||
**联系邮箱:** g1879@qq.com
|
||||
|
||||
## 📔 背景
|
||||
|
||||
requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
||||
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
||||
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
||||
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
||||
|
||||
# 特性和亮点
|
||||
# 💡 特性和亮点
|
||||
|
||||
作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了N多实用功能,对常用功能作了整合和优化。
|
||||
作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
|
||||
|
||||
## 特性
|
||||
## 🔮 特性
|
||||
|
||||
- 代码高度集成,以简洁的代码为第一追求。
|
||||
- 页面对象可在 selenium 和 requests 模式间任意切换,保留登录状态。
|
||||
@ -33,16 +35,16 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,
|
||||
- 两种模式提供一致的 API,使用体验一致。
|
||||
- 人性化设计,集成众多实用功能,大大降低开发工作量。
|
||||
|
||||
## 亮点功能
|
||||
## 🎇 亮点功能
|
||||
|
||||
- 每次运行程序可以反复使用已经打开的浏览器。如手动设置网页到某个状态,再用程序接管,或手动处理登录,再用程序爬内容。无须每次运行从头启动浏览器,超级方便。
|
||||
- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置api,远离繁杂的配置项。
|
||||
- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置 API,远离繁杂的配置项。
|
||||
- 极致简明的定位语法,支持直接按文本定位元素,支持直接获取前后兄弟元素和父元素等。
|
||||
- 强大的下载工具,操作浏览器时也能享受快捷可靠的下载功能。
|
||||
- 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等。
|
||||
- 访问网址带自动重试功能,可设置间隔和超时时间。
|
||||
- 访问网页能自动识别编码,无须手动设置。
|
||||
- 链接参数默认自动生成 Host 和 Referer 属性。
|
||||
- 链接参数默认自动生成`Host`和`Referer`属性。
|
||||
- 可随时直接隐藏或显示浏览器进程窗口,非 headless 或最小化。
|
||||
- 可自动下载合适版本的 chromedriver,免去麻烦的配置。
|
||||
- d 模式查找元素内置等待,可任意设置全局等待时间或单次查找等待时间。
|
||||
@ -50,23 +52,23 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,
|
||||
- 点击支持失败重试,可用于保证点击成功、判读网页遮罩层是否消失等。
|
||||
- 输入文本能自动判断是否成功并重试,避免某些情况下输入或清空失效的情况。
|
||||
- d 模式下支持全功能的 xpath,可直接获取元素的某个属性,selenium 原生无此功能。
|
||||
- 支持直接获取 shadow-root,和普通元素一样操作其下的元素。
|
||||
- 支持直接获取 after 和 before 伪元素的内容。
|
||||
- 支持直接获取`shadow-root`,和普通元素一样操作其下的元素。
|
||||
- 支持直接获取`after`和`before`伪元素的内容。
|
||||
- 可以在元素下直接使用 > 以 css selector 方式获取当前元素直接子元素。原生不支持这种写法。
|
||||
- 可简单地使用 lxml 来解析 d 模式的页面或元素,爬取复杂页面数据时速度大幅提高。
|
||||
- 输出的数据均已转码及处理基本排版,减少重复劳动。
|
||||
- 可方便地与 selenium 或 requests 原生代码对接,便于项目迁移。
|
||||
- 使用 POM 模式封装,可直接用于测试,便于扩展。
|
||||
- d 模式配置可同时兼容 debugger 和其它参数,原生不能兼容。
|
||||
- d 模式配置可同时兼容`debugger_address`和其它参数,原生不能兼容。
|
||||
- 还有很多这里不一一列举…………
|
||||
|
||||
# 简单演示
|
||||
# 🪄 简单演示
|
||||
|
||||
**与 selenium 代码对比**
|
||||
|
||||
以下代码实现一模一样的功能,对比两者的代码量:
|
||||
|
||||
- 用显性等待方式定位第一个文本包含 some text 的元素
|
||||
- 用显性等待方式定位第一个文本包含`some text`的元素
|
||||
|
||||
```python
|
||||
# 使用 selenium:
|
||||
@ -115,7 +117,7 @@ ele1.drag_to(ele2)
|
||||
driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);")
|
||||
|
||||
# 使用 DrissionPage:
|
||||
page.scroll_to('bottom')
|
||||
page.scroll.to_bottom()
|
||||
```
|
||||
|
||||
- 设置 headless 模式
|
||||
@ -141,7 +143,7 @@ text = element.pseudo_after
|
||||
|
||||
- shadow-root 操作
|
||||
|
||||
selenium 新增了 ShadowRoot,但功能实在是太少。
|
||||
selenium 新增了`ShadowRoot`,但功能实在是太少。
|
||||
```python
|
||||
# 使用 selenium:
|
||||
shadow_element = webdriver.execute_script('return arguments[0].shadowRoot', element)
|
||||
@ -168,14 +170,14 @@ text = element('xpath://div[@id="div_id"]/text()[2]')
|
||||
- 随时让浏览器窗口消失和显示
|
||||
|
||||
```python
|
||||
# selenium无此功能
|
||||
# selenium 无此功能
|
||||
|
||||
# 使用 DrissionPage
|
||||
page.hide_browser() # 让浏览器窗口消失
|
||||
page.show_browser() # 重新显示浏览器窗口
|
||||
```
|
||||
|
||||
注:本功能只支持 Windows,且须设置了 debugger_address 参数时才能生效
|
||||
注:本功能只支持 Windows,且须设置了`local_port`或`debugger_address`参数时才能生效。
|
||||
|
||||
**与 requests 代码对比**
|
||||
|
||||
@ -200,7 +202,7 @@ page.get(url)
|
||||
title = page('tag:h1').text
|
||||
```
|
||||
|
||||
Tips: DrissionPage 自带默认 headers
|
||||
Tips: DrissionPage 自带默认`headers`
|
||||
|
||||
- 下载文件
|
||||
|
||||
@ -265,18 +267,18 @@ Git 命令学习 https://oschina.gitee.io/learn-git-branching/
|
||||
Git 命令学习
|
||||
```
|
||||
|
||||
# 使用方法
|
||||
# 🔠 使用方法
|
||||
|
||||
[点击跳转到使用文档](http://g1879.gitee.io/drissionpage)
|
||||
|
||||
# 版本历史
|
||||
# 🎯️ 版本历史
|
||||
|
||||
[点击查看版本历史](http://g1879.gitee.io/drissionpage/#/%E7%89%88%E6%9C%AC%E5%8E%86%E5%8F%B2)
|
||||
|
||||
# 免责声明
|
||||
# 🖐🏻 免责声明
|
||||
请勿将 DrissionPage 应用到任何可能会违反法律规定和道德约束的工作中,请友善使用 DrissionPage,遵守蜘蛛协议,不要将 DrissionPage 用于任何非法用途。如您选择使用 DrissionPage 即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
|
||||
|
||||
# 请我喝咖啡
|
||||
# ☕ 请我喝咖啡
|
||||
|
||||
如果本项目对您有所帮助,不妨请作者我喝杯咖啡 :)
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
# 简洁!易用 !方便!
|
||||
|
||||
# 简介
|
||||
# ✨️简洁!易用 !方便!✨️
|
||||
|
||||
DrissionPage,即 driver 和 session 组合而成的 page。
|
||||
是个基于 python 的 Web 自动化操作集成工具。
|
||||
@ -10,20 +8,24 @@ DrissionPage,即 driver 和 session 组合而成的 page。
|
||||
可兼顾 selenium 的便利性和 requests 的高效率,
|
||||
更棒的是,它的使用方式非常简洁和人性化,代码量少,对新手友好。
|
||||
|
||||
**交流QQ群:** 897838127 **联系邮箱:** g1879@qq.com
|
||||
点击打开:📒[使用文档](http://g1879.gitee.io/drissionpage)
|
||||
|
||||
## 背景
|
||||
**交流QQ群:** 897838127
|
||||
|
||||
**联系邮箱:** g1879@qq.com
|
||||
|
||||
## 📕 背景
|
||||
|
||||
requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
||||
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
||||
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
||||
一切从简,尽量提供简单直接的使用方法,对新手更友好。
|
||||
|
||||
# 特性和亮点
|
||||
# 🍀 特性和亮点
|
||||
|
||||
作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里了。内置了 N 多实用功能,对常用功能作了整合和优化。
|
||||
|
||||
## 特性
|
||||
## 🎉 特性
|
||||
|
||||
- 代码高度集成,以简洁的代码为第一追求。
|
||||
- 页面对象可在 selenium 和 requests 模式间任意切换,保留登录状态。
|
||||
@ -31,16 +33,16 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,
|
||||
- 两种模式提供一致的 API,使用体验一致。
|
||||
- 人性化设计,集成众多实用功能,大大降低开发工作量。
|
||||
|
||||
## 亮点功能
|
||||
## 💡 亮点功能
|
||||
|
||||
- 每次运行程序可以反复使用已经打开的浏览器。如手动设置网页到某个状态,再用程序接管,或手动处理登录,再用程序爬内容。无须每次运行从头启动浏览器,超级方便。
|
||||
- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置 api,远离繁杂的配置项。
|
||||
- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置 API,远离繁杂的配置项。
|
||||
- 极致简明的定位语法,支持直接按文本定位元素,支持直接获取前后兄弟元素和父元素等。
|
||||
- 强大的下载工具,操作浏览器时也能享受快捷可靠的下载功能。
|
||||
- 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等。
|
||||
- 访问网址带自动重试功能,可设置间隔和超时时间。
|
||||
- 访问网页能自动识别编码,无须手动设置。
|
||||
- 链接参数默认自动生成 Host 和 Referer 属性。
|
||||
- 链接参数默认自动生成`Host`和`Referer`属性。
|
||||
- 可随时直接隐藏或显示浏览器进程窗口,非 headless 或最小化。
|
||||
- 可自动下载合适版本的 chromedriver,免去麻烦的配置。
|
||||
- d 模式查找元素内置等待,可任意设置全局等待时间或单次查找等待时间。
|
||||
@ -48,22 +50,22 @@ requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,
|
||||
- 点击支持失败重试,可用于保证点击成功、判读网页遮罩层是否消失等。
|
||||
- 输入文本能自动判断是否成功并重试,避免某些情况下输入或清空失效的情况。
|
||||
- d 模式下支持全功能的 xpath,可直接获取元素的某个属性,selenium 原生无此功能。
|
||||
- 支持直接获取 shadow-root,和普通元素一样操作其下的元素。
|
||||
- 支持直接获取 after 和 before 伪元素的内容。
|
||||
- 支持直接获取`shadow-root`,和普通元素一样操作其下的元素。
|
||||
- 支持直接获取`after`和`before`伪元素的内容。
|
||||
- 可以在元素下直接使用 > 以 css selector 方式获取当前元素直接子元素。原生不支持这种写法。
|
||||
- 可简单地使用 lxml 来解析 d 模式的页面或元素,爬取复杂页面数据时速度大幅提高。
|
||||
- 输出的数据均已转码及处理基本排版,减少重复劳动。
|
||||
- 可方便地与 selenium 或 requests 原生代码对接,便于项目迁移。
|
||||
- 使用 POM 模式封装,可直接用于测试,便于扩展。
|
||||
- d 模式配置可同时兼容 debugger 和其它参数,原生不能兼容。
|
||||
- d 模式配置可同时兼容`debugger_address`和其它参数,原生不能兼容。
|
||||
- 还有很多这里不一一列举…………
|
||||
|
||||
# 免责声明
|
||||
# 🖐🏻 免责声明
|
||||
|
||||
请勿将 DrissionPage 应用到任何可能会违反法律规定和道德约束的工作中,请友善使用 DrissionPage,遵守蜘蛛协议,不要将 DrissionPage 用于任何非法用途。如您选择使用 DrissionPage
|
||||
即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
|
||||
|
||||
# 请我喝咖啡
|
||||
# ☕ 请我喝咖啡
|
||||
|
||||
如果本项目对您有所帮助,不妨请作者我喝杯咖啡 :)
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
* [⭐️ 简介](简介.md)
|
||||
* [⭐️ 简介](README.md)
|
||||
|
||||
* 🧭入门指南
|
||||
* [💡 基本概念](入门指南\基本概念.md)
|
||||
* [🪄 基本概念](入门指南\基本概念.md)
|
||||
* [🖐🏻 快速上手](入门指南\快速上手.md)
|
||||
* 🎭 特性演示
|
||||
* [🐙 与 requests 对比](入门指南\特性演示\与requests代码对比.md)
|
||||
@ -31,6 +31,9 @@
|
||||
* [🦒 DriverPage 和 SessionPage](使用方法\DriverPage和SessionPage.md)
|
||||
* [🐭 打包程序](使用方法\打包程序.md)
|
||||
|
||||
* 💖 实用示例
|
||||
* [🧡 同时操作多个浏览器](实用示例\同时操作多个浏览器.md)
|
||||
|
||||
* [✨️ Tips大集合](Tips大集合.md)
|
||||
* [🎯️ 版本历史](版本历史.md)
|
||||
* [💐 鸣谢](鸣谢.md)
|
||||
|
@ -8,12 +8,15 @@
|
||||
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible"/>
|
||||
<meta content="Description" name="description">
|
||||
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0" name="viewport">
|
||||
<link href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/dark.css" rel="stylesheet">
|
||||
<link href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css" rel="stylesheet">
|
||||
<!--
|
||||
<link href="//unpkg.com/gitalk/dist/gitalk.css" rel="stylesheet">
|
||||
<!-- <link rel="stylesheet" href="./ignore/font.css"> -->
|
||||
<link rel="stylesheet" href="./ignore/font.css">
|
||||
-->
|
||||
<style>
|
||||
/* body {font-family: PingFang; } */
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
@ -8,35 +8,35 @@
|
||||
|
||||
## mode
|
||||
|
||||
此属性返回当前页面对象的模式,'s' 或 'd'。
|
||||
此属性返回当前页面对象的模式,`'s'`或`'d'`。
|
||||
|
||||
## drission
|
||||
|
||||
此属性返回当前页面对象使用的 Drission 对象。
|
||||
此属性返回当前页面对象使用的`Drission`对象。
|
||||
|
||||
## driver
|
||||
|
||||
此属性返回当前页面对象使用的 WebDriver 对象。访问时会自动切换到 d 模式。
|
||||
此属性返回当前页面对象使用的`WebDriver`对象。访问时会自动切换到 d 模式。
|
||||
|
||||
## session
|
||||
|
||||
此属性返回当前页面对象使用的 Session 对象。访问时不会切换模式。
|
||||
此属性返回当前页面对象使用的`Session`对象。访问时不会切换模式。
|
||||
|
||||
## cookies
|
||||
|
||||
此属性以 dict 方式返回当前页面所使用的 cookies。
|
||||
d 模式只返回当前标签页的 cookies,s 模式则只返回当前访问的 url 的cookies。
|
||||
此属性以`dict`方式返回当前页面所使用的 cookies。
|
||||
d 模式只返回当前标签页的 cookies,s 模式则只返回当前访问的 url 的 cookies。
|
||||
|
||||
## get_cookies()
|
||||
|
||||
此方法获取 cookies 并以 cookie 组成的 list 形式返回。
|
||||
此方法获取 cookies 并以 cookie 组成的`list`形式返回。
|
||||
|
||||
参数:
|
||||
|
||||
- as_dict:是否以字典方式返回,为 False 返回 cookie 组成的 list
|
||||
- as_dict:是否以字典方式返回,为`False`返回 cookie 组成的`list`
|
||||
- all_domains:是否返回所有域的 cookies,只有 s 模式下生效
|
||||
|
||||
返回:cookies信息
|
||||
返回:cookies 信息
|
||||
|
||||
```python
|
||||
from DrissionPage import MixPage
|
||||
@ -64,7 +64,7 @@ for i in p.get_cookies(as_dict=False, all_domains=True):
|
||||
|
||||
## title
|
||||
|
||||
此属性返回当前页面 title 文本。
|
||||
此属性返回当前页面`title`文本。
|
||||
|
||||
## timeout
|
||||
|
||||
@ -101,8 +101,8 @@ page.retry_interval = 1.5
|
||||
## url_available
|
||||
|
||||
此属性以布尔值返回当前链接是否可用。
|
||||
s 模式下根据 Response 对象的 status_code 判断。
|
||||
d 模式根据 check_page() 方法返回值判断。
|
||||
s 模式下根据 Response 对象的`status_code`判断。
|
||||
d 模式根据`check_page()`方法返回值判断。
|
||||
|
||||
# s 模式独有属性
|
||||
|
||||
@ -127,9 +127,9 @@ print(r.status_code)
|
||||
## timeouts
|
||||
|
||||
此属性以字典方式返回三种超时时间,selenium 4 以上版本可用。
|
||||
'implicit' 用于元素查找、点击重试、输入文本重试、处理弹出框重试等;
|
||||
'pageLoad' 用于等待页面加载;
|
||||
'script' 用于等待脚本执行。
|
||||
`'implicit'`用于元素查找、点击重试、输入文本重试、处理弹出框重试等;
|
||||
`'pageLoad'`用于等待页面加载;
|
||||
`'script'`用于等待脚本执行。
|
||||
|
||||
```python
|
||||
print(page.timeouts)
|
||||
@ -160,7 +160,7 @@ print(page.timeouts)
|
||||
|
||||
## active_ele
|
||||
|
||||
此属性返回当前页面上焦点所在元素。类型为 DriverElement。
|
||||
此属性返回当前页面上焦点所在元素。类型为`DriverElement`。
|
||||
|
||||
## wait_obj
|
||||
|
||||
|
@ -1,23 +1,23 @@
|
||||
操作页面前通常要先跳转到目标 url(接管现有浏览器除外),本库访问网页主要支持 get() 和 post() 两种方式,还支持自动重试。
|
||||
操作页面前通常要先跳转到目标 url(接管现有浏览器除外),本库访问网页主要支持`get()`和`post()`两种方式,还支持自动重试。
|
||||
|
||||
# get()
|
||||
|
||||
该方法在 d 模式和 s 模式下都可用,用于跳转到一个网址。
|
||||
当连接失败时,程序默认重试 3 次,每次间隔 2 秒,也可以通过参数设置重试次数和间隔。
|
||||
如果目标 url 和当前 url 一致,程序默认不跳转,可通过参数强制跳转。
|
||||
在 s 模式下,可传入连接参数,语法与 requests 的 get() 方法一致。
|
||||
方法返回是否连接成功的布尔值,s 模式下根据 Response 对象的 status_code 参数决定,d 模式下根据浏览器的状态,还可以通过重写 check_page() 方法实现自定义检查方式。
|
||||
在 s 模式下,可传入连接参数,语法与 requests 的`get()`方法一致。
|
||||
方法返回是否连接成功的布尔值,s 模式下根据 Response 对象的`status_code`参数决定,d 模式下根据浏览器的状态,还可以通过重写`check_page()`方法实现自定义检查方式。
|
||||
|
||||
参数:
|
||||
|
||||
- url:目标 url
|
||||
- go_anyway:若目标 url 与当前 url 一致,是否强制跳转
|
||||
- show_errmsg:是否显示和抛出异常,默认不抛出,连接错误会返回 None
|
||||
- show_errmsg:是否显示和抛出异常,默认不抛出,连接错误会返回`None`
|
||||
- retry:重试次数,与页面对象的设置一致,默认 3 次
|
||||
- interval:重试间隔(秒),与页面对象的设置一致,默认 2 秒
|
||||
- **kwargs:连接参数,s 模式专用,与 requests 的使用方法一致
|
||||
|
||||
返回:是否连接成功
|
||||
返回:`bool`类型,表示是否连接成功
|
||||
|
||||
## d 模式
|
||||
|
||||
@ -30,14 +30,14 @@ page.get('https://www.baidu.com')
|
||||
|
||||
## s 模式
|
||||
|
||||
s 模式的 **kwargs 参数与 requests 中该参数使用方法一致,但有一个特点,如果该参数中设置了某一项(如 headers),该项中的每个项会覆盖从配置中读取的同名项,而不会整个覆盖。
|
||||
就是说,如果想继续使用配置中的 headers 信息,而只想修改其中一项,只需要传入该项的值即可。这样可以简化代码逻辑。
|
||||
s 模式的`**kwargs`参数与 requests 中该参数使用方法一致,但有一个特点,如果该参数中设置了某一项(如`headers`),该项中的每个项会覆盖从配置中读取的同名项,而不会整个覆盖。
|
||||
就是说,如果想继续使用配置中的`headers`信息,而只想修改其中一项,只需要传入该项的值即可。这样可以简化代码逻辑。
|
||||
|
||||
实用功能:
|
||||
|
||||
- 程序会根据要访问的网址自动在 headers 中加入 Host 和 Referer 项。
|
||||
- 程序会根据要访问的网址自动在`headers`中加入`Host`和`Referer`项。
|
||||
- 程序会自动从返回内容中确定编码,一般情况无须手动设置。
|
||||
- s 模式下页面对象的 timeout 属性是指连接超时时间,不是查找元素超时时间。
|
||||
- s 模式下页面对象的`timeout`属性是指连接超时时间,不是查找元素超时时间。
|
||||
|
||||
```python
|
||||
from DrissionPage import MixPage
|
||||
|
@ -60,7 +60,7 @@ rows = ele.eles('tag:tr')
|
||||
|
||||
## MixPage
|
||||
|
||||
顾名思义,MixPage 对象是整合了两种模式的页面对象,所有页面的跳转、读取、操作、标签页控制都由该对象进行。
|
||||
顾名思义,`MixPage`对象是整合了两种模式的页面对象,所有页面的跳转、读取、操作、标签页控制都由该对象进行。
|
||||
|
||||
```python
|
||||
# 创建页面对象
|
||||
@ -77,7 +77,7 @@ page.ele('@value=百度一下').click()
|
||||
|
||||
## DriverElement
|
||||
|
||||
DriverElemnet 对象是 d 模式所产生的页面元素对象,用于可对其进行点击、文本输入、拖拽、运行 js 脚本等操作,也可以基于这个元素查找其下级或周围的元素。
|
||||
`DriverElemnet`对象是 d 模式所产生的页面元素对象,用于可对其进行点击、文本输入、拖拽、运行 js 脚本等操作,也可以基于这个元素查找其下级或周围的元素。
|
||||
|
||||
```python
|
||||
# 点击一个元素
|
||||
@ -96,8 +96,8 @@ links = ele1.eles('tag:a')
|
||||
|
||||
## SessionElement
|
||||
|
||||
SessionElement 对象是 s 模式所产生的页面元素对象,可以读取元素信息,或基于它进行下级元素查找、相对定位其它元素,但不能执行点击等操作。
|
||||
这种对象解析效率很高,当 d 模式页面太复杂时,可把 d 模式的元素转换为 SessionElement 进行解析,提高速度。转换的同时可以执行下级元素的查找。
|
||||
`SessionElement`对象是 s 模式所产生的页面元素对象,可以读取元素信息,或基于它进行下级元素查找、相对定位其它元素,但不能执行点击等操作。
|
||||
这种对象解析效率很高,当 d 模式页面太复杂时,可把 d 模式的元素转换为`SessionElement`进行解析,提高速度。转换的同时可以执行下级元素的查找。
|
||||
|
||||
```python
|
||||
# 获取元素 tag 属性
|
||||
@ -111,7 +111,7 @@ ele2 = d_ele.s_ele('@name=name1')
|
||||
|
||||
## Drission
|
||||
|
||||
Drission 对象用于管理与网页通讯的 WebDriver 对象和 Session 对象,相当于驱动器的角色。能实现这两个对象间的登录状态传递等。但它提供的功能往往通过 MixPage 调用,所以出场几率并不高。
|
||||
`Drission`对象用于管理与网页通讯的`WebDriver`对象和`Session`对象,相当于驱动器的角色。能实现这两个对象间的登录状态传递等。但它提供的功能往往通过`MixPage`调用,所以出场几率并不高。
|
||||
|
||||
```python
|
||||
from DrissionPage import Drission
|
||||
@ -122,7 +122,7 @@ d = Drission()
|
||||
page = MixPage(drission=d)
|
||||
```
|
||||
|
||||
实际上,如果创建时不传入 Drission 对象,MixPage 会自动根据配置信息创建一个。
|
||||
实际上,如果创建时不传入`Drission`对象,`MixPage`会自动根据配置信息创建一个。
|
||||
|
||||
```python
|
||||
from DrissionPage import MixPage
|
||||
@ -133,15 +133,15 @@ page = MixPage()
|
||||
|
||||
# 结构图
|
||||
|
||||
如图所示,Drission 对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。
|
||||
MixPage 对象负责对获取到的页面进行解析、操作。
|
||||
DriverElement 和 SessionElement 则是从页面对象中获取到的元素对象。负责对元素进行解析和操作。
|
||||
如图所示,`Drission`对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。
|
||||
`MixPage`对象负责对获取到的页面进行解析、操作。
|
||||
`DriverElement`和`SessionElement`则是从页面对象中获取到的元素对象。负责对元素进行解析和操作。
|
||||
|
||||

|
||||
|
||||
# 配置管理
|
||||
|
||||
无论 requests 还是 selenium,都通常须要一些配置信息才能正常工作,如长长的 user_agent、driver 路径、浏览器配置等。这些代码往往是繁琐而重复的,不利于代码的简洁。
|
||||
无论 requests 还是 selenium,都通常须要一些配置信息才能正常工作,如长长的`user_agent`、driver 路径、浏览器配置等。这些代码往往是繁琐而重复的,不利于代码的简洁。
|
||||
因此,DrissionPage 使用配置文件记录常用配置信息,程序会自动读取默认配置文件里的内容。所以,在示例中,通常看不见配置信息的代码。
|
||||
|
||||
这个功能支持用户保存不同的配置文件,按情况调研,也可以支持直接把配置写在代码里面,屏蔽读取配置文件。
|
||||
|
@ -4,6 +4,12 @@
|
||||
pip install DrissionPage
|
||||
```
|
||||
|
||||
升级:
|
||||
|
||||
```python
|
||||
pip install DrissionPage --upgrade
|
||||
```
|
||||
|
||||
# 导入
|
||||
|
||||
```python
|
||||
|
65
docs/实用示例/下载星巴克产品图片.md
Normal file
65
docs/实用示例/下载星巴克产品图片.md
Normal file
@ -0,0 +1,65 @@
|
||||
这个示例用于演示`download()`方法的功能。
|
||||
|
||||
# 页面分析
|
||||
|
||||
目标网址:https://www.starbucks.com.cn/menu/
|
||||
|
||||
采集目标:下载所有产品图片,并以产品名称命名。
|
||||
|
||||
如图所示:
|
||||
|
||||

|
||||
|
||||
按 F12 查看页面代码,可以发现每个产品图片都是一个`div`元素,`class`属性都为`preview circle`。且图片网址藏在其`style`属性中。而产品名称则在这个`div`元素后面一个元素中。
|
||||
|
||||
如图所示:
|
||||
|
||||

|
||||
|
||||
# 编码思路
|
||||
|
||||
按照页面规律,我们可以获取所有`class`属性为`preview circle`的元素,然后遍历它们,逐个获取图片路径,以及在后面一个元素中获取产品名称。再将其下载。
|
||||
|
||||
# 示例代码
|
||||
|
||||
```python
|
||||
from DrissionPage import MixPage
|
||||
from re import search
|
||||
|
||||
# 以s模式创建页面对象
|
||||
page = MixPage('s')
|
||||
# 访问目标网页
|
||||
page.get('https://www.starbucks.com.cn/menu/')
|
||||
|
||||
# 获取所有class属性为preview circle的元素
|
||||
divs = page.eles('.preview circle')
|
||||
# 遍历这些元素
|
||||
for div in divs:
|
||||
# 用相对定位获取当前div元素后一个兄弟元素,并获取其文本
|
||||
name = div.next().text
|
||||
|
||||
# 在div元素的style属性中提取图片网址并进行拼接
|
||||
img_url = div.attr('style')
|
||||
img_url = search(r'"(.*)"', img_url).group(1)
|
||||
img_url = f'https://www.starbucks.com.cn{img_url}'
|
||||
|
||||
# 执行下载
|
||||
page.download(img_url, r'.\imgs', rename=name)
|
||||
```
|
||||
|
||||
?> **Tips:** 程序中无须创建`imgs`文件夹,`download()`方法会自动创建。
|
||||
|
||||
# 结果
|
||||
|
||||

|
||||
|
||||
程序执行的时候,默认会把下载进度打印出来。
|
||||
|
||||

|
||||
|
||||
我们注意到有些产品名称是带有`/`的,这是系统路径的非法字符。一般下载方法须程序员自行处理。
|
||||
但 DrissionPage 的`download()`方法自带去除非法字符功能,保证文件能成功保存。
|
||||
除此以外,遇到保存路径有重名文件时,该方法也能自动对新文件进行重命名(添加序号),避免路径冲突。
|
||||
该方法会返回已下载文件的绝对路径,方便程序进一步使用。
|
||||
|
||||
?> **Tips:** 遇到重名时,`download()`方法可选择`skip`、`overwrite`、`rename`三种方式处理。
|
27
docs/实用示例/同时操作多个浏览器.md
Normal file
27
docs/实用示例/同时操作多个浏览器.md
Normal file
@ -0,0 +1,27 @@
|
||||
在 selenium 中,一个`WebDriver`对象操作一个浏览器进程。
|
||||
对应地,DrissionPage 中一个`Drission`对象控制一个浏览器进程。
|
||||
当须要控制多个浏览器时,只需创建多个`Drission`对象即可。
|
||||
|
||||
实际上,因为`MixPage`会自动根据传入配置创建`Drission`对象,因此只需设置不同的`DriverOptions`和`MixPage`对象即可。
|
||||
|
||||
!> **注意:** 这些对象必须设置不同的`local_port`和`user_data_path`参数,否则会造成冲突。
|
||||
|
||||
```python
|
||||
from DrissionPage.config import DriverOptions
|
||||
from DrissionPage import MixPage
|
||||
|
||||
# 创建两个配置对象指向不同端口和数据文件夹
|
||||
do1 = DriverOptions().set_paths(local_port=9222,
|
||||
user_data_path=r'D:\data1')
|
||||
do2 = DriverOptions().set_paths(local_port=9333,
|
||||
user_data_path=r'D:\data2')
|
||||
|
||||
# 通过两个配置对象创建两个页面对象
|
||||
page1 = MixPage(driver_options=do1)
|
||||
page2 = MixPage(driver_options=do2)
|
||||
|
||||
# 两个页面对象分别操作自己的浏览器
|
||||
page1.get('https://www.baidu.com')
|
||||
page2.get('http://www.163.com')
|
||||
```
|
||||
|
@ -1,3 +1,9 @@
|
||||
# v2.4.0
|
||||
|
||||
- wait_ele()、to_frame()、scroll_to()改用类的方式,避免使用字符串方式选择功能
|
||||
- scroll_to()方法改为scroll属性
|
||||
- 滚动页面或元素增加to_location()方式
|
||||
|
||||
# v2.3.0
|
||||
|
||||
- DriverPage 添加 forward() 方法
|
||||
|
64
docs/简介.md
64
docs/简介.md
@ -1,64 +0,0 @@
|
||||
DrissionPage,即 driver 和 session 组合而成的 page。
|
||||
是个基于 python 的 Web 自动化操作集成工具。
|
||||
它用 POM 模式封装了页面和元素常用的方法,
|
||||
自带一套简洁直观优雅的元素定位语法,
|
||||
实现了 selenium 和 requests 之间的无缝切换,
|
||||
可兼顾 selenium 的便利性和 requests 的高效率,
|
||||
更棒的是,它的使用方式非常简洁和人性化,代码量少,对新手友好。
|
||||
|
||||
**项目地址:**
|
||||
|
||||
- https://github.com/g1879/DrissionPage
|
||||
- https://gitee.com/g1879/DrissionPage
|
||||
|
||||
**联系邮箱:** g1879@qq.com **QQ交流群:** 897838127
|
||||
|
||||
# 背景
|
||||
|
||||
requests 爬虫面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。
|
||||
使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
|
||||
除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。
|
||||
|
||||
# 特性
|
||||
|
||||
- 代码高度集成,以简洁的代码为第一追求。
|
||||
- 页面对象可在 selenium 和 requests 模式间任意切换,保留登录状态。
|
||||
- 极简单但强大的元素定位语法,支持链式操作,代码极其简洁。
|
||||
- 两种模式提供一致的 API,使用体验一致。
|
||||
- 使用 POM 模式封装,便于扩展。
|
||||
- 兼容 selenium 代码,便于项目迁移。
|
||||
- 人性化设计,集成众多实用功能,大大降低开发工作量。
|
||||
|
||||
# 亮点功能
|
||||
|
||||
作者有多年自动化和爬虫经验,踩过无数坑,总结出的经验全写到这个库里。内置了N多实用功能,对常用功能作了整合和优化。使用时可以更专注业务逻辑,减少重复操作。大概罗列一下:
|
||||
|
||||
- 每次运行程序可以反复使用已经打开的浏览器。如手动设置网页到某个状态,再用程序接管,或手动处理登录,再用程序爬内容。无须每次运行从头启动浏览器,超级方便。
|
||||
- 使用 ini 文件保存常用配置,自动调用,也提供便捷的设置api,远离繁杂的配置项。
|
||||
- 极致简明的定位语法,支持直接按文本定位元素,支持极其灵活的相对定位方法。
|
||||
- 强大的下载工具,操作浏览器时也能享受快捷可靠的下载功能。
|
||||
- 下载工具支持多种方式处理文件名冲突、自动创建目标路径、断链重试等。
|
||||
- 访问网址带自动重试功能,可设置间隔和超时时间。
|
||||
- 访问网页能自动识别编码,无须手动设置。
|
||||
- 链接参数默认自动生成 Host 和 Referer 属性。
|
||||
- 可随时直接隐藏或显示浏览器进程窗口,非 headless 或最小化。
|
||||
- 可自动下载合适版本的 chromedriver,免去麻烦的配置。
|
||||
- d 模式查找元素内置等待,可任意设置全局等待时间或单次查找等待时间。
|
||||
- 点击元素集成 js 点击方式,一个参数即可切换点击方式。
|
||||
- 点击支持失败重试,可用于保证点击成功、判读网页遮罩层是否消失等。
|
||||
- 输入文本能自动判断是否成功并重试,避免某些情况下输入或清空失效的情况。
|
||||
- d 模式下支持全功能的 xpath,可直接获取元素的某个属性,selenium 原生无此功能。
|
||||
- 支持直接获取 shadow-root,和普通元素一样操作其下的元素。
|
||||
- 支持直接获取 after 和 before 伪元素的内容。
|
||||
- 可以在元素下直接使用 > 以 css selector 方式获取当前元素直接子元素。原生不支持这种写法。
|
||||
- 可简单地使用 lxml 来解析 d 模式的页面或元素,爬取复杂页面数据时速度大幅提高。
|
||||
- 输出的数据均已转码及处理基本排版,减少重复劳动。
|
||||
- 可方便地与 selenium 或 requests 原生代码对接,便于项目迁移。
|
||||
- 使用 POM 模式封装,可直接用于测试,便于扩展。
|
||||
- d 模式配置可同时兼容 debugger 和其它参数,原生不能兼容。
|
||||
- 还有很多这里不一一列举…………
|
||||
|
||||
# 免责声明
|
||||
|
||||
请勿将 DrissionPage 应用到任何可能会违反法律规定和道德约束的工作中,请友善使用 DrissionPage,遵守蜘蛛协议,不要将 DrissionPage 用于任何非法用途。如您选择使用 DrissionPage
|
||||
即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。
|
2
setup.py
2
setup.py
@ -6,7 +6,7 @@ with open("README.md", "r", encoding='utf-8') as fh:
|
||||
|
||||
setup(
|
||||
name="DrissionPage",
|
||||
version="2.3.3",
|
||||
version="2.4.0",
|
||||
author="g1879",
|
||||
author_email="g1879@qq.com",
|
||||
description="A module that integrates selenium and requests session, encapsulates common page operations.",
|
||||
|
Loading…
x
Reference in New Issue
Block a user