凡科建站模板安徽天长建设局网站

web/2025/10/5 15:29:11/文章来源:
凡科建站模板,安徽天长建设局网站,建立网站可以赚钱吗?,徐州手机网站建设公司哪家好登陆时间#xff1a;2019-10-21实现难度#xff1a;★★★☆☆☆请求链接#xff1a;https://passport.bilibili.com/login实现目标#xff1a;模拟登陆哔哩哔哩#xff0c;攻克滑动验证码涉及知识#xff1a;滑动验证码的攻克、自动化测试工具 Selenium 的使用完整代码2019-10-21实现难度★★★☆☆☆请求链接https://passport.bilibili.com/login实现目标模拟登陆哔哩哔哩攻克滑动验证码涉及知识滑动验证码的攻克、自动化测试工具 Selenium 的使用完整代码https://github.com/TRHX/Python3-Spider-Practice/tree/master/AutomationTool/bilibili-login其他爬虫实战代码合集持续更新https://github.com/TRHX/Python3-Spider-Practice爬虫实战专栏持续更新https://itrhx.blog.csdn.net/article/category/9351278 文章目录【1x00】思维导图【2x00】登陆模块【2x01】初始化函数【2x02】登陆函数【3x00】验证码处理模块【3x01】验证码元素查找函数【3x02】元素可见性设置函数【3x03】验证码截图函数【4x00】验证码滑动模块【4x01】滑动主函数【4x02】缺口位置寻找函数【4x03】计算滑块移动距离函数【4x04】构造移动轨迹函数【4x05】模拟拖动函数【5x00】完整代码【6x00】效果实现动图【1x00】思维导图 利用自动化测试工具 Selenium 直接模拟人的行为方式来完成验证 分析页面想办法找到滑动验证码的完整图片、带有缺口的图片和需要滑动的图片 对比原始的图片和带缺口的图片的像素像素不同的地方就是缺口位置 计算出滑块缺口的位置得到所需要滑动的距离 拖拽时要模仿人的行为由于有个对准过程所以要构造先快后慢的运动轨迹 最后利用 Selenium 进行对滑块的拖拽 【2x00】登陆模块 【2x01】初始化函数 def init():global url, browser, username, password, waiturl https://passport.bilibili.com/login# path是谷歌浏览器驱动的目录如果已经将目录添加到系统变量则不用设置此路径path rF:\PycharmProjects\Python3爬虫\chromedriver.exechrome_options Options()chrome_options.add_argument(--start-maximized)browser webdriver.Chrome(executable_pathpath, chrome_optionschrome_options)# 你的哔哩哔哩用户名username 155********# 你的哔哩哔哩登陆密码password ***********wait WebDriverWait(browser, 20)global 关键字定义了发起请求的url、用户名、密码等全局变量随后是登录页面url、谷歌浏览器驱动的目录path、实例化 Chrome 浏览器、设置浏览器分辨率最大化、用户名、密码、WebDriverWait() 方法设置等待超时 【2x02】登陆函数 def login():browser.get(url)# 获取用户名输入框user wait.until(EC.presence_of_element_located((By.ID, login-username)))# 获取密码输入框passwd wait.until(EC.presence_of_element_located((By.ID, login-passwd)))# 输入用户名user.send_keys(username)# 输入密码passwd.send_keys(password)# 获取登录按钮login_btn wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, a.btn.btn-login)))# 随机暂停几秒time.sleep(random.random() * 3)# 点击登陆按钮login_btn.click() 等待用户名输入框和密码输入框对应的 ID 节点加载出来 获取这两个节点用户名输入框 idlogin-username密码输入框 idlogin-passwd 调用 send_keys() 方法输入用户名和密码 获取登录按钮 classbtn btn-login 随机产生一个数并将其扩大三倍作为暂停时间 最后调用 click() 方法实现登录按钮的点击 【3x00】验证码处理模块 【3x01】验证码元素查找函数 def find_element():# 获取带有缺口的图片c_background wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, canvas.geetest_canvas_bg.geetest_absolute)))# 获取需要滑动的图片c_slice wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, canvas.geetest_canvas_slice.geetest_absolute)))# 获取完整的图片c_full_bg wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute)))# 隐藏需要滑动的图片hide_element(c_slice)# 保存带有缺口的图片save_screenshot(c_background, back)# 显示需要滑动的图片show_element(c_slice)# 保存需要滑动的图片save_screenshot(c_slice, slice)# 显示完整的图片show_element(c_full_bg)# 保存完整的图片save_screenshot(c_full_bg, full) 获取验证码的三张图片分别是完整的图片、带有缺口的图片和需要滑动的图片 分析页面代码三张图片是由 3 个 canvas 组成3 个 canvas 元素包含 CSS display 属性display:block 为可见display:none 为不可见在分别获取三张图片时要将其他两张图片设置为 display:none这样做才能单独提取到每张图片 定位三张图片的 class 分别为带有缺口的图片c_backgroundgeetest_canvas_bg geetest_absolute、需要滑动的图片c_slicegeetest_canvas_slice geetest_absolute、完整图片c_full_bggeetest_canvas_fullbg geetest_fade geetest_absolute 最后传值给 save_screenshot() 函数进一步对验证码进行处理 【3x02】元素可见性设置函数 # 设置元素不可见 def hide_element(element):browser.execute_script(arguments[0].stylearguments[1], element, display: none;)# 设置元素可见 def show_element(element):browser.execute_script(arguments[0].stylearguments[1], element, display: block;)【3x03】验证码截图函数 def save_screenshot(obj, name):try:# 首先对出现验证码后的整个页面进行截图保存pic_url browser.save_screenshot(.\\bilibili.png)print(%s:截图成功! % pic_url)# 计算传入的obj也就是三张图片的位置信息left obj.location[x]top obj.location[y]right left obj.size[width]bottom top obj.size[height]# 打印输出一下每一张图的位置信息print(图 name)print(Left %s % left)print(Top %s % top)print(Right %s % right)print(Bottom %s % bottom)print()# 在整个页面截图的基础上根据位置信息分别剪裁出三张验证码图片并保存im Image.open(.\\bilibili.png)im im.crop((left, top, right, bottom))file_name bili_ name .pngim.save(file_name)except BaseException as msg:print(%s:截图失败! % msg) location 属性可以返回该图片对象在浏览器中的位置坐标轴是以屏幕左上角为原点x轴向右递增y轴向下递增 size 属性可以返回该图片对象的高度和宽度由此可以得到验证码的位置信息 首先调用 save_screenshot() 属性对整个页面截图并保存 然后向 crop() 方法传入验证码的位置信息由位置信息再对验证码进行剪裁并保存 【4x00】验证码滑动模块 【4x01】滑动主函数 def slide():distance get_distance(Image.open(.\\bili_back.png), Image.open(.\\bili_full.png))print(计算偏移量为%s Px % distance)trace get_trace(distance - 5)move_to_gap(trace)time.sleep(3)向 get_distance() 函数传入完整的图片和缺口图片计算滑块需要滑动的距离再把距离信息传入 get_trace() 函数构造滑块的移动轨迹最后根据轨迹信息调用 move_to_gap() 函数移动滑块完成验证 【4x02】缺口位置寻找函数 def is_pixel_equal(bg_image, fullbg_image, x, y):# 获取两张图片对应像素点的RGB数据bg_pixel bg_image.load()[x, y]fullbg_pixel fullbg_image.load()[x, y]# 设定一个阈值threshold 60# 比较两张图 RGB 的绝对值是否均小于定义的阈值if (abs(bg_pixel[0] - fullbg_pixel[0] threshold) and abs(bg_pixel[1] - fullbg_pixel[1] threshold) and abs(bg_pixel[2] - fullbg_pixel[2] threshold)):return Trueelse:return False 将完整图片和缺口图片两个对象分别赋值给变量 bg_image 和 fullbg_image接下来对比图片获取缺口。遍历图片的每个坐标点获取两张图片对应像素点的 RGB 数据判断像素的各个颜色之差abs() 用于取绝对值比较两张图 RGB 的绝对值是否均小于定义的阈值 threshold如果绝对值均在阈值之内则代表像素点相同继续遍历否则代表不相同的像素点即缺口的位置 【4x03】计算滑块移动距离函数 def get_distance(bg_image, fullbg_image):# 滑块的初始位置distance 60# 遍历两张图片的每个像素for i in range(distance, fullbg_image.size[0]):for j in range(fullbg_image.size[1]):# 调用缺口位置寻找函数if not is_pixel_equal(fullbg_image, bg_image, i, j):return i get_distance() 方法即获取缺口位置的方法此方法的参数是两张图片一张为完整的图片另一张为带缺口的图片distance 为滑块的初始位置遍历两张图片的每个像素利用 is_pixel_equal() 缺口位置寻找函数判断两张图片同一位置的像素是否相同若不相同则返回该点的值 【4x04】构造移动轨迹函数 def get_trace(distance):trace []# 设置加速距离为总距离的4/5faster_distance distance * (4 / 5)# 设置初始位置、初始速度、时间间隔start, v0, t 0, 0, 0.1while start distance:if start faster_distance:a 10else:a -10# 位移move v0 * t 1 / 2 * a * t * t# 当前时刻的速度v v0 a * tv0 vstart movetrace.append(round(move))# trace 记录了每个时间间隔移动了多少位移return trace get_trace() 方法传入的参数为移动的总距离返回的是运动轨迹运动轨迹用 trace 表示它是一个列表列表的每个元素代表每次移动多少距离利用 Selenium 进行对滑块的拖拽时要模仿人的行为由于有个对准过程所以是先快后慢匀速移动、随机速度移动都不会成功因此要设置一个加速和减速的距离这里设置加速距离 faster_distance 是总距离 distance 的4/5倍滑块滑动的加速度用 a 来表示当前速度用 v 表示初速度用 v0 表示位移用 move 表示所需时间用 t 表示它们之间满足以下关系 move v0 * t 0.5 * a * t * t v v0 a * t设置初始位置、初始速度、时间间隔分别为0, 0, 0.1加速阶段和减速阶段的加速度分别设置为10和-10直到运动轨迹达到总距离时循环终止最后得到的 trace 记录了每个时间间隔移动了多少位移这样滑块的运动轨迹就得到了 【4x05】模拟拖动函数 def move_to_gap(trace):# 获取滑动按钮slider wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, div.geetest_slider_button)))# 点击并拖动滑块ActionChains(browser).click_and_hold(slider).perform()# 遍历运动轨迹获取每小段位移距离for x in trace:# 移动此位移ActionChains(browser).move_by_offset(xoffsetx, yoffset0).perform()time.sleep(0.5)# 释放鼠标ActionChains(browser).release().perform() 传入的参数为运动轨迹首先查找到滑动按钮然后调用 ActionChains 的 click_and_hold() 方法按住拖动底部滑块perform() 方法用于执行遍历运动轨迹获取每小段位移距离调用 move_by_offset() 方法移动此位移最后调用 release() 方法松开鼠标即可 【5x00】完整代码 # # --*-- coding: utf-8 --*-- # Time : 2019-10-21 # Author : TRHX # Blog : www.itrhx.com # CSDN : https://blog.csdn.net/qq_36759224 # FileName: bilibili.py # Software: PyCharm # from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains import time import random from PIL import Image# 初始化函数 def init():global url, browser, username, password, waiturl https://passport.bilibili.com/login# path是谷歌浏览器驱动的目录如果已经将目录添加到系统变量则不用设置此路径path rF:\PycharmProjects\Python3爬虫\chromedriver.exechrome_options Options()chrome_options.add_argument(--start-maximized)browser webdriver.Chrome(executable_pathpath, chrome_optionschrome_options)# 你的哔哩哔哩用户名username 155********# 你的哔哩哔哩登录密码password ***********wait WebDriverWait(browser, 20)# 登录函数 def login():browser.get(url)# 获取用户名输入框user wait.until(EC.presence_of_element_located((By.ID, login-username)))# 获取密码输入框passwd wait.until(EC.presence_of_element_located((By.ID, login-passwd)))# 输入用户名user.send_keys(username)# 输入密码passwd.send_keys(password)# 获取登录按钮login_btn wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, a.btn.btn-login)))# 随机暂停几秒time.sleep(random.random() * 3)# 点击登陆按钮login_btn.click()# 验证码元素查找函数 def find_element():# 获取带有缺口的图片c_background wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, canvas.geetest_canvas_bg.geetest_absolute)))# 获取需要滑动的图片c_slice wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, canvas.geetest_canvas_slice.geetest_absolute)))# 获取完整的图片c_full_bg wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute)))# 隐藏需要滑动的图片hide_element(c_slice)# 保存带有缺口的图片save_screenshot(c_background, back)# 显示需要滑动的图片show_element(c_slice)# 保存需要滑动的图片save_screenshot(c_slice, slice)# 显示完整的图片show_element(c_full_bg)# 保存完整的图片save_screenshot(c_full_bg, full)# 设置元素不可见 def hide_element(element):browser.execute_script(arguments[0].stylearguments[1], element, display: none;)# 设置元素可见 def show_element(element):browser.execute_script(arguments[0].stylearguments[1], element, display: block;)# 验证码截图函数 def save_screenshot(obj, name):try:# 首先对出现验证码后的整个页面进行截图保存pic_url browser.save_screenshot(.\\bilibili.png)print(%s:截图成功! % pic_url)# 计算传入的obj也就是三张图片的位置信息left obj.location[x]top obj.location[y]right left obj.size[width]bottom top obj.size[height]# 打印输出一下每一张图的位置信息print(图 name)print(Left %s % left)print(Top %s % top)print(Right %s % right)print(Bottom %s % bottom)print()# 在整个页面截图的基础上根据位置信息分别剪裁出三张验证码图片并保存im Image.open(.\\bilibili.png)im im.crop((left, top, right, bottom))file_name bili_ name .pngim.save(file_name)except BaseException as msg:print(%s:截图失败! % msg)# 滑动模块的主函数 def slide():distance get_distance(Image.open(.\\bili_back.png), Image.open(.\\bili_full.png))print(计算偏移量为%s Px % distance)trace get_trace(distance - 5)move_to_gap(trace)time.sleep(3)# 计算滑块移动距离函数 def get_distance(bg_image, fullbg_image):# 滑块的初始位置distance 60# 遍历两张图片的每个像素for i in range(distance, fullbg_image.size[0]):for j in range(fullbg_image.size[1]):# 调用缺口位置寻找函数if not is_pixel_equal(fullbg_image, bg_image, i, j):return i# 缺口位置寻找函数 def is_pixel_equal(bg_image, fullbg_image, x, y):# 获取两张图片对应像素点的RGB数据bg_pixel bg_image.load()[x, y]fullbg_pixel fullbg_image.load()[x, y]# 设定一个阈值threshold 60# 比较两张图 RGB 的绝对值是否均小于定义的阈值if (abs(bg_pixel[0] - fullbg_pixel[0] threshold) and abs(bg_pixel[1] - fullbg_pixel[1] threshold) and abs(bg_pixel[2] - fullbg_pixel[2] threshold)):return Trueelse:return False# 构造移动轨迹函数 def get_trace(distance):trace []# 设置加速距离为总距离的4/5faster_distance distance * (4 / 5)# 设置初始位置、初始速度、时间间隔start, v0, t 0, 0, 0.1while start distance:if start faster_distance:a 10else:a -10# 位移move v0 * t 1 / 2 * a * t * t# 当前时刻的速度v v0 a * tv0 vstart movetrace.append(round(move))# trace 记录了每个时间间隔移动了多少位移return trace# 模拟拖动函数 def move_to_gap(trace):# 获取滑动按钮slider wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, div.geetest_slider_button)))# 点击并拖动滑块ActionChains(browser).click_and_hold(slider).perform()# 遍历运动轨迹获取每小段位移距离for x in trace:# 移动此位移ActionChains(browser).move_by_offset(xoffsetx, yoffset0).perform()time.sleep(0.5)# 释放鼠标ActionChains(browser).release().perform()if __name__ __main__:init()login()find_element()slide() 【6x00】效果实现动图 最终实现效果图关键信息已经过打码处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/87428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net网站建设项目实战 董义革网站排名做不上去

