当前位置: 首页 > 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;…...

【星海随笔】syslinux

Ubuntu相关资料 https://www.pugetsystems.com/labs/hpc/ubuntu-22-04-server-autoinstall-iso/#Step_2_Unpack_files_and_partition_images_from_the_Ubuntu_2204_live_server_ISO https://launchpad.net/ubuntu/source/squashfs-tools/1:4.6.1-1build1 sudo tar -xf my_compu…...

力扣C语言刷题记录 (二)移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xff1a; 更改…...

【Vue3】【Naive UI】<NAutoComplete>标签

【Vue3】【Naive UI】标签 <NAutoComplete> 是 Naive UI 库中的一个组件&#xff0c;用于实现自动完成或联想输入功能。 它允许用户在输入时看到与当前输入匹配的建议列表&#xff0c;从而帮助用户更快地填写表单字段。 这个组件通常用于搜索框、地址输入等场景&#xff…...

【Halcon】使用均值滤波出现假边怎么办?

在图像处理过程中,均值滤波是一种常见的平滑技术,用于减少图像中的噪声。然而,当应用于具有显著边缘或对比度变化的图像时,均值滤波可能会导致“假边”现象,即原本不存在的边缘在滤波后变得明显。以下是如何在Halcon中处理这一问题,并提供一个完整的示例代码。 示例背景…...

Flask+Minio实现断点续传技术教程

什么是MinIO MinIO是一个高性能的分布式对象存储服务&#xff0c;与Amazon S3 API兼容。它允许用户存储和检索任意规模的数据&#xff0c;非常适合于使用S3 API的应用程序。MinIO支持多租户存储&#xff0c;提供高可用性、高扩展性、强一致性和数据持久性。它还可以作为软件定义…...

JAVA设计模式,动态代理模式

动态代理&#xff08;Dynamic Proxy&#xff09;是Java中一种非常有用的设计模式。它允许在运行时创建一个实现了一组给定接口的新类。这种模式主要用于当需要为某个对象提供一个代理以控制对该对象的访问时。通过这种方式&#xff0c;可以添加额外的功能&#xff0c;如事务管理…...

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…...

【计算机视觉算法与应用】模板匹配、图像配准

目录 1. 基于灰度值的模板匹配 2. 基于相关性的模板匹配 3. 基于形状的模板匹配 4. 基于组件的模板识别 5. 基于形变的模板匹配 6. 基于描述符的模板匹配 7. 基于点的模板匹配 性能比较 模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的…...

【Linux】设计文件系统(C实现)

要求&#xff1a; (1)可以实现下列几条命令 dir 列文件目录 create 创建文件 delete 删除文件 read 读文件 write 写文件 (2)列目录时要列出文件名、存取权限&#xff08;八进制&#xff09;、文件长度、时间&#xff08;创建时间&#xff0c;修改时间以及…...

详解Rust多线程编程

文章目录 多线程模型创建和管理线程自定义线程行为线程传递数据线程间通信线程池错误处理与线程Condvar(条件变量)无锁并发高性能并发库 Rust的多线程编程提供了一种安全、高效的方式来进行并发操作。Rust的并发性设计原则之一是确保线程安全&#xff0c;同时避免运行时的开销&…...

el-upload上传多个文件,一次请求,Django接收

1、:file-list"fileList" :on-change"handleChange" 将文件赋值到fileList 2、 :auto-upload"false" 手动触发上传 写个按钮点击执行这个 this.$refs.upload.submit(); 3、自己写上传&#xff0c;不会再触发上传成功或失败回调 4、 request.FI…...

Python实现网站资源批量下载【可转成exe程序运行】

Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好&#xff0c;作为学习资料使用很有价值&#xff0c;所以想下载网站的PPT课件到本地&#xff0c;但是由于网站限制&#xff0c;一…...

《JavaScript高级程序设计》读书笔记 20

感谢点赞、关注和收藏&#xff01; 原始值包装类型 为了方便操作原始值&#xff0c;ECMAScript 提供了 3 种特殊的引用类型&#xff1a;Boolean、Number 和 String。每当用到某个原始值的方法或属性时&#xff0c;后台都会创建一个相应原始包装类型的对象&#xff0c;从而暴露…...

ASP.NET Core项目中使用SqlSugar连接多个数据库的方式

之前学习ASP.NETCore及SqlSugar时都是只连接单个数据库处理数据&#xff0c;仅需在Program文件中添加ISqlSugarClient的单例即可&#xff08;如下代码所示&#xff09;。 builder.Services.AddSingleton<ISqlSugarClient>(s > {SqlSugarScope sqlSugar new SqlSugar…...

Java面试八股文(精选、纯手打)

全国内大厂Java面试高频题库 本小册内容涵盖&#xff1a;Java基础&#xff0c;JVM&#xff0c;多线程&#xff0c;数据库&#xff08;MySQL/Redis&#xff09;SSM&#xff0c;Dubbo&#xff0c;网络&#xff0c;MQ&#xff0c;Zookeeper&#xff0c;Netty&#xff0c;微服务&a…...

工程设计行业内外网文件交换解决方案:FileLink助力高效、安全的跨网协作

在工程设计行业&#xff0c;文件交换和信息共享是项目顺利推进的关键。尤其是涉及复杂的设计图纸、技术方案、合同文件等重要资料时&#xff0c;如何确保文件在内外网之间的高效、安全传输&#xff0c;直接影响到项目的进度和质量。FileLink正是为此而生&#xff0c;它为工程设…...

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…...

配置宝塔php curl 支持http/2 发送苹果apns消息推送

由于宝塔面板默认的php编译的curl未加入http2的支持&#xff0c;如果服务需要使用apns推送等需要http2.0的访问就会失败&#xff0c;所以重新编译php让其支持http2.0 编译方法&#xff1a; 一、安装nghttp2 git clone https://github.com/tatsuhiro-t/nghttp2.git cd nghttp…...

Redis服务配置文件 redis.conf 更新修改配置参数说明

场景&#xff1a; 在安装redis服务中&#xff0c;默认的配置项通常不能实际使用&#xff0c;需要修改一些配置参数 修改配置参数 1、拿到 redis.cnf 文件&#xff0c;此文件通常在 redis 项目源码的第一级目录下 2、修改配置内容&#xff0c;主要修改项如下 protect…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...