lement UI 组件库提供了丰富的UI组件,涵盖了页面布局、表单、数据展示、导航、反馈等各个方面,能够帮助开发者快速构建现代化的用户界面。
布局组件
Container: 布局容器,用于划分页面区域。
Flexbox: 布局容器,使用 flexbox 布局属性进行布局。
Grid: 布局容器,使用 CSS Grid 布局属性进行布局。
Spacer: 间隔块,用于控制元素之间的间距。
表单组件
Form: 表单组件,用于收集用户输入的数据。
FormItem: 表单项组件,用于表示表单中的一个字段。
Input: 输入框组件,用于用户输入文本。
Select: 下拉选择框组件,用于用户选择选项。
Checkbox: 复选框组件,用于用户选择多个选项。
Radio: 单选框组件,用于用户选择一个选项。
Switch: 开关组件,用于用户开启或关闭功能。
Slider: 滑动条组件,用于用户选择数值。
Upload: 上传组件,用于用户上传文件。
数据展示组件
Table: 表格组件,用于展示数据。
Tree: 树形控件组件,用于展示层级数据。
Tag: 标签组件,用于展示信息。
Pagination: 分页组件,用于对数据进行分页。
导航组件
Menu: 菜单组件,用于提供导航功能。
Breadcrumb: 面包屑组件,用于指示用户的当前位置。
Steps: 步骤条组件,用于引导用户完成操作。
反馈组件
Dialog: 对话框组件,用于向用户展示信息或收集用户输入。
MessageBox: 消息框组件,用于向用户提示信息。
Tooltip: 浮动提示组件,用于向用户展示额外的信息。
Popover: 气泡框组件,用于向用户展示详细的信息。
其他组件
Button: 按钮组件,用于触发操作。
Icon: 图标组件,用于展示图标。
Progress: 进度条组件,用于指示操作的进度。
Badge: 徽章组件,用于展示提示信息。
Alert: 警告组件,用于提示用户错误或危险信息。
以上只是 Element UI 组件库的主要分类及其包含的组件,还有一些其他组件没有列出,例如:
Card: 卡片组件
Avatar: 头像组件
Empty: 空状态组件
Rate: 评分组件
开发者可以根据自己的需求选择合适的组件进行使用。
Element UI 组件库提供了丰富的属性和方法,用于配置和控制组件的行为。开发者可以查阅 Element UI 官方文档来了解各个组件的详细用法。
Element UI 组件的优点
Element UI 组件库具有以下优点:
功能丰富:提供了丰富的UI组件,能够满足大多数开发需求。
易于使用:组件的API设计简单易懂,上手容易。
响应式设计:组件支持响应式设计,能够自动适应不同设备的屏幕尺寸。
主题定制:提供了丰富的主题,开发者可以根据自己的需求进行定制。
社区活跃:拥有庞大的社区,开发者可以相互交流学习。
应该都很熟悉
点击滑块然后移动到图片缺口进行验证
现在越来越多的网站使用这样的验证方式
为的是增加验证码识别的难度
那么
对于这种验证码
应该怎么破呢
接下来就是
打开 b 站的登录页面
https://passport.bilibili.com/login
image
可以看到登录的时候需要进行滑块验证
按下 F12
进入 Network
看下我们将滑块移到缺口松开之后做了什么提交
可以看到是一个 GET 请求
但是
这请求链接也太特么长了吧
我们来看看请求的参数是怎么样的
哇靠
gt?
challenge?
w?
这些都是什么鬼参数
还加密了
完全下不了手啊
既然以请求的方式不好弄
我们从它们的源代码入手
看看有什么突破口
回到 b 站的登录页
按下 F12
进入 Element
然后点击滑块出现了图片
定位一下
发现有两个 a 标签
一个 class 是 gt_bg gt_show
一个 class 是 gt_fullbg gt_show
和小帅b想的一样
这个验证码应该是有两张图片
一张是完全的背景图片
一张是缺口的图片
那把这两张图片下载下来对比一下不就行了
打开 a 标签一看
一张图片被切割成很多小块
原来这张图片是拼出来的
我们看看原始图片是怎么样的
记得私信小编【学习】领取Python学习教程哦。
什么乱七八糟的
再仔细看下源代码
原来是在同一张图片通过偏移量合成了一张完整的图片
background-position: -277px -58px;
看了一下缺口的图片也是如此
到这里
我们的第一个思路就是
下载这两张原始图片
然后通过偏移量合成两张真正的图片
背景图
image
缺口图
↓变身
那么怎么做呢?
因为我们还要模拟滑动滑块
所以呢
我们要用到selenium
打开b站的登录页
然后等到那个滑块显示出来
# 获取滑块按钮
接下来我们就获取页面的源码
driver.page_source
然后使用bs 获取两张原始背景图片的 url
bs=BeautifulSoup(driver.page_source,'lxml')
拿到了图片地址之后
将图片下载下来
# 将图片格式存为 jpg 格式
ok
我们已经把两张原始图片下载下来了
那么接下来就是要合成图片了
我们要根据图片的位置来合成
也就是源码中的 background-position
获取每一个小图片的位置
我们可以通过字典的形式来表示这些位置
然后将数据放到列表中
# 存放每个合成缺口背景图片的位置
那么
现在我们已经有了原始图片
还知道了每个位置应该显示原始图片的什么部分
接下来我们就写一个方法
用来合成图片
# 写入图片
那么问题又来了
怎么合成啊
我们再看看一开始分析的图片
这里图片被分割成的每一个小图片的尺寸是
10 * 58
所以我们也要将我们刚刚下载的原始图片切割成相应的尺寸大小
而且
这张图片是由上半部分的小图片和下半部分的小图片合成的
所以我们定义两个 list 来装这些小图片
# 存放上下部分的各个小块
然后将原始的图片切割好放进去
image=Image.open(image_file)
至此
我们这两个 list 就分别放好了各个切割的图片了
那么接下来就创建一张空白的图片
然后将小图片一张一张(间距为10)的粘贴到空白图片里
这样我们就可以得到一张合成好的图片了
# 创建一张大小一样的图片
那么到现在
我们可以得到网页上显示的那两张图片了
一张完全的图片
一张带缺口的图片
接下来我们就要通过对比这两张图
看看我们要滑动的距离是多远
# 合成图片
可以通过图片的 RGB 来计算
我们设定一个阈值
如果 r、g、b 大于这个阈值
我们就返回距离
def get_distance(bg_Image, fullbg_Image):
现在
我们知道了关键的滑动距离了
激动人心的时刻到了
我们使用 selenium
拿到滑块的元素
然后根据这个距离拖动到缺口位置不就好了么
马上打开 selenium 的文档
看到了这个函数
它可以使用左键点击元素
然后拖动到指定距离
最后释放鼠标左键
knob=WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show")))
运行一下试试看吧
妖怪吃了拼图了
看来直接拖拽是不行的
试着拖完滑块让它睡一下再释放
ActionChains(driver).click_and_hold(knob).perform()
发现拼图还是特么的被妖怪吃了
有个叫匀速直线运动的东西
什么 加速度
什么 v=v0 + at
什么 s=?at2
什么鬼
回到正题
我们可以使用它来构造一个运动路径
该加速时加速
该减速的时候减速
这样的话就更像人类在滑动滑块了
这次
我们使用这个轨迹来滑动
knob=WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#gc-box > div > div.gt_slider > div.gt_slider_knob.gt_show")))
好了好了
我们再来运行一下吧
哈哈哈
成功识别了
当然了
成功率不是 100%
可以多调戏它几次
以上就是识别滑动验证码的具体过程了
对于其它大部分的滑动验证码
也是可以使用这招搞定的
最后如果你依然在编程的世界里迷茫,不知道自己的未来规划,对python感兴趣,小编为初学者们准备的python入门教程!
请私信回复:“学习”就可以拿到一份我为大家准备的Python学习资料!希望能帮助你更了解python,学习python。
完整代码:
lexslider是一款基于的jQuery内容滚动插件。可以使用它轻松实现各种图片轮播效果、焦点图效果。而且可以自动播放,使用导航按钮和键盘来控制。可定制性非常高。
效果图:
具有特征:
支持图文混排,html元素。
支持滑动和淡入淡出效果。
支持水平、垂直方向滑动。
支持键盘方向键控制。
支持触控滑动。
自适应屏幕尺寸。
可控制滑动单元个数。
更多选项设置和回调函数。
Flexslider的使用方法:
首先载入jquery库文件和Flexslider插件,还有Flexslider所需的基本css样式文件。
HTML代码:
我们使用了.flexslider来包括所有需要滚动的内容元素,然后使用<ul class="slides">这个class非常关键,内部的滚动内容都是针对.slides的,然后在<li>内部加入任意html元素,包括图片和文字。
JQuery调用Flexslider插件非常简单,使用如下代码:
参数选项:
*请认真填写需求信息,我们会在24小时内与您取得联系。