网络爬虫【爬虫库request】

news2025/3/24 13:19:09

  我叫不三不四,很高兴见到大家,欢迎一起学习交流和进步

今天来讲一讲爬虫

Requests是Python的一个很实用的HTTP客户端库,完全满足如今网络爬虫的需求。与Urllib对比,Requests不仅具备Urllib的全部功能;在开发使用上,语法简单易懂,完全符合Python优雅、简洁的特性;在兼容性上,完全兼容Python 2和Python 3,具有较强的适用性。

请求方式

HTTP的请求方式分为GET和POST

GET请求

url语法如下:

# 不带参数
url_without_params = "https://www.baidu.com/"

# 带参数 wd
url_with_params = "https://www.baidu.com/s?参数名=参数值"

注:如果一个URL有多个参数,参数之间用“&”连接,并且,request对于带参数的url请求有两种处理方式:

import requests

# 第一种方式
r = requests.get('https://www.baidu.com/s?参数名=参数值')

# 第二种方式
url = 'https://www.baidu.com/s'
params = {'参数名': '参数值'}
# 左边 params 在 GET 请求中表示设置参数
r = requests.get(url, params=params)

# 输出生成的 URL
print(r.url)

对于动态变化的参数,我们可以采用%s来占位的方式来处理:

url_template = 'https://www.baidu.com/s?参数名=%s'
search_term = '参数值'

# 使用字符串格式化将搜索词插入到URL中
formatted_url = url_template % search_term

print(formatted_url)

这样输出的将会是:

https://www.baidu.com/s?参数名=参数值

POST请求

POST请求常用来提交表单,表单数据就是POST的请求参数。在 requests 中实现POST请求时,需要设置 data 参数,数据格式可以是字典、元组、列表或JSON。不同格式各有优势。

# 字典类型
data = {'key1': 'value1', 'key2': 'value2'}

# 元组或列表
# 这里应该是元组的列表,而不是元组中包含元组
tuple_list = (('key1', 'value1'), ('key2', 'value2'))

# JSON
import json

# 将字典转换为JSON
data_json = json.dumps(data)

# 发送POST请求
import requests
r = requests.post("https://www.baidu.com/", data=data_json)
print(r.text)

tips:什么是JOSN:

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript编程语言的一个子集,但是它是独立于语言的,许多不同的编程语言都支持生成和解析JSON数据,使其成为理想的数据交换语言。

JSON是构建在两种结构之上的:


1. 键值对:数据以`名称/值`对的形式存储,其中名称(或称为键)是一个字符串,而值可以是字符串、数字、数组、布尔值或另一个JSON对象。

2. 数组:数据以有序的列表形式存储,列表中的每个元素可以是字符串、数字、数组、布尔值或另一个JSON对象。

一个典型的JSON对象示例如下:

{
  "name": "John Doe",
  "age": 30,
  "is_student": false,
  "hobbies": ["reading", "gaming", "sports"],
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "CA",
    "zip": "12345"
  }
}

在这个例子中,`name`、`age`、`is_student`、`hobbies`和`address`是键,而它们对应的值分别是字符串、数字、布尔值、字符串数组和另一个JSON对象。

JSON因其简洁和易于解析的特性,在Web开发中被广泛用于客户端和服务器之间的数据交换。例如,当一个Web应用从服务器请求数据时,服务器通常会以JSON格式返回数据,然后Web应用可以使用JavaScript轻松地解析这些数据并更新用户界面。

`requests.Response`对象的属性和方法


1.基本响应信息

• `r.status_code`

• 作用:返回响应状态码(如200、404、500等)。

• 使用场景:判断请求是否成功。


• `r.reason`

• 作用:返回响应状态码的文本描述(如`OK`、`Not Found`等)。

• 使用场景:提供更详细的响应状态描述。


• `r.url`

• 作用:返回实际请求的URL(可能经过重定向后的最终URL)。

• 使用场景:确认请求的最终地址。


2.响应内容

• `r.raw`

• 作用:返回原始响应体,可以通过`r.raw.read()`读取。

• 使用场景:处理二进制数据或流式响应。


• `r.content`

• 作用:以字节方式返回响应体,需要手动解码。

• 使用场景:处理二进制文件(如图片、视频)。


• `r.text`

• 作用:以字符串方式返回响应体,会自动根据响应头的`Content-Type`或`Content-Encoding`解码。

• 使用场景:处理文本内容(如HTML、JSON)。


• `r.json()`

• 作用:将响应体解析为JSON对象。

• 使用场景:处理JSON格式的响应数据。


• `r.encoding`

• 作用:返回响应的编码格式(如`utf-8`)。

• 使用场景:确认或修改响应的编码。


• `r.apparent_encoding`

• 作用:基于响应内容分析得出的编码格式(可能与`r.encoding`不同)。

• 使用场景:当`r.encoding`为空或不准确时,作为备选编码。


3.响应头和Cookie

• `r.headers`

• 作用:以字典形式返回响应头,字典键不区分大小写。

• 使用场景:获取响应头中的信息(如`Content-Type`、`Content-Length`等)。


• `r.cookies`

• 作用:返回请求后的Cookie对象。

• 使用场景:获取服务器返回的Cookie信息。


• `r.links`

• 作用:返回响应头中的`Link`字段内容,以字典形式存储。

• 使用场景:处理分页或资源链接。


4.重定向和跳转

• `r.history`

• 作用:返回一个包含所有中间跳转响应的列表。

• 使用场景:跟踪请求的跳转路径。


• `r.is_redirect`

• 作用:判断响应是否是重定向(如301、302状态码)。

• 使用场景:控制重定向逻辑。


• `r.is_permanent_redirect`

• 作用:判断响应是否是永久重定向(301状态码)。

• 使用场景:处理需要更新URL的重定向。


• `r.next`

• 作用:返回下一个响应对象(如果存在重定向)。

• 使用场景:手动处理重定向时获取下一个响应。


5.性能和资源管理

• `r.elapsed`

• 作用:返回从发送请求到收到响应的总耗时(`timedelta`对象)。

• 使用场景:用于性能测试或监控请求的响应时间。


• `r.close()`

• 作用:关闭响应对象,释放资源。

• 使用场景:在使用`r.raw`或处理大文件时,手动关闭响应对象以释放资源。


6.迭代和流式处理

• `r.iter_content(chunk_size=1, decode_unicode=False)`

• 作用:以迭代的方式逐块读取响应内容,适合处理大文件。

• 参数:

• `chunk_size`:每次读取的块大小(以字节为单位)。

• `decode_unicode`:是否将内容解码为Unicode。

• 使用场景:下载大文件时逐块写入磁盘,避免占用过多内存。


• `r.iter_lines(decode_unicode=False, chunk_size=512)`

• 作用:以迭代的方式逐行读取响应内容,适合处理文本数据。

• 参数:

• `decode_unicode`:是否将内容解码为Unicode。

• `chunk_size`:每次读取的块大小。

• 使用场景:处理日志文件或文本数据时逐行读取。


7.请求信息

• `r.request`

• 作用:返回发送的请求对象(`requests.PreparedRequest`)。

• 使用场景:调试或查看发送的请求细节(如请求头、请求体等)。


8.异常处理

• `r.raise_for_status()`

• 作用:如果响应状态码表示请求失败(非200响应),则抛出异常。

• 使用场景:在需要严格处理请求失败时,自动抛出异常。

提交复杂的请求

在进行网络爬虫开发或与 Web API 交互时,我们常常需要对 HTTP 请求进行定制化处理,以满足各种复杂场景的需求。本文将详细介绍如何使用 Python 的 Requests 库实现复杂网络访问,包括添加请求头、使用代理 IP、证书验证、超时设置以及使用 Cookies 等常用功能。


一、添加请求头

在 HTTP 请求中,请求头(Headers)是客户端向服务器发送额外信息的重要载体,例如指定客户端的类型、语言、接受的数据类型等。通过设置请求头,可以模拟不同的浏览器或客户端行为,从而提高请求的成功率和兼容性。

以下是添加请求头的代码示例:

import requests

# 定义请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br"
}

# 发送请求并设置 headers 参数
response = requests.get("https://example.com", headers=headers)

# 打印响应内容
print(response.text)


在上述代码中,我们首先定义了一个名为`headers`的字典,其中包含了常见的请求头字段,如`User-Agent`、`Accept-Language`和`Accept-Encoding`。然后在`requests.get`方法中通过`headers`参数将该字典传递给请求,从而在发送请求时附加了这些自定义的请求头信息。


二、使用代理 IP

在某些情况下,我们可能需要通过代理服务器来发送请求,例如隐藏真实 IP 地址、访问受限地区的内容等。Requests 库支持使用代理 IP,其使用方法与添加请求头类似,只需设置`proxies`参数即可。

以下是使用代理 IP 的代码示例:

import requests

# 定义代理 IP
proxies = {
    "http": "http://123.45.67.89:8080",
    "https": "https://123.45.67.89:8080"
}

# 发送请求并设置 proxies 参数
response = requests.get("https://example.com", proxies=proxies)

# 打印响应内容
print(response.text)



在代码中,`proxies`是一个字典,其键分别为`"http"`和`"https"`,对应的值是代理服务器的地址和端口号。通过设置`proxies`参数,Requests 库会将请求通过指定的代理服务器发送出去。

需要注意的是,在使用代理 IP 时,应确保代理服务器的地址和端口号是有效的,并且代理服务器支持目标网站的访问。此外,代理服务器可能会对请求进行限制或修改,因此在使用过程中需要根据实际情况进行调试和优化。


三、证书验证

在与 HTTPS 网站进行交互时,证书验证是一个重要的安全机制。默认情况下,Requests 库会对 HTTPS 证书进行验证,以确保通信的安全性。然而,在某些开发或测试环境中,我们可能需要关闭证书验证,或者使用自定义的证书文件。

以下是证书验证的代码示例:


关闭证书验证

import requests

# 发送请求并关闭证书验证
response = requests.get("https://example.com", verify=False)

# 打印响应内容
print(response.text)



在上述代码中,通过将`verify`参数设置为`False`,可以关闭对 HTTPS 证书的验证。这在开发过程中用于测试或访问自签名证书的网站时非常有用,但在生产环境中不建议关闭证书验证,因为这会降低通信的安全性。


使用自定义证书文件
 

import requests

# 发送请求并指定证书文件路径
response = requests.get("https://example.com", verify="/path/to/certificate.pem")

# 打印响应内容
print(response.text)


如果需要使用自定义的证书文件进行验证,可以将`verify`参数的值设置为证书文件的路径。这在访问需要特定证书验证的网站时非常有用,例如企业内部的 HTTPS 服务。


四、超时设置

在网络请求过程中,由于网络延迟、服务器响应缓慢等原因,可能会导致请求长时间没有得到响应。为了避免程序无限等待,可以通过设置超时时间来限制请求的等待时间。

以下是超时设置的代码示例:

import requests

# 发送请求并设置超时时间为 5 秒
try:
    response = requests.get("https://example.com", timeout=5)
    print(response.text)
except requests.exceptions.Timeout:
    print("请求超时")


在代码中,通过设置`timeout`参数的值为`5`,表示请求的超时时间为 5 秒。如果在 5 秒内没有收到服务器的响应,Requests 库会抛出一个`Timeout`异常。通过捕获该异常,可以对超时情况进行相应的处理,例如重试请求或提示用户。

需要注意的是,超时时间的设置应根据实际需求进行调整。如果目标网站的响应速度较慢,可以适当增加超时时间;如果对响应速度要求较高,可以适当减少超时时间。


五、使用 Cookies

Cookies 是服务器存储在客户端的一小段文本信息,用于标识用户身份、记录用户偏好等。在使用 Requests 库发送请求时,可以通过设置`cookies`参数来使用 Cookies,从而实现会话管理等功能。

以下是使用 Cookies 的代码示例:
(从字符串转换 Cookies)

import requests

# 从浏览器获取的 Cookies 字符串
temp_cookies = "cookie1=value1; cookie2=value2"

# 将 Cookies 字符串转换为字典
cookies = {}
for cookie in temp_cookies.split("; "):
    key, value = cookie.split("=")
    cookies[key] = value

# 发送请求并设置 cookies 参数
response = requests.get("https://example.com", cookies=cookies)

# 打印响应内容
print(response.text)


在上述代码中,`temp_cookies`是从浏览器的开发者工具中获取的 Cookies 字符串。通过两次分割操作,第一次以`"; "`分割得到列表 A,第二次对列表 A 中的每个元素以`"="`分割得到字典的键值对,从而将 Cookies 字符串转换为字典格式。然后在`requests.get`方法中通过`cookies`参数将该字典传递给请求,即可在请求中使用这些 Cookies。