一、搭建环境 1、安装Slenium pip install selenium 2、安装浏览器驱动-》查询浏览器版本-》下载对应版本驱动-》在path路径中配置(浏览器更新需要重新下载) pip install webdriver -helper(自动化)python3.9以上 pip install 安…

青岛高品质网站建设做亚马逊一个月挣10万

1185 威佐夫游戏 V2 有2堆石子。A B两个人轮流拿,A先拿。每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取。拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出2堆石子的数量,问最后谁…

石家庄货运做网站公司河间做网站 申梦网络

一、什么是计算机视觉 定义:计算机视觉(Computer vision)是⼀⻔研究如何使机器“看”的科学,更 进⼀步的说,就是指⽤摄影机和计算机代替⼈眼对⽬标进⾏识别、跟踪和测量 等,⽤计算机处理成为更适合⼈眼观察…

苏州专业建站当阳seo外包

onFocus事件就是当光标落在文本框中时发生的事件。 onBlur事件是光标失去焦点时发生的事件。 可以编如下例子 1.html <HTML> <HEAD> <TITLE>使用onBlur事件处理程序</TITLE> </HEAD> <BODY BGCOLOR"lavender"> <FORM name&qu…

企业成品网站模板多语言网站制作

配置蓝牙终端定位示例 组网图形 图1 配置蓝牙终端定位示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 商场管理员希望在已有WLAN覆盖业务的基础上&#xff0c;使用蓝牙定位技术&#xff0c;根据顾客所在的位置&#xff0c;提供商场导航、导…

