爬虫系列----Python解析Json网页并保存到本地csv

Python解析JSON

  • 1 知识小课堂
    • 1.1 爬虫
    • 1.2 JSON
    • 1.3 Python
    • 1.4 前言技术
      • 1.4.1 range
      • 1.4.2 random
      • 1.4.3 time.sleep
      • 1.4.4 with open() as f:
  • 2 解析过程
    • 2.1 简介
    • 2.2 打开调试工具
    • 2.3 分析网址
      • 2.3.1 网址的规律
      • 2.3.2 网址的参数
    • 2.4 爬取第一页内容
    • 2.5 存入字典并获取
    • 2.6 循环主体数据
    • 2.7 公告和日期改进
    • 2.8 循环获取前三页内容
    • 2.9 保存到CSV中
  • 3 完整代码

1 知识小课堂

1.1 爬虫

在这里插入图片描述

  • Python爬虫(Python Spider)是一种使用Python编程语言编写的程序,用于自动从互联网上抓取数据。这些数据可以是网页内容、图片、视频或其他资源。爬虫程序通常用于数据挖掘、信息收集、竞争情报分析等领域。
  • Python爬虫通常使用第三方库来实现,如BeautifulSoup、Scrapy等。这些库提供了方便的API和工具,使得开发者可以轻松地编写爬虫程序。

1.2 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

JSON具有以下特点:

  • 易于人阅读和编写,可以在多种语言之间进行数据交换。
  • 简洁和清晰的层次结构使得JSON成为理想的数据交换语言。
  • 易于机器解析和生成,并有效地提升网络传输效率。
  • JSON的语法规则包括:

JSON对象:对象是一个无序的"名称/值"对集合。一个对象以"{(“开始,”}(“结束。每个"名称"后跟一个”:“(冒号);“名称/值"对之间使用”,”(逗号)分隔。
JSON数组:数组是一个有序的"值"集合,一个数组以"[(“开始,”](“结束,值之间使用”,"(逗号)分隔。JSON对象、JSON数组可以嵌套。
JSON的应用非常广泛,包括但不限于数据交换、配置文件、API请求等场景。由于其易于读写、解析和生成的特点,使得JSON成为了一种理想的数据交换格式。

1.3 Python

当然可以,Python是一种广泛使用的编程语言,可以用于各种不同的任务,包括数据分析和处理。Python有许多库和工具可以用于处理JSON数据,其中最常用的是json模块。

1.4 前言技术

1.4.1 range

在Python中,range()是一个内置函数,用于生成一个整数序列。它通常用于循环结构(如for循环)中,以控制循环的迭代次数。

range()函数可以接受1到3个参数:

  1. 只有一个参数(例如 range(5)),则表示从0开始,到该参数的整数(但不包括该参数的整数),即 [0, 1, 2, 3, 4]。
  2. 有两个参数(例如 range(1, 5)),则表示从第一个参数的整数开始,到第二个参数的整数(但不包括该参数的整数),即 [1, 2, 3, 4]。
  3. 有三个参数(例如 range(1, 5, 2)),则表示从第一个参数的整数开始,到第二个参数的整数(但不包括该参数的整数),步长为第三个参数的整数。例如,range(1, 5, 2)会生成 [1, 3, 5]。

此外,还可以使用range()函数与切片操作结合使用,以生成指定范围的序列。例如:

# 从1到5(包含5)  
numbers = list(range(1, 6))  # 结果:[1, 2, 3, 4, 5]  # 从0开始,每次加2,直到10(包含10)  
even_numbers = list(range(0, 11, 2))  # 结果:[0, 2, 4, 6, 8, 10]

1.4.2 random

Python的random模块提供了一系列的函数用于生成随机数。下面是一些最常用的random模块方法:

  1. random():返回[0.0, 1.0)范围内的下一个随机浮点数。
import random  
print(random.random())  # 输出类似于0.123456789的随机数
  1. randint(a, b):返回指定范围内的随机整数,包含端点a和b。
import random  
print(random.randint(1, 10))  # 输出1到10之间的随机整数,包括1和10
  1. randrange(start, stop[, step]):返回指定范围内的随机整数,类似于内建函数range()。可以指定步长。
import random  
print(random.randrange(1, 10, 2))  # 输出1到9之间的随机奇数
  1. choice(seq):从非空序列seq中返回一个随机元素。如果seq为空,则引发IndexError。
import random  
my_list = [1, 2, 3, 4, 5]  
print(random.choice(my_list))  # 从my_list中随机选择一个元素并输出
  1. shuffle(seq[, random]):将序列seq的所有元素随机排序。可选参数random是一个0到1之间的浮点数,用于指定随机算法的种子值。
import random  
my_list = [1, 2, 3, 4, 5]  
random.shuffle(my_list)  
print(my_list)  # 输出类似于[2, 1, 5, 3, 4]的随机排序列表
  1. uniform(a, b):返回指定范围内的随机浮点数,范围在a和b之间(包含a和b)。
import random  
print(random.uniform(1.0, 2.0))  # 输出1.0到2.0之间的随机浮点数,包括1.0和2.0
  1. seed(a[, version]):使用种子值a初始化随机数生成器。如果不提供种子值,则使用系统时间作为默认种子。可选参数version用于指定随机数生成器的版本,默认为2。
import random  
random.seed(1)  # 设置种子值为1,确保每次运行程序时生成的随机数序列相同  
print(random.random())  # 输出相同的随机数,因为种子值固定了随机数生成器的起始状态

1.4.3 time.sleep

time.sleep() 是 Python 标准库中 time 模块的一个方法,用于使程序暂停执行指定的秒数。

示例:

import time  print("开始")  
time.sleep(2)  # 暂停2秒  
print("结束")

输出:

开始  
(程序会暂停2)  
结束

1.4.4 with open() as f:

with open(文件地址,‘a’ ,newline = '',encoding='utf-8-sig') as f:

2 解析过程

2.1 简介

  • 将网站中的json文件爬取下来存到本地表格中。爱购云-商机发现

2.2 打开调试工具

本文尝试使用的是【google】
选择【Fetch/XHR】点击做上交的在这里插入图片描述按钮,清空管理台。

在这里插入图片描述
清空管理台
在这里插入图片描述

2.3 分析网址

2.3.1 网址的规律

打开网址,滑倒下面分页,选择【2】点击,发现左侧出现一个文件。
在这里插入图片描述
在这里插入图片描述

点开找个文件,发现是JSon数据。
在这里插入图片描述
将它在新标签页中打开。
在这里插入图片描述
在新页面中打开。复制一下网址。
在这里插入图片描述
返回到分页处,点【3】,发现右侧又出现一个文件。
在这里插入图片描述
同理,在新标签页中打开,并复制网址。
在这里插入图片描述
同样的方法复制页码【1】的网址。

页码【1】https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=1
页码【2】https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=1&pageSize=24&noticestate=1
页码【3】https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=2&pageSize=24&noticestate=1

由以上分析可知,只有pageNo不同,并据此可推断出,第N页的网址应该是pageNo=N-1,到此为止,我们已经推断出来网址的规律。另外两个参数是什么?

2.3.2 网址的参数

由上小结的页码一为例:页码【1】https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=1
网址包括

  • 域名:https://www.igoyun.cn
  • 文件路径:/igo-cloud-bizdiscovery/espurbid/fineespurbid?
  • 参数:【pageNo=0】表示当前页码
  • 参数:【pageSize=24】表示每页的数量
  • 参数:【noticestate=1】还未知,我们来猜测一下。
    进入网页:https://www.igoyun.cn/#/portal/search/business

在这里插入图片描述
点击页码【2】,查看右侧的json文件网址:

https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=1&pageSize=24&noticestate=1

在这里插入图片描述
返回网页:切换到以下选项
在这里插入图片描述
同样选择【2】,点开右侧json文件,查看网址。

https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=1&pageSize=24&noticestate=2在这里插入图片描述
将以上两个网址放在一起比较:

进行中:https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=1&pageSize=24&noticestate=1
全部:https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=1&pageSize=24&noticestate=2

