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

爬虫入门与requests库的使用——python爬虫

文章目录

  • 浏览器抓包
    • 浏览器抓包介绍
      • 浏览器抓包页面介绍
  • python 爬虫
    • 爬虫是什么
    • web网页渲染的方式
    • http 协议
    • http协议对资源的操作
    • requests 库
      • requests 是什么
      • requests 的安装
      • requests库的基础使用
        • requests中不同的请求方式
        • GET传递参数
        • POST传递参数
        • 响应内容
        • 定制请求头
        • Cookie
          • 获取服务器响应的Cookie
          • 向服务器发送 Cookie
        • 重定向
        • 服务器响应超时
      • request库的进阶使用
        • 请求与响应
        • SSL证书验证
        • 流式上传和请求
        • 代理
        • 编码方式
        • 身份认证

浏览器抓包

浏览器抓包介绍

抓包:即抓取数据包,几乎所有的浏览器都提供了抓取数据包的功能,因为浏览器为抓包提供了一个专门的操作页面,因此,这种抓包方式也被称为控制台方式

控制台抓包非常适合POST请求类型,我们知道POST请求使用From表单向服务器提交数据,通过抓包可以获取POST请求体的数据和相应参数,从而对相应内容进行分析。

浏览器抓包页面介绍

  1. 打开浏览器,登录任意网站(这里以百度为例),鼠标右键点击,选择检查

在这里插入图片描述

  1. 抓包页面如下:

在这里插入图片描述

抓包页面中的各个选项:

  • Elements(元素)-----该选项下存放的是该网页的html代码
  • console(控制台)-----该选项用于调试一些前端代码,类似python中的IDLE,代码写一行,解释器就立马解释一行。
  • 应用-----该选项用来查看和修改本地存储,会话存储,cookie
  • network(网络)-----该选项是最常用的,该选项下记录了该网页的所有的请求和响应,以及它们各自的数据。我们一般需要在该选项下进行筛选,这样才能找到我们想要的东西。

常用筛选条件如下:

在这里插入图片描述

  • Fetch/XHR----- 只展示动态数据包
  • 文档 ----- 只展示该网页的html骨架(无任何其他资源与数据)
  • css ----- 只展示该网页上的CSS代码
  • JS ----- 只展示该网页上的JS代码
  • 字体----- 只展示字体相关的请求和响应
  • img ---- 只展示该网页上的所有图片资源
  • 媒体 ----- 只展示该网页上的所有媒体文件
  • WS ----- 只展示符合web socket协议的一个筛选
  • 其他 -----展示一些其他的资源

python 爬虫

爬虫是什么

爬虫:是指通过程序代码去获取互联网上的资源。

web网页渲染的方式

一般情况,web网页会有两种渲染方法:

  • 服务器渲染:在服务器那边,直接将数据html页面代码整合在一起,返回给浏览器-----在浏览器上的页面源代码中能够找到对应的数据
  • 客户端渲染: 第一次请求服务器,只要一个html的骨架,第二次请求才会拿到对应的数据,然后由客户端(浏览器)将html数据整合在一起,展示出来-----在浏览器上的页面源代码中找不到对应的数据

http 协议

http协议即超文本传输协议,主要是用于传输超文本标记语言(html代码)。其主要分为请求和响应两个部分,而这两个部分的结构如下;

请求:

  • 请求行->请求方式(get/post等),请求url地址,协议。
  • 请求头->存放服务器要使用的一些附加信息(发出该请求的浏览器是什么类型的浏览器,该浏览器的数据要求是什么,浏览器有没有反扒机制)。
  • 请求体->存放一些请求参数。

响应:

  • 状态行->协议,状态码(200,404等)。
  • 响应头->存放客户端要使用的一些附加信息
  • 响应体->存放服务器返回给客户端的真正要用的东西(html,json数据等)。

对于爬虫来说:

请求头里面的重要东西:

  • User-Agent: 请求载体的身份标识(该请求是由什么浏览器发出的)。
  • Referer:防盗链(这个请求是从哪个页面来的,涉及到反爬)
  • cookie:本地的字符串数据信息(用户的账号和密码,反爬的token令牌)

响应头里面的重要东西:

  • cookie:本地的字符串数据信息(用户的账号和密码,反爬的token令牌)
  • 一些用于反爬的字符串

http协议对资源的操作

  1. Get:主要用于请求数据。当客户端需要从服务器获取数据时,通常会使用GET方法。
  2. Post:主要用于提交数据,特别是在创建新的资源或提交表单时。
  3. Put:用于更新资源。与POST不同,PUT请求通常用于替换整个资源的内容。
  4. Delete:用于删除资源。
  5. Patch:用于部分更新资源。与PUT不同,PATCH请求只更新资源的部分属性,而不是整个资源。

requests 库

requests 是什么

requests 是一个用于发送HTTP请求的Python库,它简化了与Web服务交互的过程,使开发者能够轻松地构建和解析HTTP请求和响应

requests 的安装

打开pycharm 终端,输入安装命令:pip install requests

requests库的基础使用

