快捷搜索:  汽车  科技

python 网站自动化操作(最近又火了一个Web自动化工具)

python 网站自动化操作(最近又火了一个Web自动化工具)# 使用 selenium: from selenium.webdriver.support.select import Select select_element = Select(element) select_element.select_by_visible_text('text') # 使用 DrissionPage: element.select('text')拖拽一个元素# 使用 selenium: driver.switch_to.window(driver.window_handles[0]) # 使用 DrissionPage: page.to_tab(0)按文本选择下拉列表如图所示,Drission对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。MixPage对象负责对获取到的页面进行解析

《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个开源基于 python 的 Web 自动化操作集成工具——DrissionPage。

python 网站自动化操作(最近又火了一个Web自动化工具)(1)

用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。

使用 selenium,可以很大程度上绕过这些坑,但 selenium 效率不高。因此,这个库将 selenium 和 requests 合而为一,不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。

除了合并两者,本库还以网页为单位封装了常用功能,简化了 selenium 的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。一切从简,尽量提供简单直接的使用方法,对新手更友好。

特性
  • 代码高度集成,以简洁的代码为第一追求。
  • 页面对象可在 selenium 和 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和其它参数,原生不能兼容
结构图

如图所示,Drission对象负责链接的创建、共享登录状态等工作,类似 selenium 中 driver 的概念。MixPage对象负责对获取到的页面进行解析、操作。DriverElement和SessionElement则是从页面对象中获取到的元素对象。负责对元素进行解析和操作。

python 网站自动化操作(最近又火了一个Web自动化工具)(2)

简单演示

与 selenium 代码对比

跳转到第一个标签页

# 使用 selenium: driver.switch_to.window(driver.window_handles[0]) # 使用 DrissionPage: page.to_tab(0)

按文本选择下拉列表

# 使用 selenium: from selenium.webdriver.support.select import Select select_element = Select(element) select_element.select_by_visible_text('text') # 使用 DrissionPage: element.select('text')

拖拽一个元素

# 使用 selenium: ActionChains(driver).drag_and_drop(ele1 ele2).perform() # 使用 DrissionPage: ele1.drag_to(ele2)


与 requests 代码对比

获取元素内容

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'} response = requests.get(url headers=headers) html = etree.HTML(response.text) element = html.xpath('//h1')[0] title = element.text # 使用 DrissionPage: page = MixPage('s') page.get(url) title = page('tag:h1').text

下载文件

url = 'https://www.baidu.com/img/flexible/logo/pc/result.png' save_path = r'C:\download' # 使用 requests: r = requests.get(url) with open(f'{save_path}\\img.png' 'wb') as fd: for chunk in r.iter_content(): fd.write(chunk) # 使用 DrissionPage: page.download(url save_path 'img') # 支持重命名,处理文件名冲突,自动创建目标文件夹


爬取新冠排行榜

网址:https://www.outbreak.my/zh/world,此示例爬取全球新冠情况排行榜。该网站是纯 html 页面,特别适合 s 模式爬取和解析。

python 网站自动化操作(最近又火了一个Web自动化工具)(3)

from DrissionPage import MixPage # 用 s 模式创建页面对象 page = MixPage('s') # 访问数据网页 page.get('https://www.outbreak.my/zh/world') # 获取表头元素 thead = page('tag:thead') # 获取表头列,跳过其中的隐藏的列 title = thead.eles('tag:th@@-style:display: none;') data = [th.text for th in title] print(data) # 打印表头 # 获取内容表格元素 tbody = page('tag:tbody') # 获取表格所有行 rows = tbody.eles('tag:tr') for row in rows: # 获取当前行所有列 cols = row.eles('tag:td') # 生成当前行数据列表(跳过其中没用的几列) data = [td.text for k td in enumerate(cols) if k not in (2 4 6)] print(data) # 打印行数据

输出:

['总 (205)' '累积确诊' '死亡' '治愈' '现有确诊' '死亡率' '恢复率'] ['美国' '55252823' '845745' '41467660' '12 939 418' '1.53%' '75.05%'] ['印度' '34838804' '481080' '34266363' '91 361' '1.38%' '98.36%'] ['巴西' '22277239' '619024' '21567845' '90 370' '2.78%' '96.82%'] ['英国' '12748050' '148421' '10271706' '2 327 923' '1.16%' '80.57%'] ['俄罗斯' '10499982' '308860' '9463919' '727 203' '2.94%' '90.13%'] ['法国' '9740600' '123552' '8037752' '1 579 296' '1.27%' '82.52%'] ......


登录 gitee 网站

网址:https://gitee.com/login,此示例演示使用控制浏览器的方式自动登录 gitee 网站。

from DrissionPage import MixPage # 用 d 模式创建页面对象(默认模式) page = MixPage() # 跳转到登录页面 page.get('https://gitee.com/login') # 定位到账号文本框并输入账号 page.ele('#user_login').input('你的账号') # 定位到密码文本框并输入密码 page.ele('#user_password').input('你的密码') # 点击登录按钮 page.ele('@value=登 录').click()

—END—

开源协议:BSD-3-Clause

开源地址: https://gitee.com/g1879/DrissionPage

猜您喜欢: