当前位置: 首页 > news >正文

【Python爬虫系列】_016.关于登录和验证码

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
优 质 教 程 推 荐:👉👉 Python爬虫从入门到入狱系列 合集👈👈

分隔线
在这里插入图片描述

关于登录和验证码

    • 关于登录和验证码
      • 关于登录
      • 关于验证码
        • 方式一:免费
        • 方式二:付费
      • 登录
      • 总结

关于登录和验证码

关于登录

  • 跟踪登录流程,了解Cookie的生成过程

  • 本次学习以 http://www.woaidu.cc/ 为例进行练习

  • 登录网站 —— 随意找几本小说 —— 在线月度 —— 加入书架 —— 点击右上角的用户名(User) 可以查看到当前账户所有加入书架的书本

  • 要求:获取当前账户下加入书架内所有书本名称

  • 方式一:人工登录,进入书架后,在抓包工具中复制Requests Headers

  • 优点:简单、粗暴

  • 缺点:每次都需要人工登录,手动复制Headers

    import requests
    from lxml import etreeshuj_url = f'http://www.woaidu.cc/bookcase.php'
    session = requests.session()
    # 设置Headers
    session.headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","cookie": "你的cookie信息","host": "www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/book_1255314.html","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }
    # 通过session发送请求
    resp = session.get(shuj_url)html_code = resp.content.decode("UTF-8")tree = etree.HTML(html_code)    # type: etree._Element
    names = tree.xpath('//h4[@class="bookname"]/a/text()')
    for name in names:print(name)
    
  • 方式二:使用session自动获取cookie

  • 需要看到书架,前提就是需要登录账号

  • 可以先通过代码测试一下没有登录(不携带cookie信息)的时候查看书架是否能看到内容

    import requestsurl = 'http://www.woaidu.cc/bookcase.php'my_headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","host": "www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }resp = requests.get(url, headers=my_headers)
    print(resp.content.decode('utf-8'))
    
  • 查看结果

    • 在这里插入图片描述
  • 结果发现,当不给cookie信息时,是获取不到书架内容的

  • 测试携带cookie信息

    import requestsurl = 'http://www.woaidu.cc/bookcase.php'my_headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","cookie": "你的cookie信息","host": "www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }resp = requests.get(url, headers=my_headers)
    print(resp.content.decode('utf-8'))
    
  • 查看结果

    • 在这里插入图片描述
  • 添加了cookie信息之后,就能访问到书架了

  • 分析cookie,可以看到当前cookie由以下几个信息组成

    Hm_lvt_1......
    HMACCOUNT
    Hm_lpvt_1......
    username......
    t......
    
  • 其中以 HmHM 开头的cookie是百度排名相关的,可以不用管

    • 在这里插入图片描述
  • 那么跟踪一下 usernamet 的cookie信息

    • 在这里插入图片描述
  • 可以看到 usernamet cookie信息都是通过网址 http://www.woaidu.cc/login.php 响应返回的

  • 清空cookie信息后访问网址,发现是登录页面,说明这两个cookie信息是登录后返回的

    • 在这里插入图片描述
  • 此时,需要再跟踪一下登录时发送请求的情况

  • 打开登录界面,随意输入一个错误的账号密码,点击登录,查看抓包情况

    • 在这里插入图片描述

    • 在这里插入图片描述

  • 抓包可以看到,登录的时候发送了一个post请求,请求参数包含了账号、密码、验证码等

  • 同时,在发送这个post请求的时候,请求头中也是包含了cookie信息

  • 分析改cookie信息,可以看到cookie信息中包含

    Hm_lvt_155d53bb19b3d8127ebcd71ae20d55b1=1725245999; 
    Hm_lpvt_155d53bb19b3d8127ebcd71ae20d55b1=1725245999; 
    HMACCOUNT=832C549F34E314E4; c=tq84hVrepXPs......
    
  • 这个cookie信息中 HmHM 开头的cookie是百度排名相关的,可以不用管

  • 那么还有一个 c 的cookie信息,我们尝试不带这个cookie信息是否能登录

    import requestsmy_headers = {"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","content-length": "153","content-type": "application/x-www-form-urlencoded","cookie": "你的cookie信息","host": "www.woaidu.cc","origin": "http://www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/login.php","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }my_data = {"LoginForm[username]": "123123123","LoginForm[password]": "aaaa","LoginForm[captcha]": "4748","action": "login","submit": "登  录"
    }url = 'http://www.woaidu.cc/login.php'resp = requests.post(url, headers=my_headers, data=my_data)
    print(resp.content.decode('utf-8'))
    
  • 查看结果

    • 在这里插入图片描述
  • 这里返回的结果,提示的是验证码异常,与之前页面提示的 用户名和密码错误 并不相同

  • 说明这个 c 的cookie信息必须要携带

  • 此时,我们又不能直接复制这个cookie信息,那么我们就需要找到c这个cookie信息是通过哪个请求响应携带回来的

  • 清空抓包数据,重新访问登录页面,全局查找c=,查看这个cookie是通过那个响应数据携带返回的

    • 在这里插入图片描述
  • 再次清空cookie信息和抓包数据,重新访问登录页面,查看刚刚返回c=相关cookie信息的请求

  • 同时,预览这个请求,返回回来的是一个验证码图片

    • 在这里插入图片描述

    • 在这里插入图片描述

  • 可以看到,发送这个请求的时候,请求头中没有再需要携带其他cookie信息,只需要直接访问,就会在返回响应一个验证码图片的时候携带一个cookie信息

  • 此时,通过发送请求,拿到了需要的cookie信息和验证码图片,接下来就是登录了!

  • 问题来了:那拿到这个验证码图片怎么将验证码识别出来添加到请求参数中呢?


