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

python数据分析之爬虫基础:爬虫介绍以及urllib详解

前言

在数据分析中,爬虫有着很大作用,可以自动爬取网页中提取的大量的数据,比如从电商网站手机商品信息,为市场分析提供数据基础。也可以补充数据集、检测动态变化等一系列作用。可以说在数据分析中有着相当大的作用!

页面结构介绍

这里主要介绍HTML的一些简单结构,需要一点前端的知识,可以根据情况直接跳过。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><table style="width:200px;height:200px;border:1px solid red">
<!-- table  表格,可以输入table,然后按tab键即可自动补齐tr  表示行结构td  表示列结构--><tr><td>姓名</td><td>年龄</td><td>性别</td></tr><tr><td>张三</td><td>18</td><td>男</td></tr></table>
<!--    ui li表示无序列,无关联关系ol li表示有序列表,有关联关系a标签表示超链接,这些结构在爬虫的应用场景中非长广--><ul><li>铁锅炖大鹅</li><li>小鸡炖蘑菇</li><li>锅包肉</li></ul><ol><li>奖励自己</li><li>睡觉</li><li>起床</li><li>读书学习</li></ol><a href="http://dwqttkx.blog.csdn.net">人间无解</a>
</body>
</html>

 爬虫相关概念

1、爬虫的概念:

爬虫是一种按照一定规则,自动抓取网页信息的程序或脚本。通俗解释就是爬虫就像一个小机器人,能够自动在互联网上逛网页。它可以把网页上的文字、图片、连接之类的信息抓取下来,然后人们可以用这些信息做数据分析等一系列操作。(通过程序模拟浏览器,去向服务器发送请求,获取相应信息)

2、爬虫核心:

1、爬取网页:爬取整个网页,包含了网页中的所有内容

2、解析数据:将网页中得到的数据进行解析

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

3、爬虫的用途:

一、爬虫可以搜索引擎优化。搜索引擎靠爬虫收集网页信息,有了这些信息才能在用户搜索时,提供相应的网页结果。

二、爬虫可以做市场调研。企业可以用爬虫获取竞争对手的产品价格、用户评价等信息,了解市场动态。

三、爬虫可以用来做数据收集。用于学术研究,手机学术文件、统计数据等资料;也可以手机社交媒体的数据,来分析舆情和用户喜好。

4、爬虫分类:

1、通用爬虫:

实例:百度、360、goole等搜索引擎---伯乐在线

功能:访问网页->抓取数据->数据存储->数据处理->提供检索服务

roots协议:一个约定俗成的协议,添加roots.txt文件,来抓取本网站哪些内容不可以被抓取,起不到限制作用,自己写的爬虫无需遵循。

网站排名(SEO):1、根据pagerank算法值进行排名

                            2、百度竞价排名(这就是看谁的钱比较多)

                 缺点:1、抓取的数据大多是无用的

                            2、不能根据用户的需求来竞逐你获取数据

2、聚焦爬虫

功能:根据需求,实现爬虫程序,抓取需要的数据

设计思路:1、确定要爬取的url(如何获取url)

                  2、模拟浏览器通过HTTP协议访问url,获取服务器返回的HTML(如何访问)

                  3、解析HTML字符串(根据一定规则提取需要的数据)如何解析 

5、反爬手段: 

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

2、代理IP:西次代理、快代理

什么是高匿名、匿名和透明代理?区别是什么?

使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP;使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP;使用高匿名代理,对方服务器不知道你使用了代理,也不知道你的真实ID。

3、验证码访问

4、动态加载网页:网站返回的是js数据,并不是网页的真实数据,selenium驱动真实的浏览器发送请求

5、数据加密:分析js代码

urllib库的使用

1、基本使用

首先我们需要导包:

import urllib.request

然后需要定义一个url,也就是我们要访问网页的地址(域名) ,模拟浏览器想发送请求,获取到响应信息。

# 使用urllib来获取百度首页的源码
import urllib.request
# 定义一个url,即我们要访问的地址
url = 'http://www.baidu.com'
#  模拟浏览器向服务端发送请求
response = urllib.request.urlopen(url)
# 获取响应中的页面源码
#read()返回的数据是字节形式的二进制数据,这时我们需要decode进行解码操作
content = response.read().decode('utf-8')
print(content)

2、urllib的一个类型和六个方法:

import urllib.request
url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
# 一个类型
print(type(response)) # <class 'http.client.HTTPResponse'>
# 六个方法
content = response.read() # 一个字节一个字节的读
content = response.read(5) # 只读取前五个字节
# 一行一行的读取,每次只读取一行
content = response.readline()
# 读取全部行
content = response.readlines()
# 返回状态码,200则逻辑没问题,如果是404、500是有问题的
print(response.getcode())
# 返回url地址
print(response.geturl())
# 返回状态信息,响应头
print(response.getheaders())

3、资源下载

基本语法:

urllib.request.urlretrieve(url,filename)

# url代表的是下载的路径,filename代表文件的名字

import urllib.request
# 下载一个网页
url_page = "http://www.baidu.com"
urllib.request.urlretrieve(url_page, "baidu.html")
# 下载图片
url_img = "https://img1.baidu.com/it/u=2414145851,4105017234&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1067"
urllib.request.urlretrieve(url_img, "jujingyi.jpg")
# 下载视频
url_video ="https://vdept3.bdstatic.com/mda-qkh666t7qtjd02w7/cae_h264/1731906619294350169/mda-qkh666t7qtjd02w7.mp4?v_from_s=hkapp-haokan-nanjing&auth_key=1732795382-0-0-0627520a3ef7ab8203af6dfe76c639de&bcevod_channel=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid=0182283432&vid=582295739326229165&klogid=0182283432&abtest=122021_2"
urllib.request.urlretrieve(url_video, "shipin.mp4")

 4、请求对象的定制

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

语法:

request = urllib.request.Request()

import urllib.request
url = 'https://www.baidu.com'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
print(content) # 我们会发现我们得到的内容相当少,这是因为https是由ssl协议的

上述错误代码便是我们遇到的第一个反爬手段即User Agent。在这里我们说一下url的组成:

协议:http/https,https是有ssl加密的,更加安全

主机:即域名——www.baidu.com

端口号:比如http的端口号为80,https为443,MySQL为3306,oracle为1521,redis为6379,mongodb为27017等

路径:s

参数:?后面的数据

锚点

import urllib.request
url = 'https://www.baidu.com'
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
# 因为urlopen()方法中不能存储字典,因此headers不能传入,此时需要定制请求对象
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

4.1、get请求方式:urllib.parse.quote()

周杰伦的网页域名:https://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&wd=%E5%91%A8%E6%9D%B0%E4%BC%A6
需求:获取https://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&wd=周杰伦的网页源码

import urllib.request
url ="https://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&wd=周杰伦"
headers = {"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 42-44: ordinal not in range(128)

我们会发现并不能正常运行,而是报了上述错误,这是因为周杰伦三个字超出ASCII码值检索的范围,需要我们把周杰伦三个字变成Unicode编码,这个时候需要用到quote方法。

import urllib.request
import urllib.parse
name = urllib.parse.quote("周杰伦")
url ="https://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&wd=name"
headers = {"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

4.2、get请求方式:urllib.parse.urlencode()

但quote方法的缺点很显然,需要一次次的对中文汉字进行转换,每次都需要调用,相当麻烦!所以我们需要一种新的方法来解决这个问题,而这个方法便是urlencode方法。应用场景:多参数需要进行Unicode编码的时候。

# 获取"https://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&wd=周杰伦&sex=男&location=中国台湾"网页源码
import urllib.request
import urllib.parse
data = {"wd":"周杰伦","sex":"男","location":"中国台湾"}
new_data = urllib.parse.urlencode(data)
url = "https://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&"+new_data
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode("utf-8")
print(content)

4.3、post请求方式

POST请求是HTTP协议中的一种请求方法。

POST主要用于向指定的资源提交要被处理的数据。比如在网页表单提交数据(如用户注册、登录信息、发表评论)到服务器时,就经常会用到POST请求。和GET请求相比,POST请求传递的数据不会像GET请求一样直接显示在URL中,这让POST请求更适合传递敏感信息(如密码),因为数据不会在URL中暴露。我们以百度翻译为例:

import urllib.request
import urllib.parse
import json
url = "https://fanyi.baidu.com/sug"
headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
data = {"kw":"spider"}
# post请求的参数一定要进行编码
data = urllib.parse.urlencode(data).encode("utf-8") # 因为data需要是字节类型的数据,所以此时因该进行编码操作
request = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(request)
content = response.read().decode("utf-8")
content = json.loads(content)
print(content)

最后结果会返回一个json数据。我们可以使用json.loads()方法将json数据转化为python数据。 

4.4、ajax的get请求

我们以爬取豆瓣电影第一页数据并下载到本地为例子:

import urllib.request
import urllib.parse
url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20"
headers ={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
request = urllib.request.Request(url,headers=headers)
repose = urllib.request.urlopen(request)
content = repose.read().decode('utf-8')
# 下载数据到本地
f = open("豆瓣.json","w",encoding="utf-8")
f.write(content)
f.close()

那么如何批量下载更多数据呢?比如下载前十页为例,我们提供三个方法:

# ajax的get请求豆瓣电影前十页数据并保存到本地,方法一:
# import urllib.request
# import urllib.parse
# url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=200"
# headers = {"user-agent":
#     "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
# request = urllib.request.Request(url, headers=headers)
# reponse = urllib.request.urlopen(request)
# content  =reponse.read().decode("utf-8")
# f = open("豆瓣shi.json","w",encoding="utf-8")
# f.write(content)
# f.close()# 方法二:通过函数形式,每一页都调用一次函数以及get方法,以追加的形式把数据写入到文件
# import urllib.request
# import urllib.parse
#
#
# def create_request(page):
#     base_url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&"
#     headers = {"user-agent":
#                    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
#     data = {"start": (page - 1) * 20,
#             "limit": 20}
#     data = urllib.parse.urlencode(data)
#     url = base_url + data
#     request = urllib.request.Request(url, headers=headers)
#     response = urllib.request.urlopen(request)
#     content = response.read().decode("utf-8")
#     f = open("douban.json", "a", encoding="utf-8")
#     f.write(content)
#     f.close()
#
# if __name__ == '__main__':
#     start_page = int(input("请输入起始页码:"))
#     end_page = int(input("请输入结束页码"))
#     for page in range(start_page, end_page + 1):
#         # 每一页都有请求对象的定制
#         create_request(page)# 方法三:
import urllib.request
import urllib.parse
def create_request(page):base_url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&"headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}data = {"start":(page-1)*20,"limit":20}data = urllib.parse.urlencode(data)url = base_url + datarequest = urllib.request.Request(url,headers = headers)return request
def get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return content
def down_load(page,content):with open("douban"+str(page)+".json","w",encoding="utf-8") as f:f.write(content)if __name__ == '__main__':start_page = int(input("请输入起始页码:"))end_page = int(input("请输入结束页码"))for page in range(start_page, end_page+1):# 每一页都有请求对象的定制request = create_request(page)content = get_content(request)down_load(page,content)

 个人建议以第三种方法来开发,因为它更加贴合于企业的项目开发。

4.5、ajax的post请求

import urllib.request
import urllib.parse
def create_quest(page):base_url = "https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"headers ={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}data = {"cname": "郑州","pid":None,"pageIndex": page,"pageSize": 10}new_data = urllib.parse.urlencode(data).encode('utf-8')request = urllib.request.Request(base_url, new_data, headers)return request
def get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')# import json# content = json.loads(content)# content = content["Table1"]# for i in content:#     position = i["addressDetail"]#     print(position)return content
def down_load(content,page):with open("肯德基"+str(page)+".json","w",encoding="utf-8") as f:f.write(content)if __name__ == '__main__':start_page = int(input("请输入起始页码:"))end_page = int(input("请输入终止页码:"))for page in range(start_page,end_page+1):# 请对象的定制request = create_quest(page)# 获取网页源码content = get_content(request)# 下载down_load(content,page)

总体来说和上一个案例套路基本一致,把基础打牢,应该可以轻松解决!

URLError/HTTPError 

简介:1、HTTPError类是URLError类的子类

           2、导入的包urllib.error.HTTPError        urllib.error.URLError

           3、http错误:http错误是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者该页是哪里出了问题。

           4、通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加稳定,可以通过异常捕获来优化代码

import urllib.request
import urllib.error
url = "https://blog.csdn.net/2301_80109683/article/details/1439772511"
headers ={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
try:request = urllib.request.Request(url,headers=headers)response = urllib.request.urlopen(request)content = response.read().decode('utf-8')print(content)
except urllib.error.HTTPError as e:print(e)

Cookie登录

Cookie登录是网站用来识别用户身份的一种方式。用户首次登陆成功后,网站服务器会生成含用户登录信息的Cookie并发送浏览器保存。再次访问是,浏览器自动发送Cookie给服务器,服务器借此确认身份,使用户免重复输账号密码。其优点是方便快捷、减轻服务器负担,缺点是存在安全风险与隐私问题。

# 微薄的cookie登录,使用场景:数据采集时,需要绕过登录,然后进入到某个页面
import urllib.request
url = "https://weibo.cn/7860977321/info"
headers ={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",# cookie中携带着登录信息,如果有登陆之后的cookie,我们可以携带着cookie进入到任何页面'cookie':'_T_WM=dc6e834b939c02f2cf63eae686703cdb; SCF=AqLqfxclF7261sAej5VukiKWtyKwQC6YWhOjr-DxKfiRwoK4a_pkJ1Wynkwvwq8P2VKl0StItmmIaH0dNf_4sok.; SUB=_2A25KSEBRDeRhGeFG7VIY9ynPyT2IHXVpJN2ZrDV6PUJbktANLU_3kW1NeTtdpWKPQR6WSGxb8AKZSDUfjZ1abI_S; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W56bhEyW3jnAWOeE1zBXWuj5NHD95QN1hq71KMNe0zpWs4DqcjMi--NiK.Xi-2Ri--ciKnRi-zNS0nceh.NS0eEeBtt; SSOLoginState=1733046273; ALF=1735638273'}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode("utf-8")
# 将数据保存到本地
f = open("weibo.html", "w", encoding="utf-8")
f.write(content)
f.close()
# 如果不加cookie,我们打开HTML文件是一片空白,这是因为请求头信息不够,因此访问不成功

Handler处理器

Handler处理器用于处理各种不同类型的URL请求。他是构建自定义网络请求处理流程的关键部分,通过不同类型的handler可以实现对HTTP、HTTPS、FTP等协议请求的定制化操作,包括处理Cookie、代理、认证等功能。

# handler处理器基本使用,使用handler访问百度来获取网页源码
import urllib.request
url = 'http://www.baidu.com'
headers ={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
# 获取handler对象
handler = urllib.request.HTTPHandler()
# 通过handler获取openr对象
opener = urllib.request.build_opener(handler)
# 调用open方法
response = opener.open(request)
content = response.read().decode('utf-8')
print(content)

代理服务器

代理服务器的常用功能?

        1、突破自身IP访问限制

        2、访问一些单位或团体内部资源

                比如某大学FTP(前提是该代理地址在该资源的允许范围之内),使用教育网内地址免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询等共享服务。

        3、提高放访问速度

                通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户在访问相同信息时,则直接有缓冲区中取出信息,传给用户,以提高访问速度。

        4、隐藏真实IP

                上网者也可以通过这种方法隐藏自己的IP,免受攻击

代码的配置代理:

1、创建Request对象

2、创建ProxyHandler对象

3、用Handler对象创建openr对象

4、使用opener.open的函数发送请求 

我们可以在快代理等平台,购买一个独享代理,这样来爬取数据,即使本机IP被封,我们依然可以使用代理IP来取访问某个网站,并爬取数据。

import urllib.request
url = "http://www.baidu.com/s?tn=25017023_13_dg&ch=1&ie=utf-8&wd=ip"
headers ={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
proxies = {"http":"106.227.10.176:16817"
}
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
f = open("daili.html", "w", encoding="utf-8")
f.write(content)
f.close()

即使我们使用了代理IP,但是如果我们在短时间内高频次的去访问某一个网站,也是避免不了被封的风险的!这个时候就需要代理池(有一堆高密的代理IP)。我们可以自己做一个简易粗糙的代理池:

proxies_pool = [{"http":"106.227.10.176:168171"},{"http":"106.227.10.176:1681712"},{"http":"106.227.10.176:16817123"}
]
# 假设这些都是真实有效的独享IP,利用随机的特性,来实现简易的代理池
import random
proxies = random.choice(proxies_pool)
print(proxies) # 这样就能出现随机的代理

 本次爬虫分享就到这里,如有错误,欢迎指正!感谢观看!

相关文章:

python数据分析之爬虫基础:爬虫介绍以及urllib详解

前言 在数据分析中&#xff0c;爬虫有着很大作用&#xff0c;可以自动爬取网页中提取的大量的数据&#xff0c;比如从电商网站手机商品信息&#xff0c;为市场分析提供数据基础。也可以补充数据集、检测动态变化等一系列作用。可以说在数据分析中有着相当大的作用&#xff01;…...

洛谷 P1036 [NOIP2002 普及组] 选数 C语言

题目&#xff1a;https://www.luogu.com.cn/problem/P1036 题目描述 已知 nn 个整数 x1,x2,⋯ ,xn&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4 个…...

CSS动画案例4

目录 一、介绍二、基础布局1. HTML2.CSS 三、交互效果1.设置中间图片的动画2.设置左右两侧每行内容的起始位置与动画3.设置左右两侧第二行与第三行的动画延时的时间4.icon划入时的效果 四、结束语 一、介绍 今天我们继续来看下一个CSS动画案例&#xff0c;这个案例主要是图片以…...

华为云云连接+squid进行正向代理上网冲浪

1 概述 ‌Squid‌是一个高性能的代理缓存服务器&#xff0c;主要用于缓冲Internet数据。它支持多种协议&#xff0c;包括FTP、gopher、HTTPS和HTTP。Squid通过一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求&#xff0c;这使得它在处理请求时具有较高的效率‌。…...

【C++】封装红黑树实现的map和set

前言 这篇博客我们将上篇博客实现的红黑树来封装成自己实现的set和map&#xff0c;来模拟一下库里的map和set &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;C 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 1.源…...

【SSM】mybatis的增删改查

目录 代理Dao方式的增删改查 1. 创建项目 $$1. 在sql.xml里增加日志代码以及user的mapper资源。 $$ 2. 在usermapper里引入接口。 $$3. 在测试类中引入以下代码&#xff0c;并修改其中名字。 $$ 4. 实例对象User.java里属性要与表中列严格对应。 2. 查询 1>. 查询所有 …...

macos下brew安装redis

首先确保已安装brew&#xff0c;接下来搜索资源&#xff0c;在终端输入如下命令&#xff1a; brew search redis 演示如下&#xff1a; 如上看到有redis资源&#xff0c;下面进行安装&#xff0c;执行下面的命令&#xff1a; brew install redis 演示效果如下&#xff1a; …...

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…...

【Linux】Linux2.6内核进程调度队列与调度原理

目录 一、进程管理中的部分概念二、寄存器三、进程切换四、Linux2.6内核进程调度队列与调度原理结尾 一、进程管理中的部分概念 竞争性: 系统进程数目众多&#xff0c;而CPU资源只有少量&#xff0c;甚至1个&#xff0c;所以进程之间是具有竞争属性的。为了高效完成任务&#…...

MacOS使用VSCode编写C++程序如何配置clang编译环境

前言 这段时间在练习写C和Python&#xff0c;用vscode这个开发工具&#xff0c;调试的时候遇到一些麻烦&#xff0c;浪费了很多时间&#xff0c;因此整理了这个文档。将详细的细节描述清楚&#xff0c;避免与我遇到同样问题的人踩坑。 1.开发环境的配置 vscode的开发环境配置…...

【Spark源码分析】规则框架- `analysis`分析阶段使用的规则

analysis分析阶段使用的规则 规则批策略规则说明SubstitutionfixedPointOptimizeUpdateFields该规则优化了 UpdateFields 表达式链&#xff0c;因此看起来更像优化规则。但是&#xff0c;在处理深嵌套模式时&#xff0c;UpdateFields 表达式树可能会非常复杂&#xff0c;导致分…...

Windows和Ubuntu系统下cmake和opencv的安装和使用

以下是在Windows和Ubuntu系统下分别安装CMake并使用C配置OpenCV实现读取图片并显示功能的详细步骤&#xff1a; Windows系统 1. 安装CMake 访问CMake官方网站&#xff08;https://cmake.org/download/&#xff09;。根据你的Windows系统版本&#xff08;32位或64位&#xff…...

详解 Qt QtPDF之QPdfPageNavigator 页面跳转

文章目录 前言头文件&#xff1a; 自 Qt 6.4 起继承自&#xff1a; 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...

设计模式之单例

单例可以说是设计模式中最简单的一种模式。但任何一种设计模式都是普遍经验的总结&#xff0c;都有值得思考的地方。所以单例也并不简单&#xff0c;下面让我们慢慢了解它。 单例顾名思义这个类只有一个实例。要做到这点&#xff0c;需要做到以下几点&#xff1a; &#xff08;…...

笔记软件:我来、思源笔记、Obsidian、OneNote

最近wolai的会员到期了&#xff0c;促使我更新了一下笔记软件。 首先&#xff0c;wolai作为一个笔记软件&#xff0c;我觉得有很多做得不错的方面&#xff08;否则我也不会为它付费2年了&#xff09;&#xff0c;各种功能集成得很全&#xff08;公式识别这个功能我写论文的时候…...

前端入门指南:前端模块有哪些格式?分别什么情况使用

前言 在当今的前端开发中&#xff0c;模块化是提升代码组织性和可维护性的关键手段。随着前端技术的发展&#xff0c;出现了多种模块化方案&#xff0c;每种方案都有其独特的优势和适用场景。本文将详细探讨常见的前端模块格式&#xff0c;包括全局变量、IIFE、CommonJS、AMD、…...

Vue3 常用指令解析:v-bind、v-if、v-for、v-show、v-model

Vue 是一个非常强大的前端框架&#xff0c;提供了许多常用指令来简化模板的使用。Vue 指令以 v- 开头&#xff0c;用于对 DOM 元素和组件的行为进行控制。本文将介绍 Vue 中常见的五个指令&#xff1a;v-bind、v-if、v-for、v-show 和 v-model&#xff0c;并通过实例代码来演示…...

如何查看ubuntu服务器的ssh服务是否可用

你可以通过以下几种方法检查 Ubuntu 服务器上的 SSH 服务是否可用&#xff1a; 1. 使用 systemctl 检查 SSH 服务状态 首先&#xff0c;检查 SSH 服务是否正在运行&#xff1a; sudo systemctl status ssh如果 SSH 服务正在运行&#xff0c;你会看到类似以下的输出&#xff…...

redis面试复习

1.redis是单线程还是多线程 无论什么版本工作线程就是是一个&#xff0c;6.x高版本出现了IO多线程 单线程满足redis的串行原子&#xff0c;只不过IO多线程后&#xff0c;把输入/输出放到更多的线程里区并行&#xff0c;好处&#xff1a; 1.执行的时间更短&#xff0c;更快&a…...

【人工智能基础04】线性模型

文章目录 一. 基本知识1. 线性回归1.1. 基本形式1.2. 线性回归 2. 优化方法&#xff1a;梯度下降法2.1. 梯度下降法的直观意义2.2. 随机梯度下降法 3. 分类问题3.1. 二分类&#xff1a;逻辑回归-sigmoid函数3.2. 多分类问题--softmax函数 4. 岭回归与套索回归4.1. 基础概念什么…...

使用YOLO系列txt目标检测标签的滑窗切割:批量处理图像和标签的实用工具

使用YOLO系列txt目标检测标签的滑窗切割&#xff1a;批量处理图像和标签的实用工具 使用YOLO的TXT目标检测标签的滑窗切割&#xff1a;批量处理图像和标签的实用工具背景1. 代码概述2. 滑窗切割算法原理滑窗切割步骤&#xff1a;示例&#xff1a; 3. **代码实现**1. **加载标签…...

《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》

《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》 一、引言二、K-5S 电化学传感器模组概述&#xff08;一&#xff09;产品简介&#xff08;二&#xff09;产品特点&#xff08;三&#xff09;产品适用场景 三、电化学传感器原理及优点&#xff08;一&#xf…...

【笔记】文明、现代化与价值投资

文章目录 价值投资与理性思考资管行业特点及对从业人员的道德底线要求价值投资长期来看&#xff0c;各项资产的走势投资与投机 对文明的认知对文明的计量方式狩猎文明或1.0文明农业畜牧文明或2.0文明农业文明的天花板及三次冲顶农业文明中的思想革命和制度创新 科技文明或3.0文…...

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作&#xff0c;以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…...

提升分布式系统响应速度:分布式系统远程调用性能提升之道

目录 一、远程调用直接案例分析 二、并行调用 &#xff08;一&#xff09;核心思想 &#xff08;二&#xff09;并行调用的实现方式 1. 基本思路 2. 代码示例 3. 关键点说明 4.线程池配置建议 三、数据异构 &#xff08;一&#xff09;场景重提 &#xff08;二&…...

通过MinIO+h2non/imaginary 搭建自己的阿里云OSS

安装MinIO Docker部署MinIO对象存储服务 图片访问地址&#xff1a;http://192.168.153.138:9000/public/su7_1.jpg 安装h2non/imaginary Docker部署h2non/imaginary 处理图片地址&#xff1a;http://192.168.153.138:7000/resize?urlhttp://192.168.153.138:9000/public/su…...

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...

iOS与Windows间传文件

想用数据线从 windows 手提电脑传文件入 iPhone&#xff0c;有点迂回。 参考 [1]&#xff0c;要在 windows 装 Apple Devices。装完、打开、插线之后会检测到手机&#xff0c;界面&#xff1a; 点左侧栏「文件」&#xff0c;不是就直接可以传&#xff0c;而是要通过某个应用传…...

ospf协议(动态路由协议)

ospf基本概念 定义 OSPF 是典型的链路状态路由协议&#xff0c;是目前业内使用非常广泛的 IGP 协议之一。 目前针对 IPv4 协议使用的是 OSPF Version 2 &#xff08; RFC2328 &#xff09;&#xff1b;针对 IPv6 协议使用 OSPF Version 3 &#xff08; RFC2740 &#xff09;。…...

直击高频编程考点:聚焦新版综合编程能力考查汇总

目录 一、业务性编程和广度能力考查 &#xff08;一&#xff09;基本定义 &#xff08;二&#xff09;必要性分析 二、高频考查样题&#xff08;编程扩展问法&#xff09; 考题1: 用java 代码实现一个死锁用例&#xff0c;说说怎么解决死锁问题&#xff1f;&#xff08;高…...

爬虫框架快速入门——Scrapy

适用人群&#xff1a;零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy&#xff1f; Scrapy 是一个基于 Python 的网络爬虫框架&#xff0c;它能帮助你快速爬取网站上的数据&#xff0c;并将数据保存到文件或数据库中。 特点&#xff1a; 高效&#xff1a;支…...

Springfox、Swagger 和 Springdoc

Springfox、Swagger 和 Springdoc 是用于在 Spring Boot 项目中生成 API 文档的工具&#xff0c;但它们之间有显著的区别和演进关系&#xff1a; 1. Swagger 简介 Swagger 是一个开源项目&#xff0c;旨在为 RESTful APIs 提供交互式文档。最早由 SmartBear 开发&#xff0c;…...

Css、less和Sass(SCSS)的区别详解

文章目录 Css、less和Sass&#xff08;SCSS&#xff09;的区别详解一、引言二、CSS 简介1.1、CSS 示例 三、Less 简介2.1、Less 特性2.2、Less 示例 四、Sass&#xff08;SCSS&#xff09;简介3.1、Sass 特性3.2、SCSS 示例 五、总结 Css、less和Sass&#xff08;SCSS&#xff…...

新能源汽车充电基础设施短板问题多,如何实现高效、综合、智能化管理?

随着城市经济的发展&#xff0c;人民生活水平的提升&#xff0c;新能源汽车保有量快速增长&#xff0c;而日益增长的新能源汽车需求与充电基础设施建设不平衡的矛盾日益突出。由于停车泊位充电基础设施总量不足、布局待优化、利用效率低、建设运营存在短板问题等原因&#xff0…...

DBA面试题-1

面临失业&#xff0c;整理一下面试题&#xff0c;找下家继续搬砖 主要参考&#xff1a;https://www.csdn.net/?spm1001.2101.3001.4476 略有修改 一、mysql有哪些数据类型 1&#xff0c; 整形 tinyint,smallint,medumint,int,bigint&#xff1b;分别占用1字节、2字节、3字节…...

LAN,WAN,VLAN,WLAN,VPN了解笔记

局域网LAN---公司的内部网络就是局域网LAN。 提供有线连接的接口允许局域网内的设备&#xff08;如台式电脑、网络打印机、网络存储设备等&#xff09;通过以太网线连接到路由器并与其他局域网设备进行通信实现设备之间的数据传输和资源共享一种私有的网络相对其他网络传输速度…...

1.2 算法和算法评价

1.2.1 算法的基本概念 算法&#xff1a;对特定问题求解步骤的一种描述&#xff0c;它是指令的有限序列&#xff0c;其中的每条指令表示一个或多个操作。 算法的五个重要特性 “好”的算法的五个目标 1.2.2 算法效率的度量 一、时间复杂度 算法的时间复杂度是指一个算法每行…...

各大常见编程语言应用领域

不同编程语言因其特性和设计目标而适用于不同的应用领域。以下是一些常见编程语言及其主要应用领域&#xff1a; 1. Python 数据科学与人工智能&#xff1a;Python 在数据分析、机器学习、深度学习等领域广泛使用&#xff0c;因其丰富的库&#xff08;如 NumPy、Pandas、Tens…...

【FFT】数据点数是否一定为2的n次方?不补零会如何处理?

一般来说&#xff0c;FFT的数据点个数为以2为基数的整数次方&#xff08;采用以2为基的FFT算法&#xff0c;可以提升运算性能&#xff09;&#xff0c;但是并没有要求FFT的数据点个数一定为2的n次方。 因此针对数据点数不是以2为基数的整数次方&#xff0c;有两种处理方法&…...

shell脚本小练习#003:查找并拷贝目录

实例1&#xff1a; # 从当前执行脚本的路径位置开始向上搜索一个名为sourceProject目录名 # 并将这个文件目录的路径名称打印出来#!/bin/bashfunction find_dir() {local current_dir$PWDwhile [[ $current_dir ! "/" ]]; doif [[ -d "${current_dir}/sourcePr…...

frp内网穿透

目录 1&#xff0c;准备公网服务器 2&#xff0c;下载安装frp服务端 3&#xff0c;服务端安装 2&#xff09;编辑服务端配置文件fprs.toml 3&#xff09;配置启动服务 4&#xff09;启动服务 5 &#xff09;设置开机启动服务 6&#xff09;查看服务启动状态 3&#xff0c…...

Android电视项目焦点跨层级流转

1. 背景 在智家电视项目中&#xff0c;主要操作方式不是触摸&#xff0c;而是遥控器&#xff0c;通过Focus进行移动&#xff0c;确定点击进行的交互&#xff0c;所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大&#xff0c;在一些复杂页面中会存…...

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =...

转载 为nautilus安装rabbitvcs

# 添加 rabbitvcs 的 ppa 源 sudo add-apt-repository ppa:rabbitvcs/ppa sudo apt update # 安装 rabbitvcs sudo apt install rabbitvcs-cli rabbitvcs-core rabbitvcs-gedit rabbitvcs-nautilus # 注销后重新登录&#xff0c;右键即可使用 # 解决 RabbitVCS 无法自动保存…...

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

简介&#xff1a;本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤&#xff0c;包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义&#xff0c;阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法&#xff0…...

手机控制载货汽车一键启动无钥匙进入广泛应用

移动管家载货汽车一键启动无钥匙进入手机控车系统‌&#xff0c; 该系统广泛应用于物流运输、工程作业等货车场景&#xff0c;为车主提供了高效、便捷的启动和熄火解决方案&#xff0c;体现了科技进步对物流行业的积极影响‌ 核心功能‌&#xff1a;简化启动流程&#xff0c;提…...

Springboot——SseEmitter流式输出

文章目录 前言SseEmitter 简介测试demo注意点异常一 ResponseBodyEmitter is already set complete 前言 最近做AI类的开发&#xff0c;看到各大AI模型的输出方式都是采取的一种EventStream的方式实现。 不是通常的等接口处理完成后&#xff0c;一次性返回。 而是片段式的处理…...

【人工智能数学基础篇】线性代数基础学习:深入解读矩阵及其运算

矩阵及其运算&#xff1a;人工智能入门数学基础的深入解读 引言 线性代数是人工智能&#xff08;AI&#xff09;和机器学习的数学基础&#xff0c;而矩阵作为其核心概念之一&#xff0c;承担着数据表示、变换和运算的重任。矩阵不仅在数据科学中广泛应用&#xff0c;更是神经…...

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置&#xff0c;可以按下图所示寻找位置&#xff0c;也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly&#xff1a;自动帮我们优化导入的包Optimize imports on the fly&#xff1a;自动去掉一些没有用到的包 禁止导…...

奇怪的编码2

1.当铺密码 当铺密码的标志是“田由中人工大王夫井羊” 口 0 田 0 由 1 中 2 人 3 工 4 大 5 王 6 夫 7 井 8 羊 9 解密脚本&#xff1a; s 田由中人工大王夫井羊 codeinput("请输入当铺密码&#xff1a;") code code.split(" ") w for i in code:k…...