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

Python爬虫第6节-requests库的基本用法

目录

前言

一、准备工作

二、实例引入

三、GET请求

3.1 基本示例

3.2 抓取网页

3.3 抓取二进制数据

3.4 添加headers

四、POST请求

五、响应


前言

        前面我们学习了urllib的基础使用方法。不过,urllib在实际应用中存在一些不便之处。以网页验证和Cookies处理为例,使用 urllib 时,得编写Opener和Handler才能完成操作。

        为了更轻松地实现这些操作,功能更强大的 requests 库应运而生。利用 requests 库,管理Cookies、进行登录验证,以及设置代理等操作,都能轻松搞定。下面,我们先介绍 requests 库的基本使用方法。

一、准备工作

        在开始使用requests库前,要确保已经正确安装了该库。如果还未安装,可以通过下面命令安装:
- 对于 Python 2:

 pip install requests

- 对于 Python 3(推荐):

pip3 install requests

二、实例引入

        urllib库用urlopen()方法发起GET方式的网页请求。与之对应,requests库提供了get()方法。相比之下,get()这个名字,能让人更直接地明白它用于发起GET请求。 

下面通过实例来看:

import requests
r = requests.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text)
print(r.cookies)

运行结果如下:

<class 'requests.models.Response'>
200
<class 'str'>
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
<RequestsCookieJar[<Cookie BIDUPSID=992C3B26F4C4D09505C5E959D5FBC005 for .baidu.com/>,<Cookie PSTM=1472227535 for .baidu.com/>,<Cookie bs=153047544986095451480040NN20303CO2FNNNO for .www.baidu.com/>,<Cookie BD_NOT_HTTPS=1 for www.baidu.com/>]>

        在这儿,我们通过调用requests库的get()方法,完成了和urllib库中urlopen()一样的操作,得到一个Response对象。紧接着,我们又输出了这个Response对象的类型、状态码,响应体的类型、内容,以及Cookies信息。从运行结果能知道,Response对象的类型是requests.models.Response,响应体是str字符串类型,Cookies是RequestsCookieJar类型。

        用get()方法实现GET请求并不稀奇,requests库更方便的地方在于,用一句话就能实现POST、PUT等其他类型的请求 ,示例如下:

r = requests.post('http://httpbin.org/post')
r = requests.put('http://httpbin.org/put')
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

        这里分别用post()、put()、delete()等方法实现了POST、PUT、DELETE等请求。相比urllib,是不是简单很多?这其实只是requests库强大功能的一小部分。

三、GET请求

        GET请求是HTTP协议里特别常见的一种请求方式。接下来,咱们就深入了解一下,怎么用requests库来发起GET请求。

3.1 基本示例

        第一步,搭建一个最为简单的GET请求,请求的目标链接是http://httpbin.org/get。这个网站能识别客户端发起的请求类型,要是检测到是GET请求,就会把对应的请求信息返回过来。

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

运行结果如下:

{"args": {},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Host": "httpbin.org","User-Agent": "python-requests/2.10.0"},"origin": "122.4.215.33","url": "http://httpbin.org/get"
}

        从结果能看出,我们顺利发起了GET请求,返回内容里有请求头、URL、IP等信息。那么,当发起GET请求,需要添加额外信息时,通常该怎么做呢?举个例子,现在要添加两个参数,一个是name,值为germey,另一个是age,值为22 。 

        要构造这个请求链接,是不是直接写成:

r = requests.get('http://httpbin.org/get?name=germey&age=22')

        这样做可行,但不够人性化。一般情况下,这类信息数据会用字典来存储。那么,该如何构造链接呢?利用params参数就可以,示例如下:

import requests
data = {'name': 'germey','age': 22
}
r = requests.get("http://httpbin.org/get", params=data)
print(r.text)

运行结果如下:

{"args": {"age": "22","name": "germey"},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Host": "httpbin.org","User-Agent": "python-requests/2.10.0"},"origin": "122.4.215.33","url": "http://httpbin.org/get?age=22&name=germey"
}

        运行程序后能发现,请求链接自动生成了,就是http://httpbin.org/get?age=22&name=germey。另外,网页返回内容的数据类型是str,不过它遵循JSON格式规范。所以,要是想把返回结果解析成字典格式,直接调用json()方法就能实现。 

示例如下:

import requests
r = requests.get("http://httpbin.org/get")
print(type(r.text))
print(r.json())
print(type(r.json()))