有分析可知:二者变量为:【全部/进行中】,网址区别为【noticestate=1/2】在此可以猜测,【noticestate】参数控制【全部/进行中】。为进一步确认推测是否正确,可以根据json文件数据和原网页进行对比。对比结果可知,二者是一致的。
回顾三个参数
由上小结的页码一为例:页码【1】https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=1
网址包括

  • 域名:https://www.igoyun.cn
  • 文件路径:/igo-cloud-bizdiscovery/espurbid/fineespurbid?
  • 参数:【pageNo=0】表示当前页码
  • 参数:【pageSize=24】表示每页的数量
  • 参数:【noticestate=1】全部/进行中
    根据需要进行爬取,这里选择noticestate= 2.

2.4 爬取第一页内容

url:https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=2

import requests
import random
import json
import time
now_time = int(time.time())
timeStamp = now_time*1000
url = 'https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo={}&pageSize=24&noticestate=2'.format(a)
headers = {
"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url = url.format(timeStamp),headers = headers)
print(response.content.decode('utf-8'),type(response.content.decode('utf-8')))

代码解释:

  • url 是网址
  • headers 伪装成浏览器访问,
  • response :用response 进行访问网址,对返回的数据进行UTF-8处理,显示能看懂的数据

运行文件,显示如下,表示已经获取json数据,接下来就是对这些数据进行处理。
在这里插入图片描述

2.5 存入字典并获取

1、存入数据字典

#爬取腾讯招聘网站
import requests
import json
import time
now_time = int(time.time())
timeStamp = now_time*1000
url = 'https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=2'
headers = {
"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url = url.format(timeStamp),headers = headers)
# print(response.content.decode('utf-8'),type(response.content.decode('utf-8')))
content = response.content.decode('utf-8')
#需要将content(json.str)--->python对象的(json-dict)
content_dict = json.loads(content)
print(type(content_dict))

在这里插入图片描述
由打印可知,content_dict 的类型为【dict】字典类型

2、获取数据
主体数据保存在【content】中,那么怎么获取到这里的数据呢?
很简单,目前为止,已经获取到全部的数据,并将数据存到字典中【content_dict】
在这里插入图片描述

post_list = content_dict['result']['content']
  • post_list 即为content的数据。
#爬取腾讯招聘网站
import requests
import json
import time
now_time = int(time.time())
timeStamp = now_time*1000
url = 'https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=2'
headers = {
"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url = url.format(timeStamp),headers = headers)
# print(response.content.decode('utf-8'),type(response.content.decode('utf-8')))
content = response.content.decode('utf-8')
#需要将content(json.str)--->python对象的(json-dict)
content_dict = json.loads(content)
# print(type(content_dict))
post_list = content_dict['result']['content']
print(post_list)

在这里插入图片描述

2.6 循环主体数据

目前已经获取到【post_list】,可以对数据进行循环获取每一个数据的值。
需要获取的数据有:

  • 公司名:-pubcomname
  • 公告类型-noticetype
  • 项目类型-catalogname
  • 项目名称-noticetitle
  • 发布时间-pubtime
  • 截止时间-exptime
#爬取腾讯招聘网站
import requests
import json
import time
now_time = int(time.time())
timeStamp = now_time*1000
url = 'https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=2'
headers = {
"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url = url.format(timeStamp),headers = headers)
content = response.content.decode('utf-8')
#需要将content(json.str)--->python对象的(json-dict)
content_dict = json.loads(content)
# print(type(content_dict))
post_list = content_dict['result']['content']
print(post_list)
# #将字典中的每一个dict都迭代出来
for value_dict in post_list:
# # #     #公司名:-pubcomnamepubcomname = value_dict['pubcomname']
# # #     #公告类型-noticetypenoticetype = value_dict['noticetype']
# # #     #项目类型-catalognamecatalogname = value_dict['catalogname']
# #       项目名称-noticetitlenoticetitle = value_dict['noticetitle']
# #       发布时间-pubtimepubtime = value_dict['pubtime']
# #       截止时间-exptimeexptime = value_dict['exptime']
# # #     #print看看是否有打印出来print(pubcomname,noticetype,catalogname,noticetitle,pubtime,exptime)

运行可知,打印了第一页所需要的内容
在这里插入图片描述

2.7 公告和日期改进

1、公告改进
由输出结果可知,公告类型不是页面中的文字,而是数字代替。经过分析可知

  • newNoticetype=1 为:‘询价公告’
  • newNoticetype=2 为:‘采购/招标公告’
  • newNoticetype=4 为:‘竞价公告’
  • newNoticetype=5 为:‘中标公示’
  • newNoticetype=6 为:‘竞争性谈判’
    改进代码:
 noticetype = value_dict['noticetype']if noticetype=='1' :newNoticetype='询价公告'elif noticetype=='2' :newNoticetype='采购/招标公告'elif noticetype=='4' :newNoticetype='竞价公告'elif noticetype=='5' :newNoticetype='中标公示'elif noticetype=='6' :newNoticetype='竞争性谈判'else :newNoticetype=noticetype

2、日期改进
日期显示的格式 2023-12-23T14:29:03.000+0000,我们可以只取年月日,这样就需要对数据进行截取。

# #       发布时间-pubtimepubtime = value_dict['pubtime'][0:10]
# #       截止时间-exptimeexptime = value_dict['exptime'][0:10]

代码:

#爬取腾讯招聘网站
import requests
import json
import time
now_time = int(time.time())
timeStamp = now_time*1000
url = 'https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo=0&pageSize=24&noticestate=2'
headers = {
"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
}
response = requests.get(url = url.format(timeStamp),headers = headers)
content = response.content.decode('utf-8')
#需要将content(json.str)--->python对象的(json-dict)
content_dict = json.loads(content)
post_list = content_dict['result']['content']
# #将字典中的每一个dict都迭代出来
for value_dict in post_list:
# # #     #公司名:-pubcomnamepubcomname = value_dict['pubcomname']
# # #     #公告类型-noticetypenoticetype = value_dict['noticetype']if noticetype=='1' :newNoticetype='询价公告'elif noticetype=='2' :newNoticetype='采购/招标公告'elif noticetype=='4' :newNoticetype='竞价公告'elif noticetype=='5' :newNoticetype='中标公示'elif noticetype=='6' :newNoticetype='竞争性谈判'else :newNoticetype=noticetype
# # #     #项目类型-catalognamecatalogname = value_dict['catalogname']
# #       项目名称-noticetitlenoticetitle = value_dict['noticetitle']
# #       发布时间-pubtimepubtime = value_dict['pubtime'][0:10]
# #       截止时间-exptimeexptime = value_dict['exptime'][0:10]
# # #     #print看看是否有打印出来print(pubcomname,newNoticetype,catalogname,noticetitle,pubtime,exptime)

在这里插入图片描述

2.8 循环获取前三页内容

1、循环
在最开始加上下面代码。

 for a in range(3):

2、为了爬取的安全性,在获取一次请求之后,休眠1-3秒
引入:import random
在第二层循环中加上以下代码

time.sleep(random.randrange(1,3))

2.9 保存到CSV中

1、首先引入import csv
2、在第二层循环中加上

in_fo_list =[pubcomname,newNoticetype,catalogname,noticetitle,pubtime,exptime]with open('E:/langchao.csv','a',newline = '',encoding='utf-8-sig') as f:writer = csv.writer(f)writer.writerow(in_fo_list)

-in_fo_list 表示暂时的存储序列
-encoding 表示存储的编码类型

3 完整代码

#爬取爱购云网站
import requests
import random
import json
import csv
import time
now_time = int(time.time())
timeStamp = now_time*1000
for a in range(3):url = 'https://www.igoyun.cn/igo-cloud-bizdiscovery/espurbid/fineespurbid?&pageNo={}&pageSize=24&noticestate=2'.format(a)headers = {"User-Agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}response = requests.get(url = url.format(timeStamp),headers = headers)# response = requests.get(url = url,headers = headers)# print(response.content.decode('utf-8'),type(response.content.decode('utf-8')))content = response.content.decode('utf-8')#需要将content(json.str)--->python对象的(json-dict)content_dict = json.loads(content)# print(content_dict,type(content_dict))post_list = content_dict['result']['content']# print(post_list)#将字典中的每一个dict都迭代出来time.sleep(random.randrange(1,3))print(a)for value_dict in post_list:# #     #公司名:-pubcomnamepubcomname = value_dict['pubcomname']# #     #公告类型-noticetypenoticetype = value_dict['noticetype']if noticetype=='1' :newNoticetype='询价公告'elif noticetype=='2' :newNoticetype='采购/招标公告'elif noticetype=='4' :newNoticetype='竞价公告'elif noticetype=='5' :newNoticetype='中标公示'elif noticetype=='6' :newNoticetype='竞争性谈判'else :newNoticetype=noticetype# #     #项目类型-catalognamecatalogname = value_dict['catalogname']#       项目名称-noticetitlenoticetitle = value_dict['noticetitle']#       发布时间-pubtimepubtime = value_dict['pubtime'][0:10]#       截止时间-exptimeexptime = value_dict['exptime'][0:10]# #     #print看看是否有打印出来#     print(pubcomname,newNoticetype,catalogname,noticetitle,pubtime,exptime)# #     #由于我们是要保存在CSV格式中,所以我们先把数据转化成列表模式.in_fo_list =[pubcomname,newNoticetype,catalogname,noticetitle,pubtime,exptime]with open('E:/langchao.csv','a',newline = '',encoding='utf-8-sig') as f:writer = csv.writer(f)writer.writerow(in_fo_list)

在这里插入图片描述

根据路径打开文件:
在这里插入图片描述

爬取成功!
请添加图片描述

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

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

相关文章

7-2 设计一元二次方程求解类(高教社,《Python编程基础及应用》习题9-4)——python

设计一个类Root来计算ax2bxc0的根。该类包括:a、b、c共3个属性表示方程的3个系数,getDiscriminant()方法返回b2-4ac, getRoot1()和getRoot2()返回方程的两个根。 其中,getRoot1()返回的根对应: getRoot2()返回的根对应&#xff1a…

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展,数据规模指数级膨胀,对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板,只能适应有限的场景: >> 新型分布式…

格密码:傅里叶矩阵

目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面:有关傅里叶变换的解释太多了,这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…

IntelliJ IDEA [设置] 隐藏 .idea 等 .XXX 文件夹

文章目录 1. 问题描述2. 解决办法3. 最后效果4. 特殊处理(正常不需要此步骤)总结 我们使用 IntelliJ IDEA 导入项目的时候,经常会看到一些 .XXX 的文件夹(例如:.idea,.mvn,.gradle 等&#xff0…

支付宝、学习强国小程序input、textarea数据双向绑定

前言 和 vue 的绑定有些区别,需要注意。直接 value"{{inputValue}}" 是无法双向绑定的。 正确思路 文档说的比较详细,不过没有组合使用的案例,需要自行理解。这里正确的方法是先用 value 绑定数据,再使用 onInput 事件…

鸿蒙的基本项目_tabbar,首页,购物车,我的

以上效果,由四个ets文件实现,分别是容器页面。首页,购物车,我的。 页面里的数据,我是用json-server进行模拟的数据。 一、容器页面 使用组件Tabs和Tabcontent结合。 import Home from "./Home"; import …

短剧付费变现小程序源码系统:开通会员+在线充值+风口项目,变现利器+完整的代码包 附带部署安装教程

在当今数字化时代,短剧付费变现小程序源码系统已经成为了一个热门的风口项目。它以开通会员、在线充值、完整的代码包等特色功能,成为了一种有效的变现利器,受到了广泛的关注和应用。本文将详细介绍这个源码系统的背景和特色功能,…

实现阿里云oss云存储,简单几步

一、前言 虽然平常学习用的不多&#xff0c;但是用的时候再去找官方文档&#xff0c;也很繁琐&#xff0c;不如直接整理以下&#xff0c;方便粘贴复制&#xff0c;本文介绍两种图片上传方式①普通上传②服务端签名直传 1.普通上传 加载maven依赖 <dependency><grou…

centos 安装oracle 11.2.04 并配置数据库自启动操作记录,一次完成

环境&#xff1a; centos版本7.3&#xff0c;安装的有图形化界面 Oracle11.2.04&#xff0c;之所以选择这个版本是因为网上有人说11其他版本的在安装的过程中会出现这样或那样的问题&#xff0c;下载地址放到文章下面 步骤&#xff0c;按顺序&#xff1a; 1、创建安装Oracle…

万用表测接地电阻方法

万用表测接地电阻方法 用万用表在不同土质的土壤对接地电阻进行了实验&#xff0c;并将万用表所测数据和专用接地电阻测试仪所测数据进行了比较&#xff0c;两者十分接近。具体测量方法如下&#xff1a; 找两根8mm、1m长的圆钢&#xff0c;将其一端磨尖作为辅助测试棒&#x…

Mysql之视图

Mysql之视图 常见的数据库对象视图概述为什么使用视图视图的理解创建视图创建单表视图别名的运用 创建多表联合视图利用视图对数据进行格式化contact 函数以视图为基&#xff0c;再创建新的视图 查看视图更新视图的数据一般情况不可更新的视图 修改和删除视图修改视图删除视图注…

【C#】Visual Studio 2022 远程调试配置教程

在某些特殊的情况下&#xff0c;开发机和调试机可能不是同一台设备&#xff0c;此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹&#xff0c;用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …

什么是阿里云负载均衡SLB?

目录 硬件或软件负载均衡的区别是什么&#xff1f; 什么是阿里云负载均衡SLB&#xff1f; 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么&#xff1f; 通过专用硬件实现负载均衡&#xff0c;那么整体成本会较高&#xff0c;而且设备容易出现单点故障&#xff0c;…

【MySQL】InnoDB和MyISAM区别

文章目录 一、索引不同1 InnoDB聚簇索引&#xff0c;MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键&#xff0c;MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…

Elasticsearch中复制一个索引数据到新的索引中

问题 我有时候&#xff0c;需要调试一个已经存在的ES索引&#xff0c;需要从已有的索引复制数据到新的索引中去。 解决 这里我借助一个GUI工具&#xff0c;来解决这个问题&#xff0c;底层它是使用Reindex的API实现索引数据复制的。 步骤 选中已存在的redix菜单&#xff0…

00-Git 应用

Git 应用 一、Git概述 1.1 什么是Git git 是一个代码协同管理工具&#xff0c;也称之为代码版本控制工具&#xff0c;代码版本控制或管理的工具用的最多的&#xff1a; svn、 git。 SVN 是采用的 同步机制&#xff0c;即本地的代码版本和服务器的版本保持一致&#xff08;提…

KEPServerEX 6 之【外篇-1】PTC-ThingWorx服务端软件安装 Tomcat10本地安装

本文目标: 安装 Java 和 Apache Tomcat ,为ThingWorx安装做基础。 ----------------------------------------------------------------------- 安装重点 --------------------------------------------------------------------- 1. 安装 Java 11 / JDK 11 添加系…

SSRF中Redis的利用

目录 1. SSRF 1.1 什么是SSRF 1.2 漏洞成因 1.3 可能会存在SSRF的地方 1.4 SSRF分类 1.5 验证方法 1.6 利用方式 1.7 可以利用的协议 1.8 SSRF过滤绕过 2. SSRF攻击Redis 2.1 环境搭建 2.2 漏洞复现(通过ssrf利用redis写入webshell) 2.2.1 想要写入webshell的两个…

【unity学习笔记】4.场景切换

创建空物体→创建脚本挂载在空物体上→打开脚本 1.创建所需要的场景 assets中点击创建场景 2.文件→生成设置 3.将需要的场景拖入 4.场景跳转 创建空对象&#xff0c;将脚本放在空对象上。 注意两个类&#xff1a;场景类、场景管理类 void Start(){//场景跳转SceneManager.Lo…

labelme目标检测数据类型转换

1. labelme数据类型 LabelMe是一个开源的在线图像标注工具&#xff0c;旨在帮助用户创建和标记图像数据集。它提供了一个用户友好的界面&#xff0c;让用户可以直观地在图像上绘制标记框、多边形、线条等&#xff0c;以标识和注释图像中的对象或区域。 GitHub&#xff1a;http…