网站建设用模板好吗体验营销策划方案

-- 获取当天日期 -- 2023-06-20 select curdate();-- 获取当天年月日时分秒 select now();-- 日期运算 -- 2024-06-20 17:04:17 select date_add(now(),interval 1 year);-- 日期比较 -- 0 select datediff(now(),now());-- 日期MySQL对于日期类型数据如何查询 -- 获取指定日期…

网站建设鼠标点击变色怎么弄网站备案 密码找回

我使用中英互译的方法来制作本次笔记&#xff0c;课程来自网上精品资源 VSCode相关快捷键 选择文件夹和拖拽文件夹来打开 使用&#xff01;加enter&#xff08;回车&#xff09;&#xff0c;输入默认模板 <!DOCTYPE html> <html lang"en"> <head&…

php网站建设案例教程视频教程帮助传销做网站会不会判刑

**单片机设计介绍&#xff0c;1650【毕设课设】基于STM32两轮自平衡小车系统设计与控制 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 主控芯片用的是100脚的STM32F103VET6&#xff0c;陀螺仪用的是MPU6050&#xff0c;电机…

社交做的最好的网站有哪些网站建设技术服务的方式是什么意思

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 代码写法&#xff1a; &#xff08;要求 JDK 1.8 或 1.8 以上&#xff09; package gentle.entity;import lombok.Data; /**** auth…