运行结果如下:

<class 'str'>
{
    "headers": {
        "Accept-Encoding": "gzip, deflate",
        "Accept": "*/*",
        "Host": "httpbin.org",
        "User-Agent": "python-requests/2.10.0"
    },
    "url": "http://httpbin.org/get",
    "args": {},
    "origin": "182.33.248.131"
}
<class 'dict'>

        可以发现,调用json()方法,能将返回结果为JSON格式的字符串转化为字典。但需要注意,如果返回结果不是JSON格式,就会出现解析错误,抛出json.decoder.JSONDecodeError异常。

3.2 抓取网页

        上面请求的链接,返回内容是JSON格式字符串。既然如此,请求普通网页时,自然也能获取到对应内容。下面,我们以知乎的“发现”页面为例展开说明: 

import requests
import re
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
r = requests.get("https://www.zhihu.com/explore", headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
titles = re.findall(pattern, r.text)
print(titles)

        这里,我们在请求中添加了headers信息,里面有User - Agent字段,这个字段用来标识浏览器。要是不加上这一项,知乎就不让我们抓取页面内容。之后,我们用最基础的正则表达式,把页面上所有问题内容匹配出来了。正则表达式的知识,我们会在后面深入讲解,这里先借助这个实例,给大家做个初步介绍 。 


运行结果如下:

['\n为什么很多人喜欢提及「拉丁语系」这个词?\n', '\n在没有水的情况下水系宝可梦如何战斗?\n', '\n有哪些经验可以送给 Kindle 新人?\n', '\n谷歌的广告业务是如何赚钱的?\n', "\n程序员该学习什么,能在上学期间挣钱?\n", '\n有哪些原本只是一个小消息,但回看发现是个惊天大新闻的例子?\n', "\n如何评价今敏?\n", '\n源氏是怎么把那么长的刀从背后拔出来的?\n', "\n年轻时得了绝症或大病是怎样的感受?\n", "\n年轻时得了绝症或大病是怎样的感受?\n"]

        我们发现,这里成功提取出了所有的问题内容。


3.3 抓取二进制数据

        上面例子里,我们抓取了知乎的一个页面,得到的是HTML文档。那要是想抓取图片、音频、视频这类文件,该怎么做呢?图片、音频、视频这些文件,本质都是二进制码。因为它们有特定保存格式,配合对应的解析方法,我们才能看到这些丰富多彩的多媒体内容。所以,要抓取这些文件,就得获取它们的二进制码 。 

        下面以GitHub的站点图标为例来看:

import requests
r = requests.get("https://github.com/favicon.ico")
print(r.text)
print(r.content)

        这次抓取的是站点图标,就是浏览器每个标签上显示的小图标。我们打印了Response对象的text和content这两个属性。运行程序后,前两行显示的是r.text的结果,最后一行是r.content的结果。能看到,r.text结果出现乱码,r.content结果前面有个b,这表明它是bytes类型数据。因为图片属于二进制数据,r.text打印时会把图片数据转成str类型,相当于直接将图片转为字符串,乱码也就不可避免了。 

        接着,我们将刚才提取到的图片保存下来:

import requests
r = requests.get("https://github.com/favicon.ico")
with open('favicon.ico', 'wb') as f:f.write(r.content)

        这里用到了open()方法。使用它的时候,第一个参数要设定为文件名称,第二个参数表示以二进制写入模式打开文件,这样就能往文件里写入二进制数据。程序运行完毕,会发现在文件夹里多了一个名为favicon.ico的图标。同样道理,获取音频和视频文件,也能采用这种方法。 

3.4 添加headers

和urllib.request一样,requests也能借助headers参数来传递请求头信息。就拿上面抓取知乎页面的例子来说,如果不设置headers参数传递请求头信息,就无法正常发起请求。

import requests
r = requests.get("https://www.zhihu.com/explore")
print(r.text)

运行结果如下:

<html><body><h1>500 Server Error</h1>An internal server error occured.</body></html>

但如果加上headers并添加User-Agent信息,就没问题了:

import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
}
r = requests.get("https://www.zhihu.com/explore", headers=headers)
print(r.text)

        当然,我们可以在headers这个参数中任意添加其他的字段信息。

四、POST请求

        前面,我们认识了最基础的GET请求。在HTTP请求里,还有一种常见的请求方式,那就是POST请求。用requests库实现POST请求,操作起来同样不复杂。 

示例如下:

import requests
data = {'name': 'germey', 'age': '22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)

        这里还是请求http://httpbin.org/post,该网站可以判断如果请求是POST方式,就把相关请求信息返回。

运行结果如下:

{"args": {},"data": "","files": {},"form": {"age": "22","name": "germey"},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Content-Length": "18","Content-Type": "application/x-www-form-urlencoded","Host": "httpbin.org","User-Agent": "python-requests/2.10.0"},"json": null,"origin": "182.33.248.131","url": "http://httpbin.org/post"
}

        从结果能看到,我们顺利拿到了返回数据。返回结果里的form部分,正是我们提交的数据,这就说明POST请求成功发送出去了。 

五、响应

        发送请求之后,肯定会得到响应结果。就像上面的例子,我们通过text和content属性,获取到了响应内容。其实,除了这两种,借助其他属性和方法,还能获取更多信息,像状态码、响应头,以及Cookies等内容。 

示例如下:

import requests
r = requests.get('http://www.jianshu.com')
print(type(r.status_code), r.status_code)
print(type(r.headers), r.headers)
print(type(r.cookies), r.cookies)
print(type(r.url), r.url)
print(type(r.history), r.history)

        在这里,通过打印status_code属性,就能得到请求的状态码;打印headers属性,可获取响应头信息;打印cookies属性,能拿到Cookies数据;打印url属性,会显示请求的URL;而打印history属性,就能看到请求历史记录。 

运行结果如下:

<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'X-Runtime': '0.006363', 'Connection': 'keep-alive', 'Content-Type': 'text/html; charset=utf-8', 'X-Content-Type-Options': 'nosniff', 'Date': 'Sat, 27 Aug 2016 17:18:51 GMT', 'Server': 'nginx', 'X-Frame-Options': 'DENY', 'Content-Encoding': 'gzip', 'Vary': 'Accept-Encoding', 'ETag': 'W/"3abda885e0e123bfde06dgb61e696159"', 'X-XSS-Protection': '1;mode-block', 'X-Request-Id': 'a8a3c4d5-f660-422f-8df9-49719ddgb5d4', 'Transfer-Encoding': 'chunked','set-Cookie':'read mode=day; path=/', 'default font=font2; path=/','session id=xxx; path=/; HttpOnly', 'Cache-Control':'max-age=0, private, must-revalidate'}
<class'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie session id=xxx for www.jianshu.com/>, <Cookie default font=font2 for www.jianshu.com/>, <Cookie read mode=day for www.jianshu.com/>]>
<class'str'> http://www.jianshu.com/
<class 'list'> []

        由于session id太长,这里就简写了。从运行结果能看出,通过headers属性获取到的数据类型是CaseInsensitiveDict,通过cookies属性获取到的数据类型则是RequestsCookieJar。

        在判断请求是否成功时,状态码是常用的依据。requests库还内置了一个状态码查询对象,叫requests.codes 。

示例如下:

import requests
r = requests.get('http://www.jianshu.com')
exit() if not r.status_code == requests.codes.ok else print('Request Successfully')

        在这儿,我们把请求的返回码和requests库内置的成功返回码作比较。要是二者匹配,就说明请求正常响应,程序会输出成功请求的消息;要是不匹配,程序就会终止。这里,我们用requests.codes.ok获取到的成功状态码为200。 

        当然,requests.codes里可不只有ok这一个条件码。下面,给大家列出各类返回码以及对应的查询条件。 

