Python爬虫第7节-requests库的高级用法

news2025/4/12 15:02:19

目录

前言

一、文件上传

二、Cookies

三、会话维持

四、SSL证书验证

五、代理设置

六、超时设置

七、身份认证

八、Prepared Request


前言

        上一节,我们认识了requests库的基本用法,像发起GET、POST请求,以及了解Response对象是什么。这一节,咱们接着讲讲requests库的一些高级用法,比如怎么上传文件,如何设置Cookies和代理 。 

一、文件上传

        用requests,不光能模拟提交普通数据,实现文件上传也不在话下,而且操作起来很容易。 

示例代码如下:

import requests
files = {'file': open('favicon.ico', 'rb')}
r = requests.post("http://httpbin.org/post", files=files)
print(r.text)

        要是之前保存过favicon.ico文件,这段代码就能拿它模拟文件上传。其中 httpbin.org 是一个基于 Python 和 Flask 开发的 HTTP 请求与响应服务网站。得注意,favicon.ico得和运行的脚本放在同一个文件夹里。要是想用其他文件模拟,改改代码就行。 

运行上述代码,得到类似如下结果:

{
  "args": {},
  "data": "",
  "files": {
    "file": "data:application/octet-stream;base64,AAABAAEAgIAAAAAAIAAoCAEA......
  },
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "67793",
    "Content-Type": "multipart/form-data; boundary=80503f6283733c2f23804bb45111c889",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.31.0",
    "X-Amzn-Trace-Id": "Root=1-67f481ae-65a8a7c32119664b07375e48"
  },
  "json": null,
  "origin": "14.18.236.76",
  "url": "http://httpbin.org/post"
}

        上面展示的结果,省略了一些内容。网站给出的响应里有files字段,form字段却是空的。这就说明,在文件上传时,会通过专门的files字段来标记上传的文件。

二、Cookies

        以前用urllib处理Cookies,代码写起来挺麻烦。但requests不一样,获取和设置Cookies简单多了,操作一步就能搞定。下面通过实例,看看怎么用requests获取Cookies: 

import requests
r = requests.get("https://www.baidu.com")
print(r.cookies)
for key, value in r.cookies.items():
    print(key + '=' + value)

运行代码,结果如下:

<RequestsCookieJar[<Cookie BD0RZ=27315 for .baidu.com/>, <Cookie bsi=135335943568134141940014NN20303C0FNNNforw.baidu.com/>]>
BDORZ=27315
bsi=135335943568134141940014NN2030302FNNNO

        先调用cookies属性,就能得到Cookies,它的数据类型是RequestCookieJar。然后用items()方法把它转成由元组组成的列表,一个个遍历输出每个Cookie的名称和值,这样就完成了Cookie的遍历解析。 

        用Cookie能维持登录状态。就拿知乎来说,登录知乎后,把Headers里的Cookie内容复制出来(也可以换成你自己的Cookie),设置到Headers里再发送请求,下面是示例代码:

cookie = "_zap=5852a467-84d5-48cd-b719-20cd08603c31; d_c0=a9CTVTvcRBqPTm6b5PunENpMjXLxX-7IGgk=|1744077733; captcha_session_v2=2|1:0|10:1744077734|18:captcha_session_v2|88:QkNNRGpaLzFMQ3NncGFVRXIxb1pSTXZlb3Axb3pCaGNibzlPRFI4cHhEUlpsU3ZyVUF5b0xGL2haSE1oS0xlZw==|d22291e8cfbad9e62e3ecf5b5879bd681e0dc56a87772f4b0a1bd674bfb6dc53; __snaker__id=1aUlWy7fvUjwSn3n; gdxidpyhxdE=%2BtQHnNHABo%2BnC7cQZNp5uprsnqVoGdyWn2QbuZGkZQ4K0Nio4pOnXNCRdPPZGh%2BOAJ8CYYhNxL%2B9bl%5CMngU%5Cb16zCg3nm9eIK%5C6dD0g%2BwE6q%2BUlwgi0dAj6TOMH5%2FqRH%5CYay%2BezxLU01dKTr4k9QPsXGtdRZ%2BkD6xU%5CxS6RKyHTSXxlh%3A1744078635509; q_c1=6573efe200e34e6e9cb0469042bfafde|1744077773000|1744077773000; z_c0=2|1:0|10:1744077775|4:z_c0|92:Mi4xUHZCWVJnQUFBQUJyMEpOVk85eEVHaGNBQUFCZ0FsVk56ZEhoYUFCU1V6WFFiOURmc3VsUnoyd0NtYUdYdTl6N1dB|29591bd5fc696067e49e9509e5fac6fd4663498734ece22be113ccb401123931; _xsrf=ee0ea1ed-31f9-45ab-a923-fc97da5d7663; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1744077734,1744104477; HMACCOUNT=29A6B844A9199C82; SESSIONID=alwM2PqMj7oxC3sRO72GFRwFMAnqV5ntSfBTuVLEheH; JOID=UV0WC0NgDf9xcWbsRRC3LEFGsaVfB2eDPEgwmwMBPJYCMl6ZEX3sAB18ZuFOibPgrBwBunupBMfuYiuxq0TeVS8=; osd=UVoSBkxgCvt8fmbrQR24LEZCvKpfAGOOM0g3nw4OPJEGP1GZFnnhDx17YuxBibTkoRMBvX-kC8fpZia-q0PaWCA=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1744104666; tst=v; BEC=8b4a1b0a664dd5d88434ef53342ae417; unlock_ticket=AOBXjeH6uhYXAAAAYAJVTeLz9Gd8qlW4_xKazEBGBzAktCSlnf9y0w=="
import requests

headers = {
    'Cookie': cookie,
    'Host': 'www.zhihu.com',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac 0sX10 11 4)AppleWebKit/537.36(KHTML, like Gecko)Chrome/53.0.2785.116 Safari/537.36'
}
r = requests.get('https://www.zhihu.com/zvideo', headers=headers)
print(r.text)

        程序运行后,得到的结果里有登录后的页面内容,这就说明成功登录了。

        除了前面的方法,我们还能通过cookies参数来设置Cookie。不过,这种方式得先构造RequestsCookieJar对象,还要对获取到的cookies进行分割,操作相对麻烦。下面来看示例: 

import requests
cookie = "_zap=5852a467-84d5-48cd-b719-20cd08603c31; d_c0=a9CTVTvcRBqPTm6b5PunENpMjXLxX-7IGgk=|1744077733; captcha_session_v2=2|1:0|10:1744077734|18:captcha_session_v2|88:QkNNRGpaLzFMQ3NncGFVRXIxb1pSTXZlb3Axb3pCaGNibzlPRFI4cHhEUlpsU3ZyVUF5b0xGL2haSE1oS0xlZw==|d22291e8cfbad9e62e3ecf5b5879bd681e0dc56a87772f4b0a1bd674bfb6dc53; __snaker__id=1aUlWy7fvUjwSn3n; gdxidpyhxdE=%2BtQHnNHABo%2BnC7cQZNp5uprsnqVoGdyWn2QbuZGkZQ4K0Nio4pOnXNCRdPPZGh%2BOAJ8CYYhNxL%2B9bl%5CMngU%5Cb16zCg3nm9eIK%5C6dD0g%2BwE6q%2BUlwgi0dAj6TOMH5%2FqRH%5CYay%2BezxLU01dKTr4k9QPsXGtdRZ%2BkD6xU%5CxS6RKyHTSXxlh%3A1744078635509; q_c1=6573efe200e34e6e9cb0469042bfafde|1744077773000|1744077773000; z_c0=2|1:0|10:1744077775|4:z_c0|92:Mi4xUHZCWVJnQUFBQUJyMEpOVk85eEVHaGNBQUFCZ0FsVk56ZEhoYUFCU1V6WFFiOURmc3VsUnoyd0NtYUdYdTl6N1dB|29591bd5fc696067e49e9509e5fac6fd4663498734ece22be113ccb401123931; _xsrf=ee0ea1ed-31f9-45ab-a923-fc97da5d7663; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1744077734,1744104477; HMACCOUNT=29A6B844A9199C82; SESSIONID=alwM2PqMj7oxC3sRO72GFRwFMAnqV5ntSfBTuVLEheH; JOID=UV0WC0NgDf9xcWbsRRC3LEFGsaVfB2eDPEgwmwMBPJYCMl6ZEX3sAB18ZuFOibPgrBwBunupBMfuYiuxq0TeVS8=; osd=UVoSBkxgCvt8fmbrQR24LEZCvKpfAGOOM0g3nw4OPJEGP1GZFnnhDx17YuxBibTkoRMBvX-kC8fpZia-q0PaWCA=; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1744104666; tst=v; BEC=8b4a1b0a664dd5d88434ef53342ae417; unlock_ticket=AOBXjeH6uhYXAAAAYAJVTeLz9Gd8qlW4_xKazEBGBzAktCSlnf9y0w=="
cookies = cookie
jar = requests.cookies.RequestsCookieJar()
headers = {
    'Host': 'www.zhihu.com',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac 0sX10 11 4)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/53.0.2785.116 afari/537.36'
}
for cookie in cookies.split(';'):
    key, value = cookie.split('=', 1)
    jar.set(key, value)
r = requests.get("http://www.zhihu.com", cookies=jar, headers=headers)
print(r.text)

        首先,创建一个RequestsCookieJar对象。接着,把复制来的cookies进行分割,利用set()方法,为每个Cookie设置好对应的key和value。之后,调用requests库的get()方法,将处理好的cookies作为参数传入。由于知乎网站自身的访问规则限制,headers参数是必须设置的,但不用在headers里再单独设置cookie字段。经过测试,用这种方法同样能顺利登录知乎。 

三、会话维持

        当我们用requests的get()或者post()方法模拟网页请求时,每次请求就相当于开启了一个新会话,这就好比用两个不同的浏览器打开不同页面。举个例子,假如我们先用post()方法登录网站,接着用get()方法去请求个人信息页面,这两次请求就像是在两个独立的浏览器中操作,所以没办法成功获取个人信息。

         有的朋友可能会想,通过设置相同的cookies能不能解决这个问题呢?确实可以,不过操作起来特别麻烦。其实,更好的办法是维持同一会话,这就像在同一个浏览器里打开新的选项卡一样。要实现这一点,我们可以借助Session对象。Session对象使用起来很方便,它不仅能维护会话,还能自动帮我们处理cookies相关问题。下面来看具体示例:

import requests
requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)

        上述代码请求了测试网址http://httpbin.org/cookies/set/number/123456789设置cookie,名称为number,内容是123456789,随后请求http://httpbin.org/cookies获取当前Cookies。运行结果如下:

{
    "cookies": {}
} 

        可见,直接请求无法获取设置的Cookies。使用Session对象再次尝试:

import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

运行结果如下:

{
    "cookies": {
        "number": "123456789"
    }
}

        这下成功获取数据了!从这就能看出,同一会话和不同会话存在明显差别。在实际应用里,Session用得特别多,尤其是模拟登录成功后,进行下一步操作的时候。比如说,模拟在同一个浏览器中,打开同一网站的不同页面。后面专门有章节,会对这部分内容进行详细讲解。 

四、SSL证书验证

        requests带有证书验证功能。当我们发送HTTP请求时,它会对SSL证书进行检查。通过verify参数,就能决定要不要执行这项检查。要是不设置verify参数,它默认是True,也就是会自动验证证书。 

        之前说过,很久以前的12306网站的证书不被官方CA机构认可,访问时就会出现证书验证错误。

下面用requests做个测试: 

import requests
response = requests.get("https://www.12306.cn")
print(response.status_code)

运行结果如下:

requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls process server certificate', 'certificate verify failed')],)")

        程序提示SSLError错误,这说明证书验证没通过。当我们请求HTTPS网站,要是证书验证出了问题,就会弹出这个错误。要是想避开这个错误,把verify参数设为False就行。具体代码如下: 

import requests
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

        运行后会打印出请求成功的状态码,但会报出警告:

/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py:852:InsecureRequestWarning: UnverifiedHTTPS request is being made, Adding certificate verification is strongly advised. See:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warningsInsecureRequestWarning)
200

        可通过设置忽略警告或捕获警告到日志的方式屏蔽该警告。设置忽略警告:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

捕获警告到日志:

import logging
import requests
logging.captureWarnings(True)
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)

        除了上面的方法,我们还能指定本地证书当作客户端证书。这个本地证书,既可以是一个同时包含密钥和证书的文件,也能是一个包含两个文件路径的元组 : 

import requests
response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(response.status_code)

        上面这些代码只是用来演示的。在实际使用的时候,你得有crt和key这两个文件,并且要把它们的正确路径指出来。还有一点要注意,本地私有证书的key必须处于解密状态,要是key是加密状态,程序不支持。 

五、代理设置

        测试某些网站时,少量请求能正常获取内容,但大规模爬取时,频繁请求可能导致网站弹出验证码、跳转到登录认证页面,甚至封禁客户端IP。为避免这种情况,需设置代理,可通过proxies参数实现,示例如下:

import requests
proxies = {
    "http": "http://10.10.1.10:3128",
    "https": "http://10.10.1.10:1080"
}
requests.get("https://www.taobao.com", proxies=proxies)

        上述代理可能无效,需替换为有效代理进行试验。若代理需要使用HTTP Basic Auth,可使用类似http://user:password@host:port的语法设置代理,示例如下:

import requests
proxies = {
    "http": "http://user:password@10.10.1.10:3128/"
}
requests.get("https://www.taobao.com", proxies=proxies)

        除基本的HTTP代理外,requests还支持SOCKS协议的代理。使用前需安装socks库:

pip3 install 'requests[socks]'

        安装后即可使用SOCKS协议代理,示例如下:

import requests
proxies = {
    'http':'socks5://user:password@host:port',
    'https':'socks5://user:password@host:port'
}
requests.get("https://www.taobao.com", proxies=proxies)

六、超时设置

        要是你自己电脑的网络不好,或者服务器那边响应特别慢,甚至压根没反应,那你可能要等很久才能收到响应,弄不好最后还会报错。为了避免一直傻等,我们可以设定一个超时时间。意思就是,过了这个时间还没收到服务器的回应,程序就报错。这可以通过timeout参数来设置,例子如下: 

import requests
r = requests.get("https://www.taobao.com", timeout =1)
print(r.status_code)

        上面代码里把超时时间设成了1秒,要是1秒内没收到响应,就会抛出异常。请求其实分两个阶段,一个是连接服务器(connect),另一个是读取数据(read)。刚才设置的timeout是这两个阶段加起来的总超时时间。要是你想分别给这两个阶段设置超时时间,可以传一个元组进去: 

r = requests.get('https://www.taobao.com', timeout=(5, 11.30))

        若想永久等待,可将timeout设置为None,或不设置(默认值为None),用法如下:

r = requests.get('https://www.taobao.com', timeout=None)

        或直接不加参数:

r = requests.get('https://www.taobao.com')

七、身份认证


        访问网站时可能遇到认证页面,requests自带身份认证功能,示例如下:

import requests
from requests.auth import HTTPBasicAuth
r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
print(r.status_code)


        若用户名和密码正确,请求时自动认证成功,返回200状态码;若认证失败,返回401状态码。直接传递HTTPBasicAuth类作为参数较繁琐,requests提供了更简便的写法,直接传一个元组,它会默认使用HTTPBasicAuth类进行认证,代码可简写为:

import requests
r = requests.get('http://localhost:5000', auth=('username', 'password'))
print(r.status_code)

        此外,requests还提供其他认证方式,如OAuth认证。使用OAuth认证需安装oauth包,安装命令如下:

pip3 install requests_oauthlib

        使用OAuth1认证的方法如下:

import requests
from requests_oauthlib import OAuth1
url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET', 'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
requests.get(url, auth=auth)

        更多详细功能可参考requests_oauthlib的官方文档https://requests-oauthlib.readthedocs.org/。

八、Prepared Request

        在介绍urllib时,可将请求表示为数据结构,各参数通过一个对象表示。requests中也有类似功能,对应的数据结构是Prepared Request。示例如下:

from requests import Request, Session
url = "http://httpbin.org/post"
data = {'name': 'germey'}
headers = {
    'User-Agent': 'Mozilla/5.0(Macintosh; Intel Mac0sX10 11 4)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/53.0.2785.116 Safari/537.36'
}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)

        引入Request后,用url、data和headers参数构造Request对象,再调用Session的prepare_request()方法将其转换为Prepared Request对象,最后调用send()方法发送请求。运行结果如下:

{
    "args": {},
    "data": "",
    "files": {},
    "form": {
        "name": "germey"
    },
    "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Connection": "close",
        "Content-Length": "11",
        "Content-Type": "application/x-www-form-urlencoded",
        "Host": "httpbin.org",
        "User-Agent": "Mozilla/5.0(Macintosh; Intel Mac 0sX10 11 4)AppleWebKit/537.36 (KHTML, like Gecko)Chrome/53.0.2785.116 Safari/537.36"
    },
    "json": null,
    "origin": "182.32.203.166",
    "url": "http://httpbin.org/post"
}

        从结果能看出,我们通过这种方式实现了和普通POST请求一样的效果。有了Request对象后,我们可以把每个请求当成一个独立个体。这在进行队列调度时特别方便,后续我们会利用它来构建一个Request队列。 

        这一节给大家介绍了requests的一些高级用法,在后面实际项目中,这些用法会经常用到,大家要熟练掌握。要是还想了解更多requests的用法,可以查看它的官方文档:http://docs.python-requests.org/ 。 

参考学习书籍:Python 3网络爬虫开发实战

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

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

相关文章

Maven的安装配置-项目管理工具

各位看官&#xff0c;大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习&#xff1a;Maven的安装配置-项目管理工具 目录 1.什么是Maven&#xff1f;Maven用来干什么的&#xff1f…

智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月

&#x1f4cc; 更新速览 本月更新包含 21项功能增强 和 9项问题修复&#xff0c;重点提升SQL解析精度与优化建议覆盖率。 一、SQL解析能力扩展 ✨ 新增SQL语法解析支持 SELECT...INTO TABLE 语法解析&#xff08;3/26&#xff09; ALTER INDEX RENAME/VISIBLE 语句解析&#…

Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程

Ubuntu虚拟机的安装过程可以查看另一篇文章&#xff1a;VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程-CSDN博客 目前我们已经下载好了OpenCV&#xff0c;这里以OpenCV4.5.2为例。 在内存要求尽可能小的情况下&#xff0c;可以尝试只编译安装代码中使用到的OpenC…

spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解

ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解&#xff0c;用于将方法返回的对象直接序列化为 HTTP 响应体&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通过视图解析器渲染为视图&#xff08;如 HTML&…

skynet.rawcall使用详解及应用场景

目录 核心特性函数原型使用场景场景 1&#xff1a;高性能二进制传输&#xff08;如文件转发&#xff09;场景 2&#xff1a;自定义序列化协议&#xff08;如 Protocol Buffers&#xff09;场景 3&#xff1a;跨服务共享内存&#xff08;避免拷贝&#xff09; 配套接收方实现与 …

使用SpringSecurity下,发生重定向异常

使用SpringSecurity下&#xff0c;发生空转异常 环境信息&#xff1a; Spring Boot 3.4.4 &#xff0c; jdk 17 &#xff0c; springSecurity 6.4.4 问题背景&#xff1a; 没有自定义controller &#xff0c;改写了login 页面&#xff0c;并且进行了成功后的跳转处理&#xf…

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…

LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南

由于之前DDR的系列选型文章有很好的反馈&#xff0c;所以补充LPDDR4低功耗内存的选型和命名规则&#xff0c;总结了目前市面上常用的内存&#xff0c;供硬件工程师及数码爱好者参考。 在智能手机、平板电脑和低功耗设备中&#xff0c;LPDDR4 SDRAM凭借其高带宽、低功耗特性成为…

【杂谈】Godot4.4导出到Android平台(正式导出)

学博而后可约&#xff0c;事历而后知要。 目录 一、准备二、Gradle构建三、配置Java SDK四、配置Android SDK五、配置密钥 一、准备 本文在前文【杂谈】Godot4.4导出到安卓平台&#xff08;调试导出&#xff09;的基础上&#xff0c;进行正式导出。调试导出并不是真正的编译导…

基于AI设计开发出来的业务系统是什么样的?没有菜单?没有表格?

基于AI设计开发出的业务系统仍然会包含菜单、表格等传统UI元素&#xff0c;但AI技术会显著改变它们的实现方式和交互逻辑。以下是具体分析&#xff1a; 一、传统元素的持续存在 功能刚需性 • 菜单承担着系统导航的核心功能&#xff0c;表格则是结构化数据展示的基础载体。根…

数字足迹管理(DFM):你的网络隐身指南

数字足迹管理&#xff08;DFM&#xff09;&#xff1a;你的网络隐身指南 ‌你可能不知道&#xff0c;你的姓名、电话、住址正在网上被“明码标价”‌ ——而这一切&#xff0c;可能只是因为你点过外卖、寄过快递&#xff0c;甚至注册过一个网站。 一、什么是数字足迹管理&#…

如何避免“过度承诺”导致的验收失败

如何避免“过度承诺”导致的验收失败&#xff1f;关键在于&#xff1a; 评估可行性、设置合理目标、高频沟通反馈、阶段性验收、做好风险管理。其中设置合理目标至关重要&#xff0c;很多团队往往在项目初期为迎合客户或领导而报出“最理想方案”&#xff0c;忽略了资源、技术及…

紧跟数字人热潮:123 数字人分身克隆系统源码部署与风口洞察

在当今数字化浪潮中&#xff0c;数字人技术无疑已成为最具活力与潜力的领域之一&#xff0c;正以迅猛之势席卷多个行业&#xff0c;重塑着人们的交互方式与商业运作模式。C 站作为技术交流的前沿阵地&#xff0c;汇聚了众多关注前沿科技的开发者与技术爱好者&#xff0c;今天来…

QT控件 修改QtTreePropertyBrowser自定义属性编辑器源码,添加第一列标题勾选,按钮,右键菜单事件等功能

头阵子遇到一个需要修改QtTreePropertyBrowser控件的需求&#xff0c;QT开发做这么久了&#xff0c;这个控件倒是第一次用&#xff0c;费了点时间研究&#xff0c;在这里做个简单的总结。 QtTreePropertyBrowser控件 是 Qt 解决方案 (Qt Solutions) 中的一个组件&#xff0c;用…

开源模型应用落地-模型上下文协议(MCP)-从数据孤岛到万物互联(一)

一、前言 当开发者还在为每个AI工具编写臃肿的API适配器时&#xff0c;一场关于「连接」的技术革命已悄然降临。模型上下文协议&#xff08;MCP&#xff09;正在用一套全新的交互语法&#xff0c;重新定义人工智能与物理世界的对话方式。MCP协议如同为AI系统装上了“万能接口”…

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据&#xff08;一&#xff09;中&#xff0c;介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识&#xff0c;本文通过分析具体合约代码进行…

mac 苍穹外卖 后端初始 SkyApplication 报错

报错内容 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid deepseek 解决 打开 File > Project Structure > Project SDK, 选择 JDK17。我没有 JDK17就下载了一…

Proximal Policy Optimization (PPO)

2.1 策略梯度方法 策略梯度方法计算策略梯度的估计值并将其插入到随机梯度上升算法中。最常用的梯度估计器的形式如下&#xff1a; g ^ E t [ ∇ θ log ⁡ π θ ( a t ∣ s t ) A ^ t ] (1) \hat{g} \mathbb{E}_t \left[ \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \h…

微信小程序:动态表格实现,表头单元格数据完全从data中获取,宽度自定义,自定义文本框,行勾选,样式效果,横向滚动表格(解决背景色不足的问题)等

一、样式效果 二、代码 1、wxml <view class"line flex flex-center"><view class"none" wx:if"{{info.length 0}}">暂无料号</view><view wx:else class"table-container"><!-- 动态生成表头 -->&…