使用 RequestsCookieJar 对象

import requests

# 发送请求并获取服务器返回的 Cookies
response = requests.get("https://example.com")
cookies = response.cookies

# 打印 Cookies 信息
print(cookies)

# 再次发送请求并使用获取到的 Cookies
response = requests.get("https://example.com", cookies=cookies)

# 打印响应内容
print(response.text)


在代码中,当程序发送请求时(不设置参数`cookies`),Requests 库会自动生成一个`RequestsCookieJar`对象,该对象用于存放服务器返回的 Cookies 信息。通过`response.cookies`可以获取到该对象,然后在后续的请求中通过`cookies`参数将该对象传递给请求,从而实现 Cookies 的传递和使用。


Cookies 的读写操作

如果需要将 Cookies 信息持久化存储,可以使用`http`模块实现 Cookies 的读写操作。此外,还可以将 Cookies 以字典形式写入文件,这种方法相对简单,但安全性较低。以下是将 Cookies 以字典形式写入文件的代码示例:

import json

# 将 Cookies 以字典形式写入文件
with open("cookies.json", "w") as f:
    json.dump(cookies, f)

# 从文件中读取 Cookies
with open("cookies.json", "r") as f:
    cookies = json.load(f)

# 打印读取到的 Cookies
print(cookies)



在代码中,通过`json`模块的`dump`方法将 Cookies 字典写入文件,通过`load`方法从文件中读取 Cookies 字典。这种方法可以方便地将 Cookies 信息保存到本地文件中,以便在后续的程序运行中能够重复使用。

下载与上传文件

文件下载

用Python的`requests`库从网络上下载图片并保存到本地的基本示例:

import requests

# 图片的URL
url = 'https://www.python.org/static/img/python-logo.png'

# 发送GET请求
r = requests.get(url)

# 检查请求是否成功
if r.status_code == 200:
    # 打开一个文件用于写入二进制数据
    with open('python.jpg', 'wb') as f:
        # 将图片内容写入文件
        f.write(r.content)
    print("图片已成功下载并保存为 python.jpg")
else:
    print("请求失败,状态码:", r.status_code)

代码解释:
1. 导入库:

• `import requests`:导入`requests`库,用于发送HTTP请求。
2. 设置URL:

• `url='
3. 发送请求:

• `r = requests.get(url)`:使用`requests.get()`方法发送GET请求到指定的URL。
4. 检查响应状态码:

• `if r.status_code == 200:`:检查响应的状态码是否为200(表示请求成功)。


5. 保存文件:

• `with open('python.jpg', 'wb') as f:`:以二进制写入模式打开一个文件,文件名为`python.jpg`。

• `f.write(r.content)`:将响应内容(图片的二进制数据)写入文件。


6. 关闭文件:

• 使用`with`语句自动管理文件的打开和关闭,不需要显式调用`f.close()`。


7. 错误处理:

• 如果请求失败(状态码不是200),打印错误信息。

文件上传

文件上传的逻辑是把数据以字节流的形式上传到服务器上,再由服务器上传接收内容,文件上传有一定难度,难点在于服务器接收规则不同。

分析请求

首先通过Fiddler抓包工具来分析微博的发布过程中的网络请求信息:


(1)访问微博并准备抓包

• 访问微博:在浏览器中输入`

• 单击“高级”按钮:在微博页面上,可能存在一些高级选项或设置按钮,单击它可能会触发一些额外的网络请求或页面功能,为后续的抓包操作提供更多的信息。

• 使用Fiddler抓包:

• Fiddler是一款网络调试工具,可以捕获和分析所有客户端和服务器之间的HTTP/HTTPS通信。

• 由于在发送微博时,网页会发生302跳转(即浏览器会自动跳转到另一个页面),这会导致Chrome浏览器清空请求信息,使得抓取难度较大。因此,使用Fiddler可以更有效地捕获这些请求信息,因为它不会受到浏览器自动跳转的影响,能够完整地记录整个请求过程。


(2)发布微博并查看抓包信息

• 单击“选择文件”:在微博发布页面上,单击“选择文件”按钮,选择一张图片文件。这一步是为了模拟发布微博时上传图片的过程,上传图片会触发一个网络请求,将图片文件发送到微博服务器。

• 输入发布内容:在微博发布框中输入“Python爬虫”,这是微博的正文内容。输入内容后,微博客户端会将这些内容作为请求的一部分发送到服务器。

• 单击“发布”按钮:最后单击“发布”按钮,这会触发微博的发布请求。微博客户端会将图片文件、正文内容以及其他相关信息(如用户身份验证信息等)打包成一个HTTP请求,发送到微博服务器。

• 查看Fiddler抓取的请求信息:Fiddler会捕获上述过程中所有的网络请求和响应信息。这些信息包括请求的URL、请求方法(如POST)、请求头(包含用户身份验证信息、内容类型等)、请求体(包含微博正文和图片文件等)、响应状态码以及响应内容等。通过查看这些信息,可以了解微博发布过程中的数据传输细节,例如请求的格式、服务器的响应等,这对于分析微博的网络交互机制、开发与微博相关的程序(如爬虫)等非常有帮助。

从图得知,该请求方式是POST, QueryString是POST的请求参数data, Content-type是上传文件,三个Content-Disposition分别对应发布内容、发布图片和设置分组可见。代码实现如下:

url = 'https://weibo.cn/imblog/sendmblog?rl=0&st=bd6702'
cookies = {'xxx': 'xxx'}
files = {
    'content': (None, 'Python 爬虫'),
    'pic': ('pic', open('test.png', 'rb')),
    'image/png', 'visible': (None, '0')
}
r = requests.post(url, files=files, cookies=cookies)
print(r.status_code)

POST数据对象是以文件为主的,上传文件时使用files参数作为请求参数。Requests对提交的数据和文件所使用的请求参数做了明确的规定。
参数files也是以字典形式传递的,每个Content-Disposition为字典的键值对,Content-Disposition的name为字典的键,value为字典的值。

 

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

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

相关文章

aws(学习笔记第三十四课) dockerized-app with asg-alb

aws(学习笔记第三十四课) dockerized-app with asg-alb 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer 学习内容: 使用cdk生成dockerized-app并使用AutoScalingGroup和ApplicationLoaderBalancer在AutoScalingGroup中使用efs以及R…

嵌入式c学习七

c语言指针:程序需要载入内存中运行,在32bit系统中内存地址的范围是:0x0000 0000-0xFFFF FFFF,内存大小为4GB,内存地址指的是内存单元的编号是固定的,本身就是一个整数,对于32bit系统&#xff0c…

软考通关利器:中级软件设计师结构化开发核心考点

简介: 作为国家软考中级认证的核心科目,“软件设计师” 结构化开发能力是职业进阶的黄金敲门砖。本模块聚焦考试大纲高频考点,深度解析需求建模、结构化分析方法(SA/SD)、模块设计原则、数据流图(DFD&#…

【Linux】Hadoop-3.4.1的伪分布式集群的初步配置

配置步骤 一、检查环境 JDK # 目前还是 JDK8 最适合 Hadoop java -version echo $JAVA_HOME Hadoop hadoop version echo $HADOOP_HOME 二、配置SSH免密登录 Hadoop需要通过SSH管理节点(即使在伪分布式模式下) sudo apt install openssh-server …

楼宇自控系统的结构密码:总线与分布式结构方式的差异与应用

在现代建筑中,为了实现高效、智能的管理,楼宇自控系统变得越来越重要。它就像建筑的 智能管家,可自动控制照明、空调、通风等各种机电设备,让建筑运行更顺畅,还能节省能源成本。而在楼宇自控系统里,有两种关…

Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)

前言 近期在抠lerobot源码时,看到其封装了ALOHA ACT、diffusion policy、π0时,我就在想,lerobot其实可以再封装下idp3 我甚至考虑是否从我联合带的那十几个具身研究生中选几个同学做下这事,对他们也是很好的历练然当25年3.18日…

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型? 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…

计划管理工具应该具备的能(甘特图)

在当今快节奏的项目管理环境中,高效地规划和跟踪项目进度是至关重要的。甘特图,作为项目管理领域的经典工具,以其直观的时间轴和任务分配方式,深受项目管理者的青睐。 随着数字化时代的到来,甘特图线上编辑器应运而生&…

简单实用!百度AI + Raphael AI = 免费生图

简单实用!百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步:下载或截取一些好看的图片当参考图片 第二步:用百度AI描述你想要的图片&…

2025-03-22 学习记录--C/C++-C 库函数 - getchar()

C 库函数 - getchar() ⭐️ C 标准库 - <stdio.h> &#xff08;一&#xff09;、函数声明 &#x1f36d; int getchar(void)从标准输入 stdin 获取一个字符&#xff08;一个无符号字符&#xff09;。 参数&#xff1a;&#x1f380; NA 返回值&#xff1a;&#x1f38…

APM 仿真遥控指南

地面站开发了一段时间了&#xff0c;由于没有硬件&#xff0c;所以一直在 APM 模拟器中验证。我们已经实现了 MAVLink 消息接收和解析&#xff0c;显示无人机状态&#xff0c;给无人机发送消息&#xff0c;实现一键起飞&#xff0c;飞往指定地点&#xff0c;降落&#xff0c;返…

BBR 和 CUBIC 对长肥管道的不同反应

有个关于 CUBIC(等一众 AIMD-based cc) 和 BBR 在长肥管道中的行为比较挺有趣&#xff0c;它们的表现竟然截然相反&#xff1a; CUBIC 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越低&#xff1b;BBR 流共存&#xff0c;RTT 越大&#xff0c;Goodput 越高。 前一个被看…

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…

Spring框架入门指南:从Hello World到IOC容器

第一章&#xff1a;Spring框架的介绍 1. Spring框架的概述 Spring是一个开放源代码的设计层面框架&#xff0c;它解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。 Spring是于2003 年兴起的一个轻量级的Java开发框架&…

嵌入式电路设计软件个人安装步骤分享

各位小伙伴大家好,今天给大家分享一个,电路设计软件的安装方法,希望对大家有所帮助。 一、下载【Multisim14.0安装包】: 链接:夸克网盘分享 提取码:kHSP 电脑安装Multisim14.0并且汉化 准备安装包以及汉化包双击“NI_Circuit_Design_Suite_14_0【海量免费资源:kebaiwan…

git | 回退版本 并保存当前修改到stash,在进行整合。[git checkout | git stash 等方法 ]

目录 一些常见命令&#xff1a; git 回退版本 一、临时回退&#xff08;不会修改历史&#xff0c;可随时回到当前版本&#xff09; 方法1&#xff1a;git checkout HEAD~1 二、永久回退&#xff08;改变分支指向&#xff09; 方法2&#xff1a;git reset 1. 保留修改&am…

【Java SE】单例设计模式

参考笔记&#xff1a;深入理解Java设计模式&#xff1a;单例模式及其饿汉式与懒汉式的对比,-CSDN博客 目录 1.什么是设计模式 2.经典设计模式 3.单例设计模式&#xff08;static属性/方法经典使用场景 &#xff09; 3.1 饿汉式单例模式 3.2 懒汉式单例模式 4.补充 1.什么…

安全守护:反光衣检测技术的革新之路

视觉分析助力船上工人反光衣检测 在现代工业生产与作业环境中&#xff0c;安全始终是首要考虑的因素。对于水上作业&#xff0c;如船舶维护、海上施工等场景&#xff0c;工人穿戴反光衣是预防事故、提高可见性的重要措施。然而&#xff0c;传统的人工检查方式不仅效率低下&…

OSCP准备靶场联系-Kioptrix 1

oscp 准备 Kioptrix 1 信息收集 ifconfig 确认自己的电脑ip&#xff0c;nmap收集通往段ip&#xff0c;确认靶机IP nmap 重点关注服务版本 nmap -sn 192.168.1.0/24 # 扫描网段内存活主机&#xff0c;不进行端口扫描[1,10](ref) nmap -sP 192.168.1.1 # 传统Ping扫描…

【工具变量】中国各地级市是否属于“信息惠民国家试点城市”匹配数据(2010-2024年)

数据来源&#xff1a;国家等12部门联合发布的《关于加快实施信息惠民工程有关工作的通知》 数据说明&#xff1a;内含原始文件和匹配结果&#xff0c;当试点城市在2014年及以后&#xff0c;赋值为1&#xff1b;试点城市在2014年之前或该城市从未实施信息惠民试点工程&#x…