# 信息性状态码
100: ('continue',),
101: ('switching protocols',),
102: ('processing',),
103: ('checkpoint',),
122: ('uri too long', "request uri too long"),
# 成功状态码
200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '√'),
201: ('created',),
202: ('accepted',),
203: ('non_authoritative_info', 'non_authoritative_information'),
204: ('no_content',),
205: ('reset_content', 'reset'),
206: ('partial_content', 'partial'),
207: ('multi_status','multiple_status','multi_stati','multiple_stati'),
208: ('already_reported',),
226: ('im_used',),
# 重定向状态码
300: ('multiple_choices',),
301: ('moved_permanently','moved', '\\o-'),
302: ('found',),
303: ('see_other', 'other'),
304: ('not_modified',),
305: ('use_proxy',),
306: ('switch_proxy',),
307: ('temporary_redirect', 'temporary_moved', 'temporary'),
308: ('permanent_redirect','resume_incomplete','resume',),
# 客户端错误状态码
400: ('bad_request', 'bad'),
401: ('unauthorized',),
402: ('payment_required', 'payment'),
403: ('forbidden',),
404: ('not_found', '-0-'),
405: ('method_not_allowed', 'not_allowed'),
406: ('not_acceptable',),
407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
408: ('request_timeout', 'timeout'),
409: ('conflict',),
410: ('gone',),
411: ('length_required',),
412: ('precondition_failed', 'precondition'),
413: ('request_entity_too_large',),
414: ('request_uri_too_large',),
415: ('unsupported_media_type', 'unsupported_media','media_type'),
416: ('requested_range_not_satisfiable','requested_range', 'range_not_satisfiable'),
417: ('expectation_failed',),
418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
421: ('misdirected_request',),
422: ('unprocessable_entity', 'unprocessable'),
423: ('locked',),
424: ('failed_dependency', 'dependency'),
425: ('unordered_collection', 'unordered'),
426: ('upgrade_required', 'upgrade'),
428: ('precondition_required', 'precondition'),
429: ('too_many_requests', 'too_many'),
431: ('header_fields_too_large', 'fields_too_large'),
444: ('no_response', 'none'),
449: ('retry_with','retry'),
450: ('blocked_by_windows_parental_controls', 'parental_controls'),
451: ('unavailable_for_legal_reasons', 'legal_reasons'),
499: ('client_closed_request', 'client_closed_request'),
# 服务端错误状态码
500: ('internal_server_error','server_error', '/o\\', 'X'),
501: ('not_implemented',),
502: ('bad_gateway',),
503: ('service_unavailable', 'unavailable'),
504: ('gateway_timeout',),
505: ('http_version_not_supported', 'http_version'),
506: ('variant_also_negotiates',),
507: ('insufficient_storage',),
509: ('bandwidth_limit_exceeded', 'bandwidth'),
510: ('not_extended',),
511: ('network_authentication_required', 'network_auth', 'network_authentication')

        举个例子,要是你想知道请求结果是不是404状态,就可以用`requests.codes.not_found`去做对比。 

相关文章:

Python爬虫第6节-requests库的基本用法

目录 前言 一、准备工作 二、实例引入 三、GET请求 3.1 基本示例 3.2 抓取网页 3.3 抓取二进制数据 3.4 添加headers 四、POST请求 五、响应 前言 前面我们学习了urllib的基础使用方法。不过&#xff0c;urllib在实际应用中存在一些不便之处。以网页验证和Cookies处理…...

当实体类中的属性名和表中的字段名不一样 ,怎么办

在不同的持久化框架中&#xff0c;当实体类中的属性名和表中的字段名不一致时&#xff0c;有不同的解决办法&#xff0c;下面为你详细介绍&#xff1a; 1. MyBatis MyBatis 是一个流行的持久层框架&#xff0c;有两种主要方式来处理属性名和字段名不一致的情况。 方式一&…...

我用deepseek制作了一份建设项目从立项到验收全流程手册《从蓝图到交付:建设项目全生命周期管理实战手册》

建设项目全流程详解&#xff08;2025年更新版&#xff09; ‌一、立项决策阶段‌ ‌项目建议书编制‌ 明确建设背景、必要性、初步规模及投资估算&#xff0c;形成《项目建议书》报审材料 ‌12 ‌可行性研究深化‌ 完成市场供需分析、技术方案比选、环境影响评估、财务敏感性…...

力扣HOT100之链表:19. 删除链表的倒数第 N 个结点

这道题的思路比较简单&#xff0c;直接定义一个虚拟头节点&#xff0c;然后再定义快慢指针&#xff0c;快慢指针在初始状态下都指向虚拟头节点&#xff0c;然后让快指针先走n步&#xff0c;慢指针停在原地&#xff0c;然后快慢指针同步前进&#xff0c;当快指针fast指向最后一个…...

【Django】教程-11-ajax弹窗实现增删改查

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

大厂算法面试 7 天冲刺:第7天-系统设计与模拟面试实战 —— 架构思维 + Java落地

&#x1f3d7;️ 第7天&#xff1a;系统设计与模拟面试实战 —— 架构思维 Java落地 &#x1f4da; 一、What&#xff1a;系统设计是什么&#xff1f; 系统设计是对一个复杂系统的高可用、高性能、高扩展性架构进行顶层思考和具体实现的过程。 &#x1f527; 涉及核心主题&a…...

面试题汇总06-场景题线上问题排查难点亮点