requests中不同的请求方式
  • requests.get(url)-----向对应网址(url) 的服务器发出GET请求。
  • requests.post(url,data=posts)-----向对应网址(url) 的服务器发出POST请求,posts为一个字典时,会自动放在form字段下面,posts不是字典时,会字段放在data字段下面。
  • requests.put(url, data=payload)-----向对应网址(url) 的服务器发出PUT请求。
  • requests.patch(url, data=payload)-----向对应网址(url) 的服务器发出PATCH请求。
  • requests.delete(url)-----向对应网址(url) 的服务器发出DELETE请求。
  • requests.head(url) ----- 只会返回响应的头部信息而不包含消息体,这意味着你可以获取关于资源的信息(如状态码、内容类型、最后修改时间等)而无需下载整个资源。

请求的结构:

在这里插入图片描述

GET传递参数

当你想要为url的查询字符串(query string)添加数据时,你可以使用 params 关键字参数来提供这些参数。params 接受一个字典或包含键值对的列表,这些键值对会被编码到url中,跟在问号(?)后面

import requests#传递单个值#定义要传递的参数 
payload = {'key1': 'value1', 'key2': 'value2'} 
# 发送GET请求并附带参数 
response = requests.get(url=url, params=payload)#最终的url为:网址?key1=value1&key2=value2# 当一个键同时有多个值时# 定义要传递的参数 
payload = {'key1':'value1','key2': ['value2', 'value3']}
# 发送GET请求并附带参数 
response = requests.get(url=url, params=payload)# 最终url为:网址?key1=value1&key2=value2&key2=value3

注意:如果参数中某个键值对的值为(None),这些键不会被添加到最终的url中。

POST传递参数

post 提交的数据一般在请求头的表单(form)当中。

import requests# 一个键只对应一个值# 定义要传递的参数 
payload = {'key1': 'value1', 'key2': 'value2'} 
# 发送POST请求并附带参数 
response = requests.post(url=url, data=payload)

在这里插入图片描述

import requests# 多个相同键的值作为元组列表传递 
payload = [('key1', 'value1'), ('key1', 'value2')] 
# 发送POST请求并附带参数 
response = requests.post(url=url, data=payload)

在这里插入图片描述

对于向 API 发送请求,通常一般的API会接受 JSON 编码的数据。想要传递JSON类型的数据,其方法为使用 json.dumps() 方法将字典转换为 JSON 字符串,并将其传递给 data 参数。

import requests
import json# 定义要发送的POST请求的URL
url = 'http://httpbin.org/post'# 定义要传递的参数
payload = {'key1': 'value1'}  #json数据# 发送POST请求并附带参数
response = requests.post(url=url, 
data=json.dumps(payload))# 打印服务器响应
print(response.text)

上传文件:只需要定义一个字典,其中键名是表单字段名值是一个文件对象或包含文件内容的字符串。如果需要,还可以指定文件名、MIME 类型和额外的请求头。

import requestsfilest = {'file': open('D:\\demo.xls', 'rb')} 
response = requests.post(url=url, files=filest)

request方法:

requests.request(method,url,**kwargs)      #requests.request()为requests库的基础方法,上面右边六种函数就是该方法的封装
#method 对应上面大写的六种方法(get,put,post,patch,delete,head)
#**kwargs 可选参数#params :访问url时携带的参数(用字典表示)#headers :修改http头部的信息 headers=kv ( kv={'user-agent':'Mozilla/5.0'} )#通过修改user-agent来进行爬虫的浏览器伪装,#'Mozilla/5.0'----一般通用浏览器的身份标识#data :修改http主体内容的数据(添加,修改)#files :传输文件 files=fs  ( fs={'file':open(文件路径,打开方式)} )
响应内容
import requestsr=requests.get("http://www.baidu.com")
#requests.get(a) :访问目标网站,a为目标网站网址#函数作用:构造一个向服务器请求资源的Request对象,
#返回值为一个包含服务器资源的Response对象(即r,爬虫抓取的结果)print(r.status_code)
#r.status_code :访问的状态码,200为访问成功,404或其他码为访问失败print(r.encoding)
# r.encoding  从http header中相关字段来猜测
#响应内容的编码方式(爬取结果的编码方式)# r.apparent_encoding  从http 的内容中分析出的响应内容
#编码方式(备选编码方式)(比前者更准确)r.encoding="utf-8"    #将抓取结果的编码方式改为utf-8print(r.text)
#.text  http响应的字符串形式,即目标网址对应的html代码print(r.content)
#爬取结果的二进制形式print(r.headers)
#以 Python 字典形式展示的服务器响应头信息

将响应内容解析成json格式的数据:

# 将响应内容解析为 JSON 格式,并存储在变量 json_data 中 
json_data = response.json()# 打印第一个键值对中的的所有键名 
print(json_data[0].keys())

例子:

#百度关键词提交接口:"http://www.baidu.com/s?wd=keyword"  
#只需要替换keyword,即可爬取到百度搜索keyword后的结果try:kv={'wd':'海贼王'}r = requests.get("http://www.baidu.com/s",params=kv)r.raise_for_status()     #如果状态码不是200,则引发HTTPError异常r.encoding=r.apparent_encodingprint(r.request.url)  #获取发给服务器的urlprint(r.url)print(r)except Exception as e:print(e)
定制请求头
import requestsurl = 'https://api.github.com/some/endpoint'# 定制请求头
headers = {'user-agent': '自定义浏览器的身份标识'}
response = requests.get(url, headers=headers)print(response.text)
Cookie
获取服务器响应的Cookie
import requestsurl = 'http://www.baidu.com'response = requests.get(url)# 打印服务器响应的所有cookie
print(response.cookies)# 获取指定cookie的三种写法:# 打印从服务器响应中获取到的名为 'H_PS_PSSID' 的 cookie 的值。
# 如果不存在名为 'H_PS_PSSID' 的 cookie,则会抛出 KeyError 异常。
print(response.cookies['H_PS_PSSID'])# 如果 cookie 不存在,它将返回 None 或者指定的默认值,而不会抛出异常
print(response.cookies.get('H_PS_PSSID'))# 如果 cookie 不存在,返回指定的值
print(response.cookies.get('cookie名字', 'cookie不存在,返回的值'))

注意:不同的网站,不同的cookie,名字各不相同,'H_PS_PSSID'只是百度的cookie名字

向服务器发送 Cookie
import requestsurl = 'http://httpbin.org/cookies'cookies = dict(cookies_are='working')
# cookies = {'cookies 名字': 'cookie的值'}response = requests.get(url=url, cookies=cookies)# 发送的cookie 格式:
#{ 
#"cookies": { 
#    "cookies_are": "working" 
#  } 
#}
重定向

默认情况下,除了 HEAD 请求外,requests 会自动处理所有的重定向。可以使用 Response.history 来追踪重定向的历史记录,它是一个按照从最老到最近排序的 Response 对象列表。

GitHub 会将所有 HTTP 请求重定向到 HTTPS:

import requestsurl = 'http://github.com'response = requests.get(url)# 打印url
print(response.url)# 打印重定向记录
print(response.history)

打印的结果为:

https://github.com/
[<Response [301]>]

从打印结果可以看到 githubhttp 请求被重定向到了 https

禁用重定向:

import requestsresponse = requests.get(url=url,allow_redirects=False)

启用 HEAD 请求的重定向:

对于 HEAD 请求,默认情况下不会跟随重定向,可以显式地启用它

import requestsurl = 'http://github.com'# 设置 allow_redirects=True,表示启用重定向
response = requests.head(url=url, allow_redirects=True)print(response.url)
print(response.history)
服务器响应超时

为了避免程序因等待响应而无限期挂起,可以使用 timeout 参数指定一个超时时间(以秒为单位)。如果服务器在这个时间内没有响应,requests 将抛出一个 Timeout 异常。

import requestsurl = 'http://github.com'response = requests.get(url=url, timeout=0.001)

request库的进阶使用

请求与响应

任何时候当你调用 requests.get() 其他类似方法时,实际上你在执行两个主要操作:构建一个 Request 对象以向服务器请求或查询资源;以及接收一个从服务器返回的 Response 对象这个 Response 对象包含了来自服务器的所有信息,并且也包含了你最初创建的 Request 对象

获取响应头:

import requestsurl = 'http://www.baidu.com'response = requests.get(url)print(response.headers)   #打印出响应头

获取发送到服务器的请求头:

import requestsurl = 'http://www.baidu.com'response = requests.get(url)print(response.request.headers)  #打印出请求头
SSL证书验证

所谓的SSL证书,就是来标识服务器身份的,其可以防止钓鱼网站假冒,保护用户数据安全,如果服务器的SSL证书不被信任,则浏览器会被限制对其的访问(通过https协议来实现),以保护用户数据安全。Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。SSL 验证默认是开启的,如果证书验证失败,Requests 会抛出 SSLError

在某些特殊情况下,比如你信任但服务器证书不受信任的情况下,你可能想要忽略 SSL 证书验证,以保证对其的访问。

import requests
from urllib3.exceptions import InsecureRequestWarningurl = 'https://example.com'# 禁用不安全请求警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)# 忽略 SSL 证书验证
response = requests.get(url, verify=False)
print(response.status_code)
流式上传和请求
  1. 流式上传:

Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存,直接传,无中间商,要使用流式上传,仅需为你的请求体提供一个类文件对象即可。

with open('massive-body', 'rb') as f:requests.post('http://some.url/streamed', data=f)

data=f:这里将文件对象 f 直接赋值给了 data 参数。这意味着 requests 将会逐块读取文件内容,并通过 HTTP 请求进行流式传输。这样做的好处是,即使文件非常大,也不会占用过多的内存,因为数据是一部分一部分地发送出去的。

  1. 流式请求:

流式请求和普通请求的区别:

普通请求

  • 一次性读取:当发起一个普通的 GET 或 POST 请求时,requests 会立即将整个响应体下载到内存中。这意味着如果响应体很大,可能会占用大量的内存。
  • 简单易用:对于小文件或轻量级的数据交换,这种方式非常方便,因为它不需要额外的配置就可以直接获取完整的响应内容。

流式请求

  • 逐块读取:通过设置参数 stream=True,你可以告诉 requests 不要立即下载整个响应体。相反,它会在需要时逐步从网络流中读取数据。这允许你处理超大文件或长时间运行的数据流,而不会一次性占用大量内存。
  • 节省资源:流式请求非常适合于处理大型文件、长连接 API 响应或者实时数据流,因为你可以一边接收数据一边处理,从而有效管理资源。
  • 更复杂的逻辑:由于数据是分块到达的,你需要编写额外的代码来处理这些数据块,例如将它们写入文件或进行增量处理。

流式请求迭代器方法

  • iter_content() :以字节为单位返回响应内容的迭代器。可以指定 chunk_size 参数来控制每次读取的大小。
  • iter_lines() :以行为单位返回响应内容的迭代器,适用于按行处理的文本响应

iter_lines() 的使用:

import json
import requests# 发送 GET 请求到指定的 URL,使用 stream=True 以便逐行读取响应内容
response = requests.get('http://httpbin.org/stream/20', stream=True)# 检查响应的编码,如果未设置,则将其设置为 'utf-8'
if response.encoding is None:response.encoding = 'utf-8'# 使用 iter_lines() 方法创建一个可迭代的行生成器
lines = response.iter_lines()# 使用 next() 函数获取并跳过第一行,first_line 存储的是第一行的内容
first_line = next(lines)# 逐行处理剩余的响应内容
for line in lines:# 打印当前行的内容print(json.loads(line))  #读取json的格式的内容

iter_content() 使用:

import requests# 定义要请求的 URL
url = 'https://api.github.com/events'# 发送 GET 请求到指定的 URL,使用 stream=True 以便逐块下载内容
response = requests.get(url=url, stream=True)# 打开一个文件以写入二进制数据,路径为 'D:\\demo.txt'
with open('D:\\demo.txt', 'wb') as fd:# 遍历响应内容,按块读取数据,块大小为 8192 字节for chunk in response.iter_content(chunk_size=8192):# 将读取的块写入文件fd.write(chunk)
代理

当我们频繁地访问某个网站时,又不希望暴露自己的真实ip地址,那么这个时候,我们就可以使用ip代理,即当我们向外发出请求,请求都会经过代理的服务器,再由代理服务器向外发出请求(或者接收外部请求时,由代理服务器接收,再由其转发给我们),这样外部就会将代理服务器的ip地址当成我们的ip地址

注意:在实际工作中,一般都是代理服务端,保证服务器ip地址不被泄露,爬虫中的代理是类似代理客户端。

  1. 获取免费代理

在这里插入图片描述

  1. 使用代理配置单个请求

如果需要使用代理,可以通过为任意请求方法提供 proxies 参数来配置单个请求。

import requestsurl = 'http://www.baidu.com'proxies = {"http": "47.119.22.92:8008"  #代理服务器的ip地址
}# 发送 GET 请求,并使用指定的代理
response = requests.get(url=url, proxies=proxies)# 从外部看来,所有的爬虫请求就是代理IP发出的print(response.status_code)

3.使用代理池

使用代理池可以提高请求的成功率和匿名性。通过每次发送请求时从多个代理服务器中随机选择一个来发送,可以分散请求源,减少被目标网站封禁的风险。

import randomimport requestsurl = 'http://www.baidu.com'# 使用代理池
proxies_pool = [{'http': '47.122.65.254:8080'},{'http': '8.130.34.44:8800'},{'http': '47.121.183.107:8443'},{'http': '111.1.61.50:3128'},{'http': '47.119.164.33:3128'}
]proxies = random.choice(proxies_pool)# 发送 GET 请求,并使用指定的代理
response = requests.get(url=url, proxies=proxies)print(response.status_code)
  1. 针对特定主机设置代理

要为某个特定的连接方式或主机设置代理,可以使用 http://指定主机的IP地址 作为键。这种方式将针对指定的主机和连接方式进行匹配

import requestsurl = 'http://www.baidu.com'# 针对特定主机设置代理
proxies = {"http://指定主机的IP地址": "http://代理服务器的IP地址:端口号"
}
# "http://27.0.0.1" 是本机回环地址,代表本机
#"http://127.0.0.1": "http://47.121.183.107:8443"
#如上,指定主机为本机# 发送 GET 请求,并使用指定的代理
response = requests.get(url=url, proxies=proxies)print(response.status_code)
编码方式

当你收到一个 HTTP 响应时,requests 库会猜测响应内容的编码方式,以便在你调用 Response.text 方法时能够正确解码响应内容。以下是 requests 处理编码方式的具体机制。

自动检测编码:

  • 优先检查 HTTP 头部requests 首先会在 HTTP 响应头部查找 Content-Type 字段中的字符集声明。如果存在明确指定的字符集(例如 charset=UTF-8),则使用该字符集进行解码。
  • 使用 charade 猜测编码:如果 HTTP 头部没有明确指定字符集,并且 Content-Type 包含 text 类型,则 requests 会使用内置的 chardet 库(原名为 charade)来推测最可能的编码方式。
  • 默认编码:根据 RFC 2616 的规定,当 Content-Type 是 text 类型但没有指定字符集时,默认字符集应该是 ISO-8859-1requests 遵循这一规范并默认采用 ISO-8859-1 进行解码。

手动设置编码:

如果你知道正确的编码方式并且希望覆盖 requests 的自动检测结果,可以通过直接设置 Response.encoding 属性来实现。

import requestsurl = 'https://api.github.com/events'response = requests.get(url=url)# 查看推测的文本编码
print("自动推测的编码方式:" + response.encoding)# 手动指定编码为 ISO-8859-1
response.encoding = 'ISO-8859-1'
# 打印编码方式
print("手动指定的编码方式:" + response.encoding)

使用原始字节数据:

如果你不确定编码或者不想依赖于 requests 的自动解码功能,可以直接访问 Response.content 属性以获取未经解码的原始字节数据。然后根据需要自行解码。

import requestsurl = 'https://api.github.com/events'response = requests.get(url=url)# 获取未经解码的原始字节数据,返回的是服务器返回的二进制内容
raw_data = response.content# 使用 UTF-8 编码方式对原始字节数据进行解码,转换为字符串
decoded_text = raw_data.decode('utf-8')
print(decoded_text)
身份认证

HTTP Basic Authentication 是一种简单的认证机制,广泛用于需要认证的 Web 服务中,客户端只有通过了认证,才能访问对应的受保护的资源,requests 库对这种认证方式提供了直接的支持。

可以通过导入 HTTPBasicAuth 类来使用 HTTP Basic Auth。

import requests
from requests.auth import HTTPBasicAuthurl = 'https://api.github.com/user'
auth = HTTPBasicAuth('用户名', '密码')# 发送带有基本身份认证的 GET 请求
response = requests.get(url=url, auth=auth)print(response.status_code)

简写形式:由于 HTTP Basic Auth 非常常见,requests 提供了一种更为简洁的方式来传递认证信息——直接在 auth 参数中提供一个元组。

import requestsurl = 'https://api.github.com/user'
# 发送带有基本身份认证的 GET 请求
response = requests.get(url=url, auth=('user', 'pass'))print(response.status_code)

相关文章:

爬虫入门与requests库的使用——python爬虫

文章目录 浏览器抓包浏览器抓包介绍浏览器抓包页面介绍 python 爬虫爬虫是什么web网页渲染的方式http 协议http协议对资源的操作requests 库requests 是什么requests 的安装requests库的基础使用requests中不同的请求方式GET传递参数POST传递参数响应内容定制请求头Cookie获取服…...

[Java EE] Spring 配置 和 日志

目录 1. 配置文件 1.1 作用 1.2 Spring Boot 配置文件 1.3 读取配置文件 1.3.1 配置对象 1.3.2 配置集合 1.3.3 配置Map 1.4 yml 优缺点 2. 日志 2.1 日志的作用 2.2 日志的使用 2.3 日志框架 2.3.1 门面模式(外观模式) 2.4 SLF4J 框架介绍 2.5 日志格式的说明 …...

如何0基础学stm32?

如何0基础学stm32&#xff1f; 作为一个混迹嵌入式领域十余年的老兵&#xff0c;每次看到"0基础学STM32"这样的提问&#xff0c;我都忍不住想笑&#xff0c;又有些无奈。这就像问"如何0基础学开飞机"一样—虽然理论上可行&#xff0c;但过程恐怕没那么愉快…...

XCZU27DR‑2FFVE1156I Xilinx Zynq UltraScale+ RFSoC

一、概述 XCZU27DR‑2FFVE1156I 属于 Zynq UltraScale™ RFSoC Gen 2 系列&#xff0c;采用 TSMC 16 nm FinFET 工艺&#xff0c;Speed Grade ‑2&#xff0c;集成了 ARM 处理系统、可编程逻辑与高性能射频数据转换单元&#xff0c;为软件定义无线电、5G 前端、测试测量等场景…...

取值运算符*和地址运算符

在指针的学习中&#xff0c;必不可少的两个操作符&#xff1a;*和&。 在定义一个指针的时候&#xff0c;比如 short *p&#xff1b; 表示一个指向short数据类型的指针&#xff0c;具体表达的意思就是这个指针P指向的一个数据类型是short类型&#xff0c;也就是说操作的这…...

LNA设计

设计目的 为后级提供足够的增益以克服后级电路噪声 尽可能小的噪声和信号失真 确保输入和输出端的阻抗匹配 确保信号线性度 评价标准 噪声系数 功率增益 工作频率和带宽 输入信号功率动态范围 端口电压驻波比 稳定性 基于SP模型的LNA设计 直流分析 S参数分析 设计指标 &#xf…...

FPGA——DDS信号发生器设计

文章目录 任务要求一、DDS简介二、设计过程1、相位累加器的设计2、波形存储器设计3、锁相环倍频电路设计4、顶层电路设计 三、设计实现四、运行结果总结参考资料 任务要求 1)利用DDS技术合成正弦波和方波&#xff1b; 2)输出信号的频率范围为10Hz&#xff5e;5MHz&#xff0c;…...

【网络编程】TCP数据流套接字编程

目录 一. TCP API 二. TCP回显服务器-客户端 1. 服务器 2. 客户端 3. 服务端-客户端工作流程 4. 服务器优化 TCP数据流套接字编程是一种基于有连接协议的网络通信方式 一. TCP API 在TCP编程中&#xff0c;主要使用两个核心类ServerSocket 和 Socket ServerSocket Ser…...

数据可视化(Matplotlib和pyecharts)

一 常见图形概念及使用 图表类型适用场景核心特点柱状图(bar)比较不同类别数据(如各地区销售额对比)、时间序列分析(离散时间)高度反映数值大小,支持横向/纵向展示,可叠加分组折线图(plot)连续数据趋势比较(适合展示随时间的变化,如股票价格走势、用户增长趋势)、多变…...

如何系统地入门学习stm32?

如何系统地入门学习stm32&#xff1f; 作为一个在嵌入式领域摸爬滚打十余年的工程师&#xff0c;看到这个问题&#xff0c;我不禁想起自己当年啃着厚重的数据手册&#xff0c;对着一块蓝色的PCB板冥思苦想的日子。STM32的学习之路&#xff0c;说难不算特别难&#xff0c;说简单…...

matlab读取CMEMS海洋温度数据并调整图片的比例

matlab读取CMEMS海洋温度数据并调整图片的比例 matlab读取CMEMS海洋温度数据并调整图片的比例 matlab读取CMEMS海洋温度数据并调整图片的比例 数据的下载见上期&#xff1a; 链接到CMEMS数据下载{python} 本文还会给出另一个关键技巧&#xff1a; 通常设置图片比列直接可以通过…...

ReSearch:基于强化学习的大语言模型推理搜索框架

ReSearch是一种创新性框架&#xff0c;通过强化学习技术训练大语言模型执行"推理搜索"&#xff0c;无需依赖推理步骤的监督数据。该方法将搜索操作视为推理链的有机组成部分&#xff0c;其中搜索的时机与方式由基于文本的推理过程决定&#xff0c;而搜索结果进一步引…...

【记录】服务器安装ffmpeg

前言 因为项目中需要用到 ffmpeg 进行图像的一些操作,本文记录下在服务器安装 ffmpeg 的全过程,还是具有一定挑战性的。 系统详情 本文使用的操作系统详情如下 通过 命令 cat /etc/os-release 获取 虽然操作系统为 Rocky Linux,但安装过程是通用的,因为本文记录的是从源代码…...

部署rocketmq集群

容器化部署RocketMQ5.3.1集群 背景: 生产环境单机的MQ不具有高可用,所以我们应该部署成集群模式,这里给大家部署一个双主双从异步复制的Broker集群 一、安装docker yum install -y docker systemctl enable docker --now # 单机部署参考: https://www.cnblogs.com/hsyw/p/1…...

中国AIOps行业分析

基本术语 AIOps是"Artificial Intelligence for IT Operations"(IT运维人工智能)的缩写,它指的是将人工智能技术应用于IT运维领域,基于已有的运维数据(如日志、监控信息、应用信息等),通过机器学习的方式解决自动化运维无法解决的问题6。AIOps将机器学习(ML)…...

C++入门[超详细]

#include <iostream c的标准输入输出流 C的域 using namespace std; namespace本质是一个域 只有域里面的定义代码才能使用 std包含了c输入输出的标准库 缺省 只能从左到右缺省,不能中间空格 void f1(int a10,int b20,int c0) { } f1(); f1(1); f1(1,2); f1(1,2,3); f1(…...

字符串系列一>二进制求和

目录 题目&#xff1a;解析&#xff1a;代码&#xff1a; 题目&#xff1a; 链接: link 解析&#xff1a; 代码&#xff1a; class Solution {public String addBinary(String a, String b) {StringBuffer ret new StringBuffer();int t 0;char[] aa a.toCharArray();char[…...

序列化和反序列化

概念 创建出来的这些对象都存在于JVM中的堆&#xff08;heap&#xff09;内存中&#xff0c;只有JVM处于运行状态的时候&#xff0c;这些对象才可能存在。当JVM停止&#xff0c;这些对象也就随之消失。 java序列化可以帮我们实现&#xff1a;将这些对象持久化&#xff0c;并且…...

rebase和merge的区别

目录 1. ‌合并机制与提交历史‌ 2. ‌冲突处理方式‌ 3. ‌历史追溯与团队协作‌ 4. ‌推荐实践‌ 5. ‌撤销难度‌ git rebase和git merge是Git中两种不同的分支合并策略&#xff0c;核心区别在于提交历史的处理方式&#xff1a;merge保留原始分支结构并生成合并提交&am…...

linux查看目录相关命令

查看目录命令 学习目标 能够使用Linux命令查看目录信息 1. 查看目录命令的使用 命令说明ls查看当前目录信息tree以树状方式显示目录信息 ls命令效果图: tree命令效果图: 2. 查看当前目录路径 命令说明pwd查看当前目录路径 pwd命令效果图: 3. 清除终端内容 命令说明clear…...

203. 移除链表元素

给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输入&#xff1a…...

Cursor新版0.49.x发布

小子看到 Cursor 0.49.x 版本正式发布&#xff0c;截止今天已经有两个小patch版本&#xff01;本次更新聚焦于 自动化Rules生成、改进的 Agent Terminal 以及 MCP 图像支持&#xff0c;并带来了一系列旨在提升编码效率和协作能力的改进与修复。 以下是本次更新的详细内容&…...

music21:伍佰 泪桥 MIDI 音乐分析

以下是使用 music21 对伍佰《泪桥》MIDI 音乐进行分析的一些可能方面&#xff1a; 基本信息3 曲长&#xff1a;全曲长 2 分 31 秒。音符数量&#xff1a;共 273 个音符。音轨信息&#xff1a;共 2 个音轨&#xff0c;其中 1 个音轨有音符&#xff0c;可视为单轨 MIDI 文件&am…...

Mybatis源码01-SpringBoot启动时mybatis加载过程

使用了mybatis这么久还没有具体探究了SpringBoot启动时候对于mybatis是怎么加载的。 1、首先项目构建时我们会引入相关的依赖&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</arti…...

springCloud/Alibaba常用中间件全集(上)

文章目录 SpringCloud:一、Consul:服务注册与发现1、下载Consul2、运行Consul3、服务注册①. 导入依赖②. 配置yml③. 启动类添加Consul的启动服务发现注解④. 解决 **硬编码** 问题⑤. 此时便可以将IP地址改为服务名 4、服务配置与刷新①. 引入Consul-Config依赖②. 修改boots…...

嵌入式单片机通过ESP8266连接物联网实验

第一:通过手机APP远程监控和控制 ESP8266驱动RST低电平触发复位,平时需要跟EN一样分别接10k拉高到3.3V 如果是12E/F的话管脚比较多,GPIO15也要接个1K到地 烧录时GPIO要接地,正常工作时将其拉高或者悬空 主要使用串口通信,烧录固件也是通过串口,烧录时,启动烧录程序后…...

Visio导出清晰图片步骤

在Visio里画完图之后如何导出清晰的图片&#xff1f;&#x1f447; ①左上角单击【文件】 ②导出—更改文件类型—PNG/JPG ③分辨率选择【打印机】&#xff0c;大小选择【源】&#xff0c;即可。 ④选择保存位置并命名 也可以根据自己需要选择是否需要【透明底】哈。 选PNG 然…...

速查手册:TA-Lib 超过150种量化技术指标计算全解 - 1. Overlap Studies(重叠指标)

速查手册&#xff1a;TA-Lib 超过150种量化技术指标计算全解 - 1. Overlap Studies&#xff08;重叠指标&#xff09; TA-Lib&#xff08;Technical Analysis Library&#xff09;是广泛使用的金融技术分析库&#xff0c;实现了超过150种技术指标计算函数&#xff0c;适用于股票…...

大模型Rag - 如何评估Rag

一.RAG流程与评估标准补充 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合检索与生成的问答架构。为了确保系统效果&#xff0c;需要从以下三个角度对其评估&#xff1a; 回顾RAG流程 用户提出问题 → 系统检索相关上下文 → 基于上下文由大语言模型…...

复习JUC的总结笔记

JUC基础 调用Thread的start方法会调用start0&#xff0c;start0会调用该Thread类的run方法。Thread类如果传入了Runnable&#xff0c;run方法里会调用Runnable的run方法&#xff0c;如果没有传入&#xff0c;则什么也不会做。也可以通过重写Thread的run方法&#xff0c;让start…...

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;Matlab完整源码和数据&#xff09;&#xff0c;附模型研究报告 目录 基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;…...

5G 毫米波滤波器的最优选择是什么?

新的选择有很多&#xff0c;但到目前为止还没有明确的赢家。 蜂窝电话技术利用大量的带带&#xff0c;为移动用途提供不断增加的带宽。 其中的每一个频带都需要透过滤波器将信号与其他频带分开&#xff0c;但目前用于手机的滤波器技术可能无法扩展到5G所规划的全部毫米波&#…...

构造函数和析构函数

概念&#xff1a;对象的初始化和清理是非常重要的&#xff0c;一个对象在使用之前&#xff0c;需要进行初始化&#xff0c;使用完成后也需要及时清理数据&#xff0c;简单来说构造函数时用来初始化成员属性的&#xff0c;析构函数时用来清理数据的。 C中利用构造函数和析构函数…...

卷积神经网络(CNN)详解

文章目录 引言1.卷积神经网络&#xff08;CNN&#xff09;的诞生背景2.卷积神经网络&#xff08;CNN&#xff09;介绍2.1 什么是卷积神经网络&#xff1f;2.2 卷积神经网络&#xff08;CNN&#xff09;的基本特征2.2.1 局部感知&#xff08;Local Connectivity&#xff09;2.2.…...

NoSQl注入学习

文章目录 什么是NOSQL相关概念数据库文档集合 MongoDB 基础语法创建数据库创建集合插入文档更新文档查询文档 Nosql注入PHP 中的 MongoDB 注入重言式注入联合查询注入JavaScript 注入布尔盲注 Nodejs 中的 MongoDB 注入 从一道题中学习nosql注入 参考&#xff1a; Nosql 注入从…...

借助LlamaIndex实现简单Agent

借助LlamaIndex实现简单Agent 1 简介 智能体的构建发展是一个趋势&#xff0c;借助LlamaIndex简单实现Agent。本文主要借助LlamaIndex中的FunctionTool和Workflow。Workflow是使用事件流的方法实现。 2 构建公共类 由于LlamaIndex中的OpenAI无法直接连接国内大模型&#xf…...

MCGS昆仑通太屏笔记

4.3寸&#xff1a;4013ef/e1 7寸&#xff1a;7032kw 特点&#xff1a; 如果是使用组态屏进行调试使用&#xff0c;选择com1如果是实际项目使用&#xff0c;选择com2 操作步骤&#xff1a; 先创建设备窗口&#xff0c;再创建用户界面 在设备窗口界面&#xff0c;依次设置如下…...

纯FPGA控制AD9361的思路和实现之一 概述

我们知道PS通过内存映射方式方式用户的IP&#xff0c;具体是将用户的逻辑做成AXI_LITE_SALVE外设&#xff0c;PS做为AXI_LITE_MASTER去控制。 在ZYNQ系统中存在PS所以这个架构和思路很流行&#xff0c;ADI出的配置软件无线电子板的DEMO基本都是基于这样的架构。比如下图【上截…...

北斗短报文终端与5G融合:构建空天地海一体化通信新生态

随着北斗三号全球组网完成&#xff0c;短报文通信服务从区域覆盖迈向全球通达&#xff0c;其与5G技术的深度融合&#xff0c;正开创“空天地海一体化”通信新时代。深圳作为全国北斗产业高地&#xff0c;汇聚了遨游通讯等领军企业&#xff0c;其推出的北斗短报文终端通过技术创…...

Meteonorm8-免费使用教程(详细教程-免费)

Meteonorm介绍 Meteonorm 8 是一款专业的气象数据生成软件&#xff0c;广泛应用于太阳能、建筑能效、农业气候研究等领域。它提供全球范围内高精度的气象数据&#xff0c;支持多种数据源和插值方法&#xff0c;帮助用户获取特定地点的长期气象统计信息。 Meteonorm核心功能 …...

nohup的使用

最近远程连接服务器跑程序的时候&#xff0c;总是碰到本地电脑息屏或者ssh断开导致程序中断&#xff0c;往往一觉醒来不是程序跑完了而是因为各种原因本地中断了。为此想到了nohup这个命令&#xff0c;可以让程序在我本地电脑关机后也可以在远端服务器上面运行。 命令如下&…...

如何查看HTTP状态码?

目录 一、HTTP状态码查看方法 1. ​​浏览器开发者工具​​ 2. ​​命令行工具​​ 3. ​​服务器日志分析​​ 二、HTTP状态码分类与核心含义 1. ​​信息类&#xff08;1xx&#xff09;​​ 2. ​​成功类&#xff08;2xx&#xff09;​​ 3. ​​重定向类&#xff08…...

2025.04.19【Chord diagram】| 弦图绘制技巧大全

Customization Apply customization to the circular chart: color, background, track height and more. Chart types Learn how to use other chart types like line chart, barcharts, vertical ablines and more. 文章目录 CustomizationChart types 什么是弦图&#xff…...

解码 Web Service:从技术原理到应用场景的深度剖析

Web Service 是一种基于网络的、分布式的计算技术&#xff0c;它允许不同的应用程序之间通过网络进行通信和交互。以下是关于 Web Service 的详细介绍&#xff1a; 一、定义与概念 Web Service 是一种可以通过 Web 协议&#xff08;如 HTTP&#xff09;进行访问的软件组件&am…...

hackmyvm-airbind

收集信息 arp-scan -l nmap -sS -v 192.168.195.162 访问扫描到的ip&#xff0c;直接跳转到登录页面&#xff0c;利用admin/admin弱口令登录 在settings.php中找到一处文件上传&#xff0c;上传一句话木马&#xff0c;上传成功 反弹shell 上传php-reverse-shell.php 抓包&am…...

[HCIP] OSPF 综合实验

题目 实验需求 1.R5为TSP&#xff0c;其上只能配置IP地址&#xff1b; R5与其他所有直连设备间均使用公有IP&#xff1b;环回地址为100.1.1.1/32 2.R4设备为企业出口路由器 3.整个OSPF环境IP基于172.16.0.0/16划分&#xff1b; 4.所有设备均可访问R5的环回&#xff1b; 5…...

arkTs:使用setTimeout / setInterval 实现透明度切换的轮播图

使用setTimeout / setInterval 实现透明度切换的轮播图 1 主要内容说明1.1 setTimeout1.2 setInterval1.3 表格 2 举例说明2.1 图片变化的内容说明2.2 源码相关内容说明2.3 源码A2.4源码A的运行效果展示2.4.1 效果截图2.4.2 效果视频 3.结语4.定位日期 1 主要内容说明 1.1 set…...

苍穹外卖项目中所涉及到的测试内容

1.使用JWT令牌封装用户令牌&#xff0c;并且设置相应的拦截器校验JWT的有效性&#xff0c;从而确保了项目的安全可靠 1.基本功能测试&#xff1a; 验证合法JWT是否能够正常通过拦截器的校验 验证非法的JWT能否正常通过拦截器的校验 2.可靠性测试&#xff1a; 3.易用性测试 …...

案例驱动的 IT 团队管理:创新与突破之路:第五章 创新管理:从机制设计到文化养成-5.2 技术决策民主化-5.2.3草根创新的孵化土壤构建

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 草根创新的孵化土壤构建&#xff1a;IT团队技术决策民主化的底层实践1. 背景与挑战&#xff1a;传统技术决策体系的失效1.1 行业现状与痛点1.2 草根创新的价值潜力 2. 机制设…...

探秘Python 工匠:案例、技巧与工程实践:解锁Python进阶的通关秘籍

重要的放前面 Python 工匠&#xff1a;案例、技巧与工程实践 探秘Python 工匠&#xff1a;案例、技巧与工程实践&#xff1a;解锁Python进阶的通关秘籍 在Python的编程世界中&#xff0c;从入门小白到技术大牛的进阶之路往往充满挑战。Python工匠&#xff1a;案例、技巧与工…...