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

初学Python爬虫

文章目录

  • 前言
    • 一、 爬虫的初识
      • 1.1 什么是爬虫
      • 1.2 爬虫的核心
      • 1.3 爬虫的用途
      • 1.4 爬虫分类
      • 1.5 爬虫带来的风险
      • 1.6. 反爬手段
      • 1.7 爬虫网络请求
      • 1.8 爬虫基本流程
    • 二、urllib库初识
      • 2.1 http和https协议
      • 2.2 编码解码的使用
      • 2.3 urllib的基本使用
      • 2.4 一个类型六个方法
      • 2.5 下载网页数据
      • 2.6 带单个参数的页面抓取(get请求)
      • 2.7 定制request使用ua反爬
      • 2.8 多字段的字符转码
      • 2.9 post请求的使用
      • 2.10 异常处理
    • 三、 requests请求的使用
      • 3.1 下载requests包
      • 3.2 requests的基本使用
      • 3.3 响应的保存
      • 3.4 响应对象的其他属性
      • 3.5 用户代理介绍
      • 3.6 构建ua池
      • 3.7 带参数的请求
      • 3.8 通过面向对象的方式来获取数据
      • 3.9 post请求
  • 总结


前言

在当今信息爆炸的时代,互联网上的数据呈指数级增长,如何高效地获取、处理和分析这些数据成为一项重要的技能。网络爬虫(Web Crawler)作为一种自动化数据采集工具,能够帮助我们快速地从海量网页中提取有价值的信息,广泛应用于搜索引擎、数据分析、市场调研、舆情监控等领域。

学习爬虫技术不仅能提升我们的编程能力,还能培养数据思维,为后续的数据挖掘、机器学习等方向奠定基础。然而,爬虫开发并非简单的“请求-解析”过程,它涉及HTTP协议、HTML解析、反爬机制应对、数据存储等多个技术点,同时还需遵守相关法律法规,合理合法地使用爬虫技术。

本教程将从基础概念入手,逐步介绍爬虫的核心技术,并结合实际案例,帮助读者掌握爬虫开发的完整流程。无论你是编程初学者,还是希望提升数据采集能力的开发者,都可以通过本教程系统地学习爬虫技术,并将其应用于实际项目中。


一、 爬虫的初识

1.1 什么是爬虫

在这里插入图片描述