面试题汇总06-场景题&线上问题排查&难点亮点 【一】场景题【1】订单到期关闭如何实现【2】每天100w次登录请求,4C8G机器如何做JVM调优?(1)问题描述和分析(2)堆内存设置(3)垃圾收集器选择(4)各区大小设置(5)添加必要的日志【3】如果你的业务量突然提升100倍…...

AI训练存储架构革命:存储选型白皮书与万卡集群实战解析

一、引言 在人工智能技术持续高速发展的当下&#xff0c;AI 训练任务对存储系统的依赖愈发关键&#xff0c;而存储系统的选型也变得更为复杂。不同的 AI 训练场景&#xff0c;如机器学习与大模型训练&#xff0c;在模型特性、GPU 使用数量以及数据量带宽等方面的差异&#xff…...

数据结构实验3.1:顺序栈的基本操作与进制转换

文章目录 一&#xff0c;问题描述二&#xff0c;基本要求三&#xff0c;算法分析四&#xff0c;示例代码五&#xff0c;实验操作六&#xff0c;运行效果 一&#xff0c;问题描述 在数据处理中&#xff0c;常常会遇到需要对链接存储的线性表进行操作的情况。本次任务聚焦于将链…...

Docker与VNC的使用

https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc 下载nvc 客户端 https://downloads.realvnc.com/download/file/viewer.files/VNC-Viewer-7.12.0-Windows.exe 服务端 docker pull dorowu/ubuntu-desktop-lxde-vnc#下载成功 docker pull dorowu/ubuntu-desktop-l…...

JGraphT 在 Spring Boot 中的应用实践

1. 引言 1.1 什么是 JGraphT JGraphT 是一个用于处理图数据结构和算法的 Java 库,提供了丰富的图类型和算法实现。 1.2 为什么使用 JGraphT 丰富的图类型:支持简单图、多重图、伪图等多种图类型。强大的算法库:提供最短路径、最小生成树、拓扑排序等多种算法。易于集成:…...

.net6 中实现邮件发送

一、开启邮箱服务 先要开启邮箱的 SMTP 服务&#xff0c;获取授权码&#xff0c;在实现代码发送邮件中充当邮箱密码用。 在邮箱的 设置 > 账号 > POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中&#xff0c;把 SMTP 服务开启&#xff0c;获取授权码。 二、安装库 安装 …...

MySQL 触发器与存储过程:数据库的自动化工厂

在数据世界的工业区&#xff0c;有一座运转高效的自动化工厂&#xff0c;那里的机器人日夜不停地处理数据…这就是 MySQL 的触发器与存储过程系统&#xff0c;它让数据库从"手工作坊"变成了"现代化工厂"… 什么是 MySQL 触发器与存储过程&#xff1f;&…...

计科数据库第二次上机操作--实验二 表的简单查询

一、建数据库和表 1&#xff0e;启动数据库服务软件 Navicat 2&#xff0e;在 Navicat 中建立数据库 test 3. 在test数据库上建立teacher表&#xff1a; 二、基本查询 2.1 从teacher表中分别检索出教师的所有信息 SELECT * FROM teacher WHERE 教工号2000; SELECT * FROM t…...

⭐算法OJ⭐滑动窗口最大值【双端队列(deque)】Sliding Window Maximum

文章目录 双端队列(deque)详解基本特性常用操作1. 构造和初始化2. 元素访问3. 修改操作4. 容量操作 性能特点时间复杂度&#xff1a;空间复杂度&#xff1a; 滑动窗口最大值题目描述方法思路解决代码 双端队列(deque)详解 双端队列(deque&#xff0c;全称double-ended queue)是…...

LeetCode刷题SQL笔记

系列博客目录 文章目录 系列博客目录1.distinct关键字 去除重复2.char_length()3.group by 与 count()连用4.date类型有个函数datediff()5.mod 函数6.join和left join的区别1. **JOIN&#xff08;内连接&#xff0c;INNER JOIN&#xff09;**示例&#xff1a; 2. **LEFT JOIN&a…...

Ubuntu中MATLAB启动图标设置

打开终端&#xff0c;键入 su root 输入root密码 键入&#xff1a;vi /usr/share/applications/Matlab.desktop 打开了一个空白文档&#xff0c;按键“i”&#xff0c;进入编辑模式&#xff0c;键入如下内容&#xff1a; [Desktop Entry] NameMatlabR2017b CommentMatlab R…...