网站开发英文参考文献WordPress二级目录文章404

来源&#xff1a;兴业证券 ▌5G:大通信容量及超低延时&#xff0c;未来多项应用的基础5G:高工作频率以及频谱带宽带来高通信容量5G(5thgeneration)是指第五代移动电话通信标准。3GPP(第三代合作伙伴计划&#xff0c;电信标准化机构)将5G标准分为了NSA(非独立组网)和SA(独立组网…

网站开发难点企业宣传册设计

现在有dll模块A,dll模块B以及静态库C, C中有个全局Create()函数负责创建对象M,当第二次调用Create()的时候会增加引用计数&#xff0c;并返回原来创建的对象M。Relase()会减少引用计数。当引用计数为0时&#xff0c;销毁对象M。现在在模块A中创建的初始化对象M&#xff0c;模块…

男和男做的视频网站长春网站设计公司

文章目录 1. 前置条件2. 简介3. GitLab Kubernetes Agent 的部署3.1 启用 Agent 服务端3.2 创建 Agent 配置和清单仓库 4. 安装agent4.1 连接k8s集群4.2 在集群中部署4.3 修改资源清淡&#xff0c;调整pod的副本数 5. 思考 1. 前置条件 gitlab 14.5 专业版k8s集群helm客户端工…

珠海集团网站制作外包云服务器5元左右的

一个网友的迷惑&#xff1a; 我工作&#xff15;年了&#xff0c;一直做&#xff2a;&#xff12;&#xff25;&#xff25;的项目&#xff0c;前几天去面试&#xff0c;一个人问我JDBC有几种连接方式&#xff0c;这个问题这么多年以来我从来没有遇见过&#xff0c;不知道大家 …

0建设营销型网站步骤wordpress 改cms

EasyPOI是一款优秀的开源Java库&#xff0c;专为简化和优化Excel文件的导入导出操作而设计。下面&#xff0c;我会介绍EasyPOI在项目中使用EasyPOI&#xff0c;实现Excel文件的高效操作。帮助读者全面了解和掌握这一工具。 EasyPOI简介 官网&#xff1a; http://www.wupaas.co…

注册网站会员需填写企业网站的类型包括

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼山西省中等职业学校对口升学考试大纲信息技术类专业本考试大纲是以国家中等职业学校计算机专业教学指导方案为依据&#xff0c;以中等职业教育国家规划教材《物理(电工电子类)》(李广华、郝翠兰主编&#xff0c;电子工业出版社)、《…

网站建设公司官网软件开发是什么行业

文章目录1. 题目信息2. 解题2.1 暴力遍历2.2 二分查找1. 题目信息 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1:输入…

我的世界做图的网站wordpress查询置顶文章

动态方法注入 grails最近&#xff0c;我有一个UI要求&#xff0c;客户希望从两个单独的下拉列表中选择值。 第一个下拉列表的值实质上过滤了第二个下拉列表的值。 鉴于我们支持的财务项目对UI的要求并不严格&#xff0c;因此我不得不进行一些初步的学习和试验&#xff0c;以实现…

宝山湖网站建设wordpress 修改发布时间

本文讲的是Unity AI副总裁Danny Lange&#xff1a;如何用AI助推游戏行业&#xff1f; &#xff0c;10月26日&#xff0c;在加州山景城举办的ACMMM 2017大会进入正会第三天。在会上&#xff0c;Unity Technology负责AI与机器学习的副总裁Danny Longe进行了题为《Bringing Gaming…

佛山外贸网站设计公司建设银行手机银行网站用户名是什么

前言 以前在给网页文字设置一些好看的字体时&#xff0c;限于用户系统是否安装此字体&#xff0c;而只能使用三种方法解决&#xff0c;要么用通用字体&#xff0c;要么用图片替换文本&#xff0c;要么用Flash。而这几种方法却存在严重的缺陷。 现在好了&#xff0c;font-face终…

县级门户网站用什么源码好网站建设市场有多大

渐变色彩可以增加视觉层次感和动态效果&#xff0c;使网页界面更加生动有趣&#xff0c;吸引用户注意力。另外&#xff0c;相较于静态背景图片&#xff0c;CSS渐变无需额外的HTTP请求&#xff0c;减轻服务器负载&#xff0c;加快页面加载速度&#xff1b;同时CSS渐变能够根据容…