如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的数据

  • 解释1: 通过一个程序,根据url(http://www.taobao.com)进行爬取网页,获取有用信息

  • 解释2: 使用程序模拟浏览器,去向服务器发送请求,获取响应信息

1.2 爬虫的核心

  • 爬取网页:爬取整个网页 包含了网页中所有得内容

  • 解析数据:将网页中你得到的数据 进行解析

  • 难点:爬虫和反爬虫之间的博弈

1.3 爬虫的用途

  • 数据分析/人工数据集

  • 社交软件冷启动

  • 舆情监控

  • 竞争对手监控

在这里插入图片描述

1.4 爬虫分类

  • 通用爬虫(不常用):抓取系统重要组成部分,抓取的是一整张页面的数据。

  • 聚焦爬虫:建立在通用爬虫的基础上,抓取的是页面中特定的局部内容。

  • 增量式爬虫:检测网站中数据更新的情况,只抓取网站中最新更新的数据。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5 爬虫带来的风险

  • 爬虫干扰了被访问网站的正常运营

  • 爬虫抓取了受到法律保护的特定类型的数据或信息

1.6. 反爬手段

在这里插入图片描述

1.7 爬虫网络请求

请求过程: 客户端,指web浏览器向服务器发送请求

请求分为四部分:

  • 请求网址 --request url

  • 请求方法 --request methods

  • 请求头 – request header

  • 请求体 – request body

可以通过F12查看请求响应

1.8 爬虫基本流程

  • 确认目标:目标url:www.baidu.com
  • 发送请求: 发送网络请求,获取到特定的服务端给你的响应
  • 提取数据:从响应中提取特定的数据jsonpath/xpath/re
  • 保存数据:本地(html、json、txt)、数据库

注意: 获取到的响应中,有可能会提取到还需要继续发送请求的ur1,可以拿着解析到的url继续发送请求


二、urllib库初识

2.1 http和https协议

概念和区别

http协议:超文本传输协议,默认端口号是80

  • 超文本:不仅仅限于文本,还包括图片、音频、视频

  • 传输协议:指使用共用约定的固定格式来传递转换成字符串的超文本内容

https协议: http+ ssl(安全套接字层)默认端口号是443

  • 带有安全套接字层的超文本传输协议

  • ssl对传输的内容进行加密

https比http更安全,但是性能更低

2.2 编码解码的使用

图片、视频、音频需要以bytes类型的格式来存储

# 编码--encode() 将str转变为对应的二进制
str = '周杰伦'
print(str.encode())# 解码--decode() 将二进制转为str
str = b'\xe5\x91\xa8\xe6\x9d\xb0\xe4\xbc\xa6'
print(str.decode())

2.3 urllib的基本使用

# 前提:获取数据的前提要联网!!!!# 需求:使用urllib获取百度首页的源码# 1. 导入urllib包(不用安装)
import urllib.request# 1.定义一个url(就是需要访问的地址)
url = 'http://www.baidu.com'# 2.模拟浏览器向服务器发送请求
# response包含页面源码和响应头信息等等
response = urllib.request.urlopen(url)# 3.获取响应中的页面源码(只要源码)
# read方法返回的是带b的二进制的数据
content = response.read()# 4.打印数据
# print(content) 二进制# 5.该编码格式(解码 decode方法)
# decode的默认解码就是utf-8 因而也可以省略参数
print(content.decode('utf-8'))

2.4 一个类型六个方法

# 基础操作
import urllib.requesturl = 'http://www.baidu.com'response = urllib.request.urlopen(url)# 一个类型和六个方法# 判断类型
# <class 'http.client.HTTPResponse'>
# print(type(response))# read()方法是单字节的读取数据(速度慢)
# content = response.read()
# 表示只读5个字节
# content = response.read(5)
# print(content)# readline()方法 读取一行(速度快)
# content = response.readline()
# print(content)# readlines()方法 读取所有行
# content = response.readlines()
# print(content)# 返回状态码 200表示成功 证明逻辑是对的
print(response.getcode())# 返回url地址
print(response.geturl())# 返回状态信息和响应头
print(response.getheaders())

2.5 下载网页数据

# 可以下载文件/音频/视频.....
# 适用于批量下载import urllib.requesturl_page = 'http://baidu.com'# 使用urlretrieve()方法
# 第一个参数是url地址,第二个参数是保存的文件名
# 返回的是html文件,所以后缀写html
# urllib.request.urlretrieve(url_page, 'baidu.html')# 下载图片
url_img = 'https://tse1-mm.cn.bing.net/th/id/OIP-C.hMxUTa_ah0EEEKjzMrcKZgHaJF?w=204&h=318&c=7&r=0&o=7&cb=iwp1&dpr=1.1&pid=1.7&rm=3.jpg'
urllib.request.urlretrieve(url_img, 'img.jpg')# 下载视频(mp4)不再演示

2.6 带单个参数的页面抓取(get请求)

import urllib.request
import urllib.parse# url = "http://www.baidu.com/s?ie=UTF-8&wd=%E8%94%A1%E5%BE%90%E5%9D%A4"
# url = "http://www.baidu.com/s?ie=UTF-8&wd=蔡徐坤"
# 需要将中文进行编码 导入quote即可
name = urllib.parse.quote("蔡徐坤")
# print(name)# 将%E8%94%A1%E5%BE%90%E5%9D%A4 转化为 蔡徐坤
# 使用unquote即可
# rename = urllib.parse.unquote(name)
# print(rename)# 可以用户自己输入名字进行修改name
url = "http://www.baidu.com/s?ie=UTF-8&wd=" + name
response = urllib.request.urlopen(url)
content = response.read().decode()
print(content)

2.7 定制request使用ua反爬

再来了解一下ua反爬

user Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引、浏览器语言、浏览器插件等。

通俗的讲: ua能使得浏览器认为是请求不来自我们的爬虫程序,而是来自浏览器本身

import urllib.request
import urllib.parsename = urllib.parse.quote("蔡徐坤")url = "https://www.baidu.com/s?ie=UTF-8&wd=" + name
# 定制request
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=header)
response = urllib.request.urlopen(request)
content = response.read().decode()
print(content)

2.8 多字段的字符转码

# 当url为多个参数的时候进行转码
import urllib.parse
import urllib.request# http://www.baidu.com/s?wd=周杰伦&sex=男# 必须用字典才可以
data = {"wd": "周杰伦","sex": "男"
}a = urllib.parse.urlencode(data)
# print(a)
# 获取网页源码
url = "https://www.baidu.com/s?" + a
# print(url)
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=header)
response = urllib.request.urlopen(request)
content = response.read().decode()
print(content)

2.9 post请求的使用

import json
import urllib.request
import urllib.parseurl = 'https://fanyi.baidu.com/sug'# 构建post请求的数据 字典形式
data = {'kw': 'translate'
}
# post请求必须添加编码 转变为二进制的数据
data = urllib.parse.urlencode(data).encode('utf-8')
# print(data)
request = urllib.request.Request(url = url, data = data)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
# 获取的数据是json格式 字符串被编码了,转化为字典字符串正常显示
obj = json.loads(content)
print(obj,type(obj))

2.10 异常处理

import urllib.request
url = 'http://www.baidu.com1'
try:response = urllib.request.urlopen(url)print(response.read().decode('utf-8'))
except urllib.error.URLError:print("发送错误")

三、 requests请求的使用

上面单纯使用urllib的方式,显然麻烦了不少,并且不易于理解,那么有没有更简单更容易上手的方法呢,有的兄弟有的,可以直接使用requests的方式。

3.1 下载requests包

方式一:使用命令行安装

  1. 打开命令行cmd(win + R)
  2. 输入pip -V 查看pip是否正常安装(python正常安装的情况下,pip自动安装)
  3. 输入 pip install requests(默认国外地址,安装较慢,这里使用国内地址)
 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 等待安装成功提示即可

方式二:使用pycharm直接安装

在右下脚找到python软件包,搜索requests下载安装即可(也可以使用国内地址进行安装)

Tip: 可以使用pip uninstall 包名 来卸载指定的包。

3.2 requests的基本使用

# 爬取百度页面的源码# 1. 导包
import requests# 2. 发送请求
# 进入百度查看是否是get请求
url = 'http://www.baidu.com'
response = requests.get(url)
# print(response) #<Response [200]>可以直接获取响应码# 获取相应
# text属性会自动寻早一个解码方式去解码会出现报错
# 解决方式为 讲response直接加入encoding即可
# response.encoding = 'utf-8'
# print(response.text)# 方式二 使用content方法 加上解码即可
print(response.content.decode())

3.3 响应的保存

  1. 图片的保存
# 用resquests来保存一张图片import requests
url = 'https://ww4.sinaimg.cn/mw690/0078WY2egy1i139fqp2wqj31jk2bcn61'
# 先判断get请求
res = requests.get(url)
# b形式数据图片存储
# print(res.content)
# 通过文件的形式保存 一定要带上b模式啊
with open('img.jpg', 'wb') as f:f.write(res.content)
  1. 百度页面的保存
import requests
url = 'http://www.baidu.com'
res = requests.get(url)
with open("baidu.html", "w",encoding="utf-8") as f:f.write(res.content.decode())

3.4 响应对象的其他属性

import requests
url = 'http://www.baidu.com'
res = requests.get(url)
#打印响应的ur1
print(res.url)#打印响应对象的请求头
print(res.request.headers)# 打印响应头
print(res.headers)

3.5 用户代理介绍

import requests
url1 = 'http://www.baidu.com'  #509723
url2 = 'https://www.baidu.com' #227# res = requests.get(url2)
# content = res.content.decode()
# print(len(content))#  使用用户代理反爬虫
# 依旧是写成字典形式
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}# 添加ua 让服务器认为是浏览器在发送请求response = requests.get(url2,headers=headers)
content = response.content.decode()
print(len(content)) # 28918

3.6 构建ua池

import random
# 构建ua池,防止多次调用被反爬# 方法1 自己写ua池
uAlist = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36','Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1','Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36'
]
# 随机获取一个ua
# print(random.choice(uAlist))# 方法2 外包生成ua
# 下载fake-useragent包
# 频繁调用的时候可能会报错
from fake_useragent import UserAgent
print(UserAgent().random)

3.7 带参数的请求

# 带参数数据的请求爬取
import requestsurl = 'https://www.baidu.com/s?ie=UTF-8'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
data = {'wd': '蔡徐坤'
}res = requests.get(url,headers=headers,params=data)
content = res.content.decode()
print(content)

3.8 通过面向对象的方式来获取数据

# 获取明星页面信息并且保存
import  requests
class Star:def __init__(self):self.url = 'https://www.baidu.com/s?ie=UTF-8'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36'}# 发送数据def send(self,params):response = requests.get(self.url,headers=self.headers,params=params)return response.text# 保存数据def save(self,content):with open('star.html','w',encoding='utf-8') as f:f.write(content)def run(self):name = input('请输入明星名称:')params = {'wd':name}content = self.send(params)self.save(content)star = Star()
star.run()

3.9 post请求

post请求: 登录注册,传输大文本内容# requests.post(url,data)# data参数接收一个字典

get跟post区别

  • get请求—比较多

  • post请求 – 比较少

  • get请求直接向服务器发送请求,获取应内容

  • post请求是先给服务器一些数据,然后再获取响应

  • get请求携带参数-- params

  • post诗求携带参数- data

# 百度翻译案例
import jsonimport requestsurl = "https://fanyi.baidu.com/sug"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
data = {"kw": "eye"
}
response = requests.post(url,headers=headers,data=data)
content = response.text
# print(content)
obj = json.loads(content)
print(obj)

总结

通过本教程的学习,我们系统地掌握了网络爬虫的基本原理和关键技术。从HTTP请求、HTML解析,到动态页面渲染、反爬策略应对,再到数据的清洗与存储,我们一步步构建了一个完整的爬虫知识体系。

爬虫技术不仅仅是一种数据采集手段,更是连接互联网世界与数据分析的桥梁。掌握爬虫技能后,我们可以高效地获取所需数据,为商业分析、学术研究、自动化运维等场景提供强大的数据支持。

然而,爬虫开发并非没有边界。在实践过程中,我们必须遵守目标网站的robots.txt协议,尊重版权和隐私,避免对服务器造成过大压力。同时,随着反爬技术的不断升级,爬虫开发者也需要持续学习,灵活应对各种挑战。

未来,随着人工智能和大数据的发展,爬虫技术将继续演进,与自然语言处理(NLP)、机器学习(ML)等技术结合,创造更大的价值。希望读者能够在本教程的基础上,进一步探索爬虫的高级应用,如分布式爬虫、智能解析等,不断提升自己的技术能力。

数据驱动未来,爬虫赋能探索! 🚀

相关文章:

初学Python爬虫

文章目录 前言一、 爬虫的初识1.1 什么是爬虫1.2 爬虫的核心1.3 爬虫的用途1.4 爬虫分类1.5 爬虫带来的风险1.6. 反爬手段1.7 爬虫网络请求1.8 爬虫基本流程 二、urllib库初识2.1 http和https协议2.2 编码解码的使用2.3 urllib的基本使用2.4 一个类型六个方法2.5 下载网页数据2…...

【CSS】Grid 的 auto-fill 和 auto-fit 内容自适应

CSS Grid 的 auto-fill 和 auto-fit /* 父元素 */ .grid {display: grid;/* 定义「网格容器」里有多少列&#xff0c;以及每列的宽度 *//* repeat 是个「重复函数」&#xff0c;表示后面的模式会被重复多次 *//* auto-fit 是一个特殊值&#xff0c;自动根据容器宽度&#xff…...

绕线机的制作与研究

绕线机的制作与研究 摘要 本文详细阐述了绕线机的制作过程,涵盖从设计规划到实际制作的各个环节。通过对绕线机工作原理的深入分析,确定了关键技术参数,并依此完成机械结构与控制系统的设计。在制作阶段,运用多种加工工艺完成零件制造与设备组装。经测试,自制绕线机性能…...

引用的使用

引用的语法 作用&#xff1a;起别名 引用的本质是指针常量 数据类型 &别名原名&#xff1b; 引用必须要初始化 引用一旦初始化&#xff0c;不能修改 不能返回局部变量的引用 引用做形参 #include<iostream> #include<string> using namespace std; //通过引用…...

css animation 动画属性

animation // 要绑定的关键帧规则名称 animation-name: slidein;// 定义动画完成一个周期所需的时间&#xff0c;秒或毫秒 animation-duration: 3s;// 定义动画速度曲线 animation-timing-function: ease;// 定义动画开始前的延迟时间 animation-delay: 1s;// 定义动画播放次数…...

Nacos源码—Nacos集群高可用分析(二)

4.集群节点的健康状态变动时的数据同步 (1)Nacos后台管理的集群管理模块介绍 在集群管理模块下&#xff0c;可以看到每个节点的状态和元数据。节点IP就是节点的IP地址以及端口&#xff0c;节点状态就是标识当前节点是否可用&#xff0c;节点元数据就是相关的Raft信息。 其中节点…...

SRAM详解

一、SRAM基础原理 定义与结构 SRAM&#xff08;Static Random-Access Memory&#xff0c;静态随机存取存储器&#xff09;是一种基于触发器&#xff08;Flip-Flop&#xff09;结构的易失性内存&#xff0c;通过交叉耦合的反相器&#xff08;6晶体管&#xff0c;6T单元&#xff…...

JavaWeb:MySQL进阶

多表设计 一对多&#xff08;多对一&#xff09; 外键 一对一 多对多 多表查询 内连接 外连接 子查询 -- 查询员工表 select * from emp;-- 查询部门表 select * from dept;-- 查询员工和部门 select * from emp, dept; -- 笛卡尔积select * from emp, dept where emp.dept_i…...

Golang 接口 vs Rust Trait:一场关于抽象的哲学对话

一、引言 在现代编程语言中&#xff0c;接口&#xff08;Interface&#xff09; 和 Trait 是实现多态和抽象行为的关键机制。它们允许我们定义行为契约&#xff0c;让不同的类型共享相同的语义接口&#xff0c;从而提升代码的复用性和扩展性。 Go 和 Rust 分别代表了两种截然…...

智算中心的搭建标准

智算中心的搭建标准主要涉及以下几个方面&#xff1a; 开放标准&#xff1a; 硬件与软件开放&#xff1a;从硬件到软件、从芯片到架构&#xff0c;都应采用开放、标准的技术。例如&#xff0c;硬件支持如 OCP、ODCC、Open19 等开放社区标准&#xff0c;软件采用如 OpenStack、K…...

商汤科技前端面试题及参考答案

有没有配置过 webpack,讲一下 webpack 热更新原理,能否自己实现一些插件? Webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具。在实际项目中,经常会对其进行配置,以满足项目的各种需求,比如处理不同类型的文件、优化代码、配置开发服务器等。 Webpack 热更…...

windows下docker的使用

找了个docker教程 Windows Docker 安装 | 菜鸟教程Windows Docker 安装 Docker 并非是一个通用的容器工具&#xff0c;它依赖于已存在并运行的 Linux 内核环境。Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境&#xff0c;因此它执行的效率几乎等同于所部署的…...

AI日报 · 2025年5月07日|谷歌发布 Gemini 2.5 Pro 预览版 (I/O 版本),大幅提升编码与视频理解能力

1、谷歌发布 Gemini 2.5 Pro 预览版 (I/O 版本)&#xff0c;大幅提升编码与视频理解能力 谷歌于5月6日提前发布 Gemini 2.5 Pro 预览版 (I/O 版本)&#xff0c;为开发者带来更强编码能力&#xff0c;尤其优化了前端与UI开发、代码转换及智能体工作流构建&#xff0c;并在WebDe…...

Redis 8.0 正式版发布,新特性很强!

就在前两天&#xff0c;Redis 8.0 正式版 (GA) 来了&#xff01;这并不是一次简单的更新&#xff0c;Redis 8.0 不仅带来了性能上的进一步提升&#xff0c;还带来一些实用的新特性与功能增强。并且&#xff0c;最重要的是拥抱 AGPLv3 重归开源&#xff01; 下面&#xff0c;简单…...

MySQL核心机制:日志系统、锁机制与事务管理的深度剖析

一.介绍 MySQL作为世界上最流行的开源关系型数据库之一&#xff0c;其强大的事务处理能力和高并发支持使其在各种复杂应用场景中得到广泛应用。MySQL的核心机制包括日志系统、锁机制和事务管理&#xff0c;这些机制共同确保了数据库的ACID特性&#xff0c;为应用程序提供了可靠…...

Mybatis标签使用 -association 绑定对象,collection 绑定集合

注意 association标签中的 select , column 属性使用 collection 标签中的 ofType 属性使用 Data public class Tours implements Serializable {private static final long serialVersionUID 1L;private Integer touId;private String tourName;private Integer guideId;pri…...

IBM BAW(原BPM升级版)使用教程Toolkit介绍

本部分为“IBM BAW&#xff08;原BPM升级版&#xff09;使用教程系列”内容的补充。 一、系统Toolkit 在 IBM Business Automation Workflow (BAW) 中&#xff0c;System Toolkit 是一组预先定义和配置好的工具、功能和组件&#xff0c;旨在帮助流程设计者和开发人员快速构建…...

排列组合算法:解锁数据世界的魔法钥匙

在 C 算法的奇幻世界里&#xff0c;排列和组合算法就像是两把神奇的魔法钥匙&#xff0c;能够帮我们解锁数据世界中各种复杂问题的大门。今天&#xff0c;作为 C 算法小白的我&#xff0c;就带大家一起走进排列和组合算法的奇妙天地。 排列算法&#xff1a;创造所有可能的顺序…...

LVGL -meter的应用

1 meter介绍 lv_meter 是 LVGL v8 引入的一种图形控件&#xff0c;用于创建仪表盘样式的用户界面元素&#xff0c;它可以模拟像速度表、电压表、温度表这类模拟表盘。它通过可视化刻度、指针、颜色弧线等来展示数值信息&#xff0c;是一种非常直观的数据展示控件。 1.1 核心特…...

MCP学习

一、MCP基础理论与核心概念 1.1 协议定义与设计目标 MCP&#xff08;Model Context Protocol&#xff09;是Anthropic公司于2024年11月开源的标准化协议&#xff0c;旨在解决大型语言模型&#xff08;LLM&#xff09;与外部工具、数据源之间的动态交互问题。其核心目标包括&…...

软件工程(三):模块的内聚模型

模块内聚的7种类型&#xff08;从低到高&#xff09; 等级类型描述示例1️⃣ 最低偶然性内聚&#xff08;Coincidental Cohesion&#xff09;模块内部的各功能毫无关系&#xff0c;随机拼凑一个模块中既有文件读写&#xff0c;又有图像压缩、还处理用户登录2️⃣逻辑性内聚&am…...

Java中字符转数字的原理解析 - 为什么char x - ‘0‘能得到对应数字

前言 在Java编程中&#xff0c;我们经常需要将字符形式的数字转换为实际的数值。有很多方法可以实现这一转换&#xff0c;比如使用Integer.parseInt()或Character.getNumericValue()等方法。但有一种简便且高效的方式是直接使用char - 0运算&#xff0c;本文将详细解析这种方法…...

View的事件分发机制

&#xff08;一&#xff09;为什么要有事件分发机制 安卓界面上面的View的层级结构是树形的&#xff0c;可能出现多个View重叠在一起的现象&#xff08;如下图&#xff09;&#xff0c;当我们点击的地方为多个View重叠的区域时&#xff0c;这个点击事件应该给谁呢&#xff1f;为…...

【C++】类和对象【下】

目录 一、再探构造函数1、测试题 二、类型转换三、static成员1. 静态成员变量2. 静态成员函数 四、友元五、内部类六、匿名对象七、对象拷贝时的编译器优化 个人主页<—请点击 C专栏<—请点击 一、再探构造函数 之前我们实现构造函数时&#xff0c;初始化成员变量主要使…...

【JS逆向基础】并发爬虫

前言&#xff1a;所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。强调多个事件在同一时间间隔发生。 1&#xff0c;进程、线程以及协程 【1】进程概念 我们都知道计算机的核心是CPU&#xff0c;它承担了所有的计算任务;而操作系统是计算…...

Android组件化 -> 基础组件进行Application,Activity生命周期分发

在lib_common基础组件模块创建上下文持有类&#xff0c;生命周期派发类 object AppContextProvider {private lateinit var application: Applicationprivate var currentActivityRef: WeakReference<Activity>? null// 应用生命周期监听器列表private val appLifecyc…...

42. PCB防静电环设计

PCB防静电环的作用 1. PCB防静电环的作用2. 防静电环设计技术点 1. PCB防静电环的作用 防静电环主要用于生产、运输、售后等环节人体会直接接触电路板的场景。 防静电环只在顶层和底层设计即可。 2. 防静电环设计技术点...

深入理解Java反射机制

java反射是java语言中一个强大而灵活的特性&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法。 为了方便理解下文&#xff0c;我先给出Cat对象 public class Cat implements jump,Run {private int age;public String name;protected String color;double he…...

嵌入式音视频通话EasyRTC基于WebRTC技术驱动智能带屏音箱:开启智能交互新体验

一、引言​ 随着智能家居市场的蓬勃发展&#xff0c;智能带屏音箱作为家庭智能交互中心的重要组成部分&#xff0c;其功能需求日益丰富。EasyRTC凭借其低延迟、高稳定性的特点&#xff0c;为智能带屏音箱带来了全新的交互体验&#xff0c;能满足用户在视频通话、远程监控、在线…...

1987-2023年各省进出口总额数据整理(含进口和出口)(无缺失)

1987-2023年各省进出口总额数据整理&#xff08;含进口和出口&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;1987-2023年 2、来源&#xff1a;各省年鉴、统计公报 3、指标&#xff1a;进出口总额&#xff08;万美元&#xff09;、进口总额&#xff08;万美…...

paddle ocr 或 rapid ocr umi ocr 只识别了图片的下部分内容 解决方案

如上图,识别的准确率其实很高,但是只识别了下半部分的内容,上半部分的内容就没有识别到,其实是程序设置有点问题,程序设置的解决方案如下: 如上图,识别的准确率其实很高,但是只识别了下半部分的内容,上半部分的内容就没有识别到,其实是程序设置有点问题,程序设置的…...

【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

如何测试 esp-webrtc-solution_solutions_doorbell_demo 例程?

软件准备 esp-webrtc-solution/solutions/doorbell_demo 例程 此例程集成了 WebSocket 传输视频流的应用 硬件准备 ESP32P4-Function-Ev-Board 环境搭建 推荐基于 esp-idf v5.4.1 版本的环境来编译此例程 若编译时出现依赖的组件报错&#xff0c;可进行如下修改&#xff…...

default和delete final和override

1.default和delete default 1.生成默认成员函数 2.仅适用于特殊成员函数&#xff08;如构造函数、析构函数、拷贝/移动操作等&#xff09; delete 1.删除函数 2.可应用于任何函数&#xff08;不限于特殊成员函数&#xff09; 2.final 和override final 用于类&#xff1a;…...

Nvidia Orin 安装onnxruntime-gpu

在用英伟达边缘设备Nvidia Orin 安装onnxruntime-gpu环境时&#xff0c; 通常会遇到很多问题。 在正常的Nvidia 服务器上安装onnxruntime-gpu 是非常简单的&#xff0c; 直接pip install onnxruntime-gpu即可&#xff0c; 但是在边缘设备上就没有这么简单了。 直接pip install…...

C++ CRTP技术(奇异递归模版模式)

C 的CRTP技术 最近了解到C的CRTP技术&#xff0c;通过博客来这里记录一下。 我们首先可以了解一下什么是CRTP技术。CRTP是C的一种高级模版变成模式。 他主要的用途有以下的几点&#xff1a; 编译时实现多态&#xff08;静态多态&#xff09;&#xff1a;通过CRTP技术&#xf…...

验证es启动成功

1. 查看命令行输出信息 在启动 Elasticsearch 时&#xff0c;命令行窗口会输出一系列日志信息。若启动成功&#xff0c;日志里通常会有类似下面的信息&#xff1a; plaintext [2025-05-06T13:20:00,000][INFO ][o.e.n.Node ] [node_name] started其中 [node_na…...

AI工场全面激活电商创意链

在当今科技飞速发展的时代&#xff0c;北京先智先行科技有限公司凭借其卓越的创新能力&#xff0c;推出了“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”这三款旗舰产品&#xff0c;在市场上掀起了不小的波澜。  传统电商设计流程&#xff0c;从需求确认到营销策…...

数 学 函数

gcd int gcd(int a,int b){while(a%b){int ca%b;ab;bc;}return b; } 错位排列 typedef long long ll; ll d(int n){if(n1) return 0;if(n2) return 1;return (n-1)*(d(n-1)d(n-2)); } 快速幂 //注意看是否有mod的需求 int q_pow(int a,int b){int ans1,tempa;while(b){if(…...

springboot集成langchain4j记忆对话

流式输出 LLM 一次生成一个标记&#xff08;token&#xff09;&#xff0c;因此许多 LLM 提供商提供了一种方式&#xff0c;可以逐个标记地流式传输响应&#xff0c;而不是等待整个文本生成完毕。 这显著改善了用户体验&#xff0c;因为用户不需要等待未知的时间&#xff0c;几…...

C语言初阶:数组

目录 0.数组要讲的知识点 1.一维数组的创建和初始化 1.1 数组的创建&#xff1a; 1.2数组实例&#xff1a; 1.3 数组的初识化&#xff1a; 例子&#xff1a; 2.一维数组的使用 例子&#xff1a; 总结&#xff1a; 3.一维数组在内存中的存储 4.二维数组的创建和初始化 4.…...

案例分享 | 攻克ADAS开发测试难题,实现单元动态测试新突破

汽车行业中的代码动态测试&#xff1a;守护智能汽车的安全与质量 在当今汽车行业&#xff0c;智能网联汽车的快速发展让软件成为了汽车的核心竞争力之一。从自动驾驶辅助系统到车载信息娱乐系统&#xff0c;汽车中的软件数量和复杂度都在不断增加。然而&#xff0c;软件的复杂…...

K8S 基于本地存储的持久卷

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、背景分析 阅读本文&#xff0c;默认您有 PV-PVC、hostPath 相关知识。 由于安全方面的考虑&#xff0c;K8S 官方并不推荐 hostPath …...

LED实验

目录 1.LED介绍 1.1LED原理图&#xff1a; 2.单片机运行代码的流程 3.进制的转换 4.C51数据类型 5.小编的单片机型号&#xff1a;STC89C52RC/LE52RC&#xff0c;最高波特率&#xff1a;9600 6.点亮一个LED 代码 步骤 代码&#xff1a; 7.LED闪烁 在STC内操作&#x…...

python+pytest接口自动化测试--日志记录

前言:代码可以直接复制使用 解决问题: 问题1:日志重复记录的问题,比如运行一个模块日志会记录很多遍(通过handlers是否存在解决的) 问题2:运行测试用例进行多个模块相互调用.日志记录不全的问题(通过共享公共的handlers解决问题) 首先写一个日志记录的工具 # 这个是个日志的…...

Android 蓝牙开发调试总结

Android 蓝牙开发调试总结 文章目录 Android 蓝牙开发调试总结一、前言二、蓝牙开发1、开关和连接控制2、相关日志3、相关广播4、demo示例 三、其他1、Android 蓝牙开发调试小结2、Android14 蓝牙启动流程3、Android14 蓝牙 BluetoothService 启动和相关代码介绍4、Android13 蓝…...

混淆矩阵(Confusion Matrix)

混淆矩阵&#xff08;Confusion Matrix&#xff09;是一个用于评估分类模型性能的工具&#xff0c;特别是在机器学习和统计学领域。它展示了模型预测结果与实际结果之间的关系。混淆矩阵通常用于二分类或多分类问题中&#xff0c;但也可以扩展到更多类别的情况。 一、混淆矩阵…...

C语言——操作符

一.操作符的分类 算术操作符&#xff1a; - * / %移位操作符&#xff1a;<< >>位操作符: & | ^赋值操作符: - * / % > & | ^单⽬操作符&#xff1a; &#xff01; -- & * - ~ sizeof …...

大数据处理利器:Hadoop 入门指南

一、Hadoop 是什么&#xff1f;—— 分布式计算的基石 在大数据时代&#xff0c;处理海量数据需要强大的技术支撑&#xff0c;Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架&#xff0c;致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…...

追踪大型语言模型的思想(上)(来自针对Claude的分析)

概述 像 Claude 这样的语言模型并非由人类直接编程&#xff0c;而是通过大量数据进行训练。在训练过程中&#xff0c;它们会学习解决问题的策略。这些策略被编码在模型为每个单词执行的数十亿次计算中。对于我们这些模型开发者来说&#xff0c;这些策略是难以捉摸的。这意…...