Django分页教程及示例

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 完整代码示例:结论Django的分页模块允许你将大量数据分割成更小的块(页面)。这对于以可管理的方式显示项目列表,如博客文章或产品…...

Ansible的使用

##### Ansible使用环境 - 控制节点 - 安装Ansible软件 - Python环境支持&#xff1a;Python>2.6 - 必要的模块&#xff1a;如PyYAML等 - 被控节点 - 启用SSH服务 - 允许控制节点登录&#xff0c;通常设置免密登录 - Python环境支持 http://www.ansible.com/ …...

JBDC Java数据库连接(1)

目录 JDBC概述 定义 JDBC API 实例 JDBC搭建 建立与数据库连接&#xff1a; 形式&#xff1a; 实例 获得Satement执行sql语句 Satement中的方法: 实例 实例 JDBC概述 定义 JDBC&#xff08;Java DataBase Connectivity&#xff09;java数据库连接是一种用于执行SQL…...

tomcat的负载均衡和会话保持

写你的想写的东西&#xff0c;写在tomcat的默认发布目录中 这里写了一个jsp的文件 访问成功 可以用nginx实现反向代理 tomcat负载均衡实现&#xff1a; 这里使用的算法是根据cookie值进行哈希&#xff0c;根据ip地址哈希会有问题.如果是同一台主机再怎么访问都是同一个ip。 t…...

蓝桥杯 web 新鲜的蔬菜(css3)

思路&#xff1a; 首先将.box容器设置为网格布局 display:grid;同时将网格分成3列3行 然后&#xff1a;通过子选择器或后代选择器选中相应的元素&#xff0c;再通过 grid-area 将其调整到相应的位置 答案&#xff1a; .box {display: grid;grid-template-columns: 1fr 1fr …...

【AI学习】初步了解TRL

TRL&#xff08;Transformer Reinforcement Learning&#xff09; 是由 Hugging Face 开发的一套基于强化学习&#xff08;Reinforcement Learning, RL&#xff09;的训练工具&#xff0c;专门用于优化和微调大规模语言模型&#xff08;如 GPT、LLaMA 等&#xff09;。它结合了…...

2025-04-07 NO.3 Quest3 MR 配置

文章目录 1 MR 介绍1.1 透视1.2 场景理解1.3 空间设置 2 配置 MR 环境2.1 场景配置2.2 MR 配置 3 运行测试 配置环境&#xff1a; Windows 11Unity 6000.0.42f1Meta SDK v74.0.2Quest3 1 MR 介绍 1.1 透视 ​ 透视&#xff08;Passthrough&#xff09;是将应用的背景从虚拟的…...

Kafka在Vue和Spring Boot中的使用实例

Kafka在Vue和Spring Boot中的使用实例 一、项目概述 本项目演示了如何在Vue前端和Spring Boot后端中集成Kafka&#xff0c;实现实时消息的发送和接收&#xff0c;以及数据的实时展示。 后端实现&#xff1a;springboot配置、kafka配置、消息模型和仓库、消息服务和消费者、we…...

层归一化详解及在 Stable Diffusion 中的应用分析

在深度学习中&#xff0c;归一化&#xff08;Normalization&#xff09;技术被广泛用于提升模型训练的稳定性和收敛速度。本文将详细介绍几种常见的归一化方式&#xff0c;并重点分析它们在 Stable Diffusion 模型中的实际使用场景。 一、常见的归一化技术 名称归一化维度应用…...

【C++DFS 马拉车】3327. 判断 DFS 字符串是否是回文串|2454

本文涉及知识点 CDFS 马拉车 LeetCode3327. 判断 DFS 字符串是否是回文串 给你一棵 n 个节点的树&#xff0c;树的根节点为 0 &#xff0c;n 个节点的编号为 0 到 n - 1 。这棵树用一个长度为 n 的数组 parent 表示&#xff0c;其中 parent[i] 是节点 i 的父节点。由于节点 …...

前端开发vue项目(node-modules 可视化神器 Node Modules Inspector)

node-modules 可视化神器 Node Modules Inspector 简介功能特点使用场景实现原理 使用Node Modules Inspector提供 简介 Node Modules Inspector 是一个用于检查和分析 Node.js 项目中模块依赖关系的工具 功能特点 依赖分析&#xff1a;它能够深入剖析 Node.js项目中的模块依…...

25统计建模半自动化辅助排版模板及论文排版格式要求