关于验证码

  • 验证码识别有两种方式
方式一:免费
  • 使用第三方库:ddddocr
  • 安装
    pip install ddddocr# 指定安装源
    pip install -i https://mirrors.aliyun.com/pypi/simple ddddocr
    
  • 官方文档
    • https://github.com/sml2h3/ddddocr
  • 使用
    import requests
    import ddddocrurl = 'http://www.woaidu.cc/code.php?0.056086518443781985'my_headers = {"accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","host": "www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/login.php","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }resp = requests.get(url, headers=my_headers)image_b = resp.content# 创建Ddddocr对象, show_ad=False表示不显示广告
    # 使用默认ocr模型
    ddd1 = ddddocr.DdddOcr(show_ad=False)
    result1 = ddd1.classification(image_b)
    print(result1)# 使用第二ocr模型
    ddd2 = ddddocr.DdddOcr(show_ad=False, beta=True)
    result2 = ddd2.classification(image_b)
    print(result2)
    
方式二:付费
  • 使用第三方api识别

    • 超级鹰:http://www.chaojiying.com/
    • 图鉴:http://ttshitu.com/
    • 两个网站可自行注册、充值
  • 这里以图鉴为例进行测试

  • 打开网址,登录账号 —— 开发文档

    • 在这里插入图片描述

    • 此页面可以先了解一下API如何使用

  • 点击左侧 Python 进入python调用API示例

    • 在这里插入图片描述
  • 复制代码,稍作修改就可以直接用了

    import base64
    import json
    import requests# uname     # 用户名
    # pwd       # 密码
    # img       # 图片地址
    # typeid    # 识别类型
    def base64_api(uname, pwd, img, typeid):with open(img, 'rb') as f:base64_data = base64.b64encode(f.read())b64 = base64_data.decode()data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)if result['success']:return result["data"]["result"]else:# 注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别return result["message"]return ""
    
  • 测试API

    import base64
    import json
    import requestsurl = 'http://www.woaidu.cc/code.php?0.056086518443781985'my_headers = {"accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","host": "www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/login.php","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }resp = requests.get(url, headers=my_headers)with open('code.png', 'wb') as f:f.write(resp.content)def base64_api(uname, pwd, img, typeid):"""通过api接口识别图片中的验证码:param uname: 用户名:param pwd: 密码:param img: 图片地址:param typeid: 识别类型:return:"""# base64.b64encode() 对图片进行base64编码with open(img, 'rb') as f:base64_data = base64.b64encode(f.read())b64 = base64_data.decode()data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)if result['success']:return result["data"]["result"]else:# 注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别return result["message"]return ""result = base64_api('你的账号', '账号密码', '图片地址', 1001)
    print(result)
    

登录

  • 验证码可以获取到了,那么可以使用代码进行登录了
    import base64
    import jsonimport requests
    import ddddocrcode_url = 'http://www.woaidu.cc/code.php?0.056086518443781985'my_headers = {"accept": "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8","accept-encoding": "gzip, deflate","accept-language": "zh-CN,zh;q=0.9","cache-control": "no-cache","connection": "keep-alive","host": "www.woaidu.cc","pragma": "no-cache","referer": "http://www.woaidu.cc/login.php","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
    }# 创建session对象
    session = requests.session()# 给session对象设置头信息
    session.headers = my_headers# 使用session发送请求,获取验证码图片
    code_resp = session.get(code_url)
    # 保存验证码图片
    with open('code.jpg', 'wb') as f:f.write(code_resp.content)# 方法一:使用第三方API识别验证码
    def base64_api(uname, pwd, img, typeid):"""通过api接口识别图片中的验证码:param uname: 用户名:param pwd: 密码:param img: 图片地址:param typeid: 识别类型:return:"""# base64.b64encode() 对图片进行base64编码with open(img, 'rb') as f:base64_data = base64.b64encode(f.read())b64 = base64_data.decode()data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)if result['success']:return result["data"]["result"]else:# 注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别return result["message"]return ""# 调用函数,获取验证码
    yzm = base64_api('图鉴网账号', '密码', './code.jpg', 1)# # 方法二:使用ddddocr库识别验证码
    # ocr = ddddocr.DdddOcr(show_ad=False)
    # with open('code.jpg', 'rb') as f:
    #     img_bytes = f.read()
    #
    # yzm = ocr.classification(img_bytes)# 发送post请求,登录,需要携带验证码
    login_url = 'http://www.woaidu.cc/login.php'
    login_data = {"LoginForm[username]": "我爱读电子书网账号","LoginForm[password]": "密码","LoginForm[captcha]": yzm,"action": "login","submit": "登  录"
    }# 目的是为了将登录后的cookie信息保存到session对象中
    resp = session.post(login_url, data=login_data)# 登录成功后,访问个人中心(书架)
    shujia_url = 'http://www.woaidu.cc/bookcase.php'
    shujia_content = session.get(shujia_url)
    print(shujia_content.text)
    

总结

  • 首先查看登录时发送的请求中,请求头中cookie信息
  • 查找cookie信息的来源(通过哪个请求的响应携带回来的)
    • 这个案例中,登录请求的cookie信息是通过验证码请求返回携带的
    • 但有些网站并不是,所以每个网站可能都不同,需要具体跟踪分析
  • 通过session对象发送请求,获取验证码图片,并自动保存cookie信息
  • 识别验证码图片,获取验证码
  • 登录账号、密码、验证码等创建post请求参数
  • 使用保存了cookie信息的session对象向登录页面发送post请求
  • 登录成功之后,session对象会自动保存用户信息到cookie中
  • 最后,使用携带了用户信息cookie的session对象向书架发送get请求

相关文章:

【Python爬虫系列】_016.关于登录和验证码

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…...

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件,打开双目标定app。 点击add images,弹出加载图像的窗口,分别导入左图和右图,设置黑白格长度(标定板的长度一般为20)。 点击确定,弹出加载…...

RabbitMQ高级篇,进阶内容

强烈建议在看本篇博客之前快速浏览文章:RabbitMQ基础有这一篇就够了 RabbitMQ高级篇 0. 前言1. 发送者的可靠性1.1 生产者重试机制1.2 生产者确认机制1.3 实现生产者确认 2. MQ的可靠性2.1 MQ持久化2.2 LazyQueue 3. 消费者的可靠性3.1 消费者确认机制3.2 失败重试策…...

STM32重定义printf,实现串口打印

在“usart.c”文件中加入以下代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endifPUTCHAR_PROTOTYPE{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch; }…...

项目进度

变为负进度了,还是要用baseservlet,我就又重新写了一部分,看了好几遍视频,突然就想明白了,感觉每次要上课,就时间不连续思路总是断,今天晚自习算是搞懂了怎么写了,就是代码有点多&am…...

Android的内核

Android的内核是基于Linux的长期支持版本的“Android通用内核(ACK)”。 Android作为一个广泛使用的操作系统,其根基在于内核的设计和功能。下面将深入探讨Android内核的各个方面,从其基本结构到与Linux内核的关系,再到内核的版本管理及在设备…...

Github Wiki 超链接 转 码云Gitee Wiki 超链接

Github Wiki 超链接 转 码云Gitee Wiki 超链接 Github 是 :[[相对路径]] Gitee 是 :[链接文字](./相对路径) 查找:\[\[(.*?)\]\] 替换:[$1]\(./$1\) 或替换:**[$1]\(./$1\)** (码云的超链接,很…...

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…...

wpf触发与模板的使用示例:批量生产工具

批量生产工具 <Window x:Class"WpfM20UpdateFW.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expressio…...

brew install node提示:Error: No such keg: /usr/local/Cellar/node

打开本地文件发现Cellar目录下无法生成 node文件&#xff0c;应该是下载时出现问题&#xff0c;重复下载无法解决问题&#xff0c;只能重新安装brew。 步骤1&#xff08;安装 brew&#xff09;&#xff1a; /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/ra…...

记录一下gitlab社区版的安装教程

目录 1.更新系统软件包 2.安装必要的依赖 3.添加GitLab源 3.1对于GitLab Enterprise Edition&#xff08;EE&#xff09;&#xff1a; 3.2对于GitLab Community Edition&#xff08;CE&#xff09;&#xff1a; 4.安装GitLab 4.1安装GitLab Enterprise Edition&#xff08;E…...

20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?

在MyBatis中处理多表关联查询是一项常见的需求&#xff0c;特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询&#xff0c;常见的实现方式包括使用<association>和<collection>标签在<resultMap>中进行对象关系映射&…...

【百日算法计划】:每日一题,见证成长(013)

题目 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 思路 找到中间节点反转后半部分链表前后链表顺序比…...

PCL 读取和保存点云

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 1.1原理 PCL (Point Cloud Library) 是…...

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中&#xff0c;遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法&#xff0c…...

微信小程序-formData使用

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 一、介绍 在小程序中使用formdata上传数据&#xff0c;可实现多文件上传 跟浏览器中的FormData对象类…...

潜在语义分析(Latent Semantic Analysis,LSA)—无监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习

定义 输入: X [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋮ ⋮ x m 1 x m 2 ⋯ x m n ] , 文本集合 D { d 1 , d 2 , ⋯ , d n } , 单词集合 W { ω 1 , ω 2 , ⋯ , ω m } , x i j : 单词 ω i 在文本 d j 中出现的频数或权值 X\left[ \begin{array}{cccc} x_{11} …...

【安全漏洞】MySQL 8.0.33 、CVE-2023-22102

mysql-connector-java:jar:8.0.33已经重新定位到mysql-connector-j:jar:8.0.33 安全漏洞描述 在SBOM扫描过程中&#xff0c;检测到mysql-connector-j:8.0.33存在如下高危安全漏洞&#xff1a; CVE-2023-22102&#xff1a;Oracle MySQL Connectors 8.1.0 版本之前存在安全漏洞&…...

Flutter 响应式框架

一、简介 响应式框架会自动使用户界面适应不同的屏幕大小。创建你的用户界面一次&#xff0c;让它显示完美的像素在移动&#xff0c;平板电脑和桌面&#xff01; 1.1 问题 支持多种显示尺寸通常意味着要多次重新创建同一布局。在传统的Bootstrap方法下&#xff0c;构建响应式…...

电脑AE特效软件 After Effects软件2017中文版下载安装指南 (Win/Mac)

电脑ae特效软件 After Effects软件2017中文版下载安装win/... 电脑AE特效软件 After Effects软件2017中文版下载安装指南 (Win/Mac) Adobe After Effects 2017 是一款功能强大的视频后期处理软件&#xff0c;广泛应用于影视特效制作、动态图形设计、视觉效果合成等领域。其丰…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...