DrissionPage 是什么

DrissionPage 是一个基于 python 的网页自动化工具。
它既能控制浏览器,也能收发数据包,还能把两者合而为一。
可兼顾浏览器自动化的便利性和 requests 的高效率。
它功能强大,内置无数人性化设计和便捷功能。
它的语法简洁而优雅,代码量少,对新手友好。

用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。

因此,这个库设计初衷,是将它们合而为一,同时实现“写得快”和“跑得快”。能够在不同需要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,使用户可减少考虑细节,专注功能实现。 以简单的方式实现强大的功能,使代码更优雅。

以前的版本是对 selenium 进行重新封装实现的。从 3.0 开始,作者另起炉灶,对底层进行了重新开发,摆脱对 selenium 的依赖,增强了功能,提升了运行效率。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from DrissionPage import ChromiumPage

# 创建页面对象,并启动或接管浏览器
page = ChromiumPage()
# 跳转到登录页面
page.get('https://gitee.com/login')

# 定位到账号文本框,获取文本框元素
ele = page.ele('#user_login')
# 输入对文本框输入账号
ele.input('您的账号')
# 定位到密码文本框并输入密码
page.ele('#user_password').input('您的密码')
# 点击登录按钮
page.ele('@value=登 录').click()

应用实例

淘宝商品截图

1
2
3
4
5
6
# 部分代码
page = ChromiumPage(co)
page.get(img_url,retry=1, interval=1, timeout=1.5)

img = page('tag:img')
img.get_screenshot(path='./', name='temp_img.jpg')

未来工厂订单数据爬取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from DrissionPage import SessionPage, SessionOptions # pip install DrissionPage
from DrissionPage import ChromiumPage
from DrissionPage import ChromiumOptions
import re
import time

co = ChromiumOptions(read_file=False) # 不读取文件方式新建配置对象

co.set_browser_path(r'C:\Program Files\Google\Chrome\Application\chrome.exe') # 设置浏览器路径
# co.set_argument('--headless') # 设置无头模式 隐藏浏览器界面
# 设置配置文件路径
co.set_user_data_path(r'C:\Users\weiek\AppData\Local\Google\Chrome\User Data')


url_base = "https://www.wenext.cn/index.php?route=account/order&filter_time=6&page="

page = ChromiumPage(co)


# cp = ChromiumPage(co)

for i in range(1, 20):
print(i)
url = url_base + str(i)
page.get(url)
# 等待页面加载完成
page.wait.doc_loaded()
# 从 page.html 正则匹配订单号 订单编号 86027961
result_num = re.findall(r'订单编号 (\d+)', page.html)
# print(result_num)
try:
for i in result_num:
page.get('https://www.wenext.cn/index.php?route=account/order/info&order_id=' + i)
page.wait.doc_loaded()
# print(page.html)
# 正则匹配订单金额 余额(158.00) 余额(158)
result_money = re.findall(r'余额\((.*?)\)', page.html)[0]
print(result_money)
# time.sleep(10)
# 正则匹预计在2024-03-17 23:00:00前发货
result_time1 = re.findall(r'预计在(.*?)前发货', page.html)[0].replace('23:00:00', ' ')
print(result_time1)

# 正则匹配 <td class="order-body-time">2024-03-10</td>
# <td class="order-body-time">2024-03-10</td>
# <td class="order-body-time">已发货,待签收</td>
result_time2_list = re.findall(r'<td class="order-body-time">(.*?)</td>', page.html, re.S)
result_time2 = '0'
for j in result_time2_list:
if j == '已发货,待签收':
# 获取索引
index = result_time2_list.index(j)
# 获取发货时间
result_time2 = result_time2_list[index - 1]
if result_time2 != '0':
with open('wenext.txt', 'a') as f:
# 写入文件 订单号 订单金额 预计发货时间 实际发货时间
f.write(i + ' ' + result_money + ' ' + result_time1 + ' ' + result_time2 + ' '+'\n')
print(result_time2)
# time.sleep(1)
except:
with open('wenexterr.txt', 'a') as f:
f.write(i + ' ' + 'error' + ' ' + 'error' + ' ' + 'error' + ' '+'\n')