1.除封面页外&#xff0c;不得在其他页出现学校、参赛队及指导教师的信息。 2.目录应由论文的篇、章、节、条、款以及附录题录等的序号、题名和页码组成。正文页码单独编列&#xff0c;其页码从正文第一页开始编写。 3.标题和正文&#xff1a;论文正文总标题&#xff08;题目…...

武汉迅狐科技:AI赋能企业营销,打造智能获客新范式

在数字化营销竞争日益激烈的今天&#xff0c;武汉迅狐科技有限公司凭借其创新的AI技术和智能营销解决方案&#xff0c;正在帮助企业突破传统获客瓶颈&#xff0c;实现营销效率的指数级提升。作为一家专注于AI获客软件研发的高新技术企业&#xff0c;迅狐科技推出的矩阵系统、数…...

Tomcat:Java Web 应用开发的核心容器

在Java Web开发领域&#xff0c;Apache Tomcat凭借其开源特性、轻量级架构和强大的功能支持&#xff0c;成为开发者部署和运行Servlet、JSP应用的首选容器。作为Apache软件基金会旗下的Jakarta项目成果&#xff0c;Tomcat不仅实现了Java EE&#xff08;现Jakarta EE&#xff09…...

Tomcat 安装与配置:超详细指南

目录 一、安装前的准备工作&#xff08;一&#xff09;配置 JAVA_HOME 环境变量 二、下载 Tomcat&#xff08;一&#xff09;Windows 系统&#xff08;二&#xff09;macOS/Linux 系统 三、安装 Tomcat&#xff08;一&#xff09;Windows 系统&#xff08;二&#xff09;Linux …...

科技快讯 | DeepSeek 公布模型新学习方式;Meta发布开源大模型Llama 4;谷歌推出 Android Auto 14.0 正式版

Meta发布开源大模型Llama 4&#xff0c;首次采用“混合专家架构“ 4月6日&#xff0c;Meta推出开源AI模型Llama 4&#xff0c;包括Scout和Maverick两个版本&#xff0c;具备多模态处理能力。Scout和Maverick参数量分别为170亿和4000亿&#xff0c;采用混合专家架构。Meta同时训…...

skynet.netpack四个核心函数详解

目录 1. netpack.filter(queue, msg, sz)2. netpack.pop(queue)3. netpack.tostring(msg, sz)4. netpack.clear(queue)完整使用场景示例总结 在 Skynet 中&#xff0c;netpack 模块提供了四个核心函数&#xff0c;用于处理网络数据包的接收、粘包解析和队列管理。以下是这四个函…...

Zephyr与Linux核心区别及适用领域分析

一、核心定位与目标场景 特性Zephyr RTOSLinux目标领域物联网终端、实时控制系统&#xff08;资源受限设备&#xff09;服务器、桌面系统、复杂嵌入式设备&#xff08;如路由器&#xff09;典型硬件MCU&#xff08;ARM Cortex-M, RISC-V&#xff09;&#xff0c;内存<1MBMP…...

Linux网络编程(十五)——优于select的epoll

文章目录 15 优于select的epoll 15.1 epoll理解及应用 15.1.1 基于select的I/O复用技术速度慢的原因 15.1.2 select的优点 15.1.3 实现epoll时必要的函数和结构体 15.1.4 epoll_creat1 15.1.5 epoll_ctl 15.1.6 epoll_wait 15.1.7 基于epoll的回声服务器端 15.2 条件…...

PhotoShop学习07

1.为图像添加纹理 图层混合模式是混合 2 张图片的一种快捷方式&#xff0c;一般情况下为图片添加纹理外观可以用到混合模式。 这里有一副图片&#xff0c;我可以为其添加纹理&#xff0c;使之呈现出不同的效果。首先需要为当前图层添加一个纹理图片&#xff0c;可以使用置入嵌…...

【缓存击穿】Java的“SingleFlight”解决方案

在Java中实现类似Golang的SingleFlight机制&#xff0c;可以通过以下步骤解决缓存击穿问题。该方案使用ConcurrentHashMap管理并发请求&#xff0c;并通过CompletableFuture实现异步结果合并。 实现代码 import java.util.concurrent.Callable; import java.util.concurrent.…...

createContext+useContext+useReducer组合管理React复杂状态

createContext、useContext 和 useReducer 的组合是 React 中管理全局状态的一种常见模式。这种模式非常适合在不引入第三方状态管理库&#xff08;如 Redux&#xff09;的情况下&#xff0c;管理复杂的全局状态。 以下是一个经典的例子&#xff0c;展示如何使用 createContex…...

海外直播平台交互设计师简历模板

营销团队管理技巧培训PPT啊&#xff0c;其实是一个非常有用的工具呢&#xff01;它不仅能帮助管理者梳理思路&#xff0c;还能让团队成员快速掌握关键技能。说实话&#xff0c;一个好的PPT就像一位优秀的导师&#xff0c;在会议室里就能让人眼前一亮&#xff01;比如有一次我参…...

基于springboot微信小程序课堂签到及提问系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去的课堂签到及提问管理方式的缺点逐渐暴露&#xff0c;本次对过去的课堂签到及提问管理方式的缺点进行分析&#xff0c;采取计算机方式构建基于微信小程序的课堂签到及提问系统。本文通过阅读相关文献&#xff0c;研究国内外相关技术&a…...

MCU软件开发使用指针有哪些坑?

目录 1、空指针访问 2、野指针&#xff08;未初始化的指针&#xff09; 3、指针越界 4、内存泄漏 5、悬空指针 6、指针类型不匹配 7、多任务环境中的指针访问 8、对齐问题 在MCU软件开发中&#xff0c;使用指针虽然可以提高程序的灵活性和性能&#xff0c;但也存在许多…...

ubuntu 20.04 编译和运行SC-LeGo-LOAM

1.搭建文件目录和clone代码 mkdir -p SC-LeGo-LOAM/src cd SC-LeGo-LOAM/src git clone https://github.com/AbangLZU/SC-LeGO-LOAM.git cd .. 2.修改代码 需要注意的是原作者使用的是Ouster OS-64雷达&#xff0c;需要更改utility.h文件中适配自己的雷达类型&#xff0c;而…...

FPGA_DDR(一) 仿真

对ddr进行读写实验&#xff0c;用了vivado的ddr的模型进行仿真 1 创建AXI_mig的ip核 选择axi 选择自己的型号&#xff0c;这里是ddr的位宽32&#xff0c;但是axi的话是256位宽 选择nobuffer&#xff0c;没有缓冲器 选择自己匹配引脚 默认 后面默认即可 生成ip&#xff0c;时间…...

【Spec2MP:项目管理之项目人力管理】

芯片设计项目中如何打造战斗力强悍的团队&#xff1f; 引言&#xff1a;芯片设计项目的核心是人 芯片设计是一项高度复杂、跨学科协作的工程&#xff0c;团队的专业性、协作效率和凝聚力直接影响项目成败。本文结合某芯片项目人力管理文档&#xff0c;从目标、职责、价值观、架…...

windows10下PointNet官方代码Pytorch实现

PointNet模型运行 1.下载源码并安装环境 GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/gh_mirrors/po/pointnet.pyto…...

阿里云大模型训练与推理开发

本文主要描述阿里云大模型开发环境的搭建、训练数据集的制作流程、大模型如何训练数据集以及如何利用已训练完成的模型执行推理。 开发环境搭建 ModelScope社区是阿里云通义千问开源的大模型开发者社区。 如上所示&#xff0c;安装ModelScope社区大模型基础库开发框架的命令行…...

图灵逆向——题一-动态数据采集

目录列表 过程分析代码实现 过程分析 第一题比较简单&#xff0c;直接抓包即可&#xff0c;没有任何反爬&#xff08;好像头都不用加。。。&#xff09; 代码实现 答案代码如下&#xff1a; """ -*- coding: utf-8 -*- File : .py author : 鲨鱼爱兜兜 T…...

GS069W电动工具直流调速电路深度解析

产品概述 GS069W是我们推出的CMOS专用调速集成电路&#xff0c;采用SOP8封装&#xff0c;内置15V稳压结构&#xff0c;具有宽电压输入&#xff08;4-24V&#xff09;、低功耗、强抗干扰等特点&#xff0c;专为电动工具调速设计。 核心参数 工作电压&#xff1a;4-24V&#xff…...

PyQt6实例_A股日数据维护工具_下载某个股票未复权数据

目录 前置&#xff1a; 相关代码&#xff1a; 1 工作类 2 数据库交互 3 主界面调用 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_A股日数据维护工具” 开头放置在“PyQt6实例”专栏 2 日数据可在“数据库”专栏&#xff0c;“PostgreSQL_”开头系列博文中获取 3 权…...