Python 爬取网页水务数据并实现智慧水务前端可视化
提示:本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。
文章目录
- 一、爬虫
- 二、对爬取的数据进行数据库、excel的存储与数据处理
- 1.代码实现
- 三、应用Flask框架将后端获取数据后渲染到前端
- 四、前端Echarts的使用
- 1.下载echarts.min.js
- 2.放入静态文件夹下
- 3.在要使用echarts的html网页中,导入这个文件
- 4.在官网中找到自己心仪的图表
- 5.下载官网中的代码到本地
- 6.下载后用记事本打开,选取需要的部分
- 7.将需要的部分粘贴到前端页面中,并将数据修改为后端传递的数据即可
- 五、最终的效果
一、爬虫
爬虫是一种强大的数据获取工具,可以帮助我们自动化地收集互联网上的各种信息,为数据分析、数据挖掘等领域提供有力的支持。被称为网络爬虫或网页蜘蛛,是一种按照一定规则自动地抓取互联网信息的程序或脚本。Python 爬虫是一种利用 Python 编程语言编写的程序,用于自动地浏览万维网并从网页中提取数据。Python 因其简洁的语法、丰富的库支持和强大的社区支持,成为了实现爬虫项目的热门选择。
基本工作流程:
- 发起请求:通过HTTP库(如Python的requests库)向目标网站发送请求,获取网页内容。
- 获取响应:接收服务器的响应,通常是HTML格式的网页源代码。
- 解析网页:使用解析库(如Python的BeautifulSoup或lxml)对网页内容进行解析,提取出需要的数据(如文本、图片链接、视频链接等)。
- 存储数据:将提取出的数据存储到数据库或文件中,供后续处理或分析使用。
重复以上步骤:根据需要,爬虫可以不断重复上述步骤,以获取更多数据或更新数据
注意事项
- 遵守 robots.txt:在编写爬虫时,请确保遵守目标网站的 robots.txt
文件中的规则,以避免对网站造成不必要的负担或被视为恶意访问。 - 合理设置请求头:为了模拟浏览器访问,你可能需要设置 User-Agent 请求头。
使用代理和延时:为了减少对目标网站服务器的压力,你可以考虑使用代理和设置请求之间的延时。 - 处理 JavaScript 渲染的内容:如果目标网页的内容是通过 JavaScript
动态生成的,那么上述示例中的方法可能无法直接获取到这些内容。这时,你可以考虑使用像 Selenium 这样的工具来模拟浏览器行为。 - 法律和道德问题:在编写爬虫时,请确保你的行为符合当地的法律法规,并尊重网站的版权和隐私政策。
爬虫常用的库
网络请求库
urllib:Python3自带的库,提供了基本的URL请求和网页抓取功能。它是最简单的网络请求库,但功能相对基础。
requests:第三方库,建立在urllib3之上,提供了更加人性化的API。它简化了发送HTTP请求和处理响应的过程,是最常用的Python网络请求库之一。
Selenium:自动化测试工具,通过模拟用户在浏览器中的操作来抓取动态网页内容。它支持多种浏览器,如Chrome、Firefox等,适用于需要JavaScript渲染的页面。
网页解析库
Beautiful Soup:第三方库,用于解析HTML和XML文档。它提供了从网页中提取数据的简便方法,支持多种解析器,如Python标准库中的html.parser和lxml。
lxml:第三方库,支持HTML和XML的解析,并且提供了XPath和CSS选择器的支持。它的解析效率非常高,是处理大型网页数据的理想选择。
pyquery:第三方库,类似于jQuery的Python实现,能够以jQuery的语法来操作解析HTML文档。它对于熟悉jQuery的开发者来说非常友好。
异步及并发库
asyncio:Python标准库(Python 3.4+),提供了异步I/O、时间循环、协同程序和任务等功能。结合aiohttp等异步HTTP库,可以高效地处理大量并发请求。
concurrent.futures:Python标准库,为调用异步执行提供了一个高层次的接口。它支持ThreadPoolExecutor和ProcessPoolExecutor,可以分别用于I/O密集型和CPU密集型任务的并发执行。
aiohttp:基于asyncio实现的HTTP框架,支持异步操作。它提供了与requests类似的API,但具有更高的效率和更好的并发性能。
爬虫框架
Scrapy:一个高级的Web抓取框架,用于从高度复杂的网站中抓取数据。它提供了强大的编码支持、选择器引擎和爬虫引擎,并且支持多种数据库后端和消息队列。Scrapy的学习曲线可能较陡峭,但一旦掌握,可以高效地处理各种爬取任务。
PySpider:一个由国人编写的强大的网络爬虫系统,带有强大的WebUI、脚本编辑器、任务监控器、项目管理以及结果处理器。它支持多种数据库后端和消息队列,并且可以渲染JavaScript页面。
Crawley:一个高速爬取对应网站内容的框架,支持关系和非关系数据库,数据可以导出为JSON、XML等格式。但需要注意的是,Crawley并不是一个广为人知的爬虫框架,可能在使用和社区支持方面存在限制。
其他常用库
fake-useragent:用于生成随机的User-Agent字符串,以模拟不同设备的浏览器请求,有助于绕过一些简单的反爬虫机制。
re:Python标准库,提供了正则表达式的支持。虽然它本身不是爬虫库,但在处理网页数据时经常用于文本匹配和提取。
从深圳市水务局的网站上获取污水处理数据
# -*- codeing = utf-8 -*-
# @Time : 2022/11/29 15:32
# @Author : 小马
# @File: GetData.py
# @Software : PyCharm
#从深圳市水务局获取到深圳各个区的污水处理数据
import urllib.request,urllib.error
import pymysql
import re
from bs4 import BeautifulSoup
import xlwtfindaddress=re.compile(r'<a href="(.*)" target="_blank">20(.*)</a>')
finddataset=re.compile(r'<p style="text-align: center;"><strong>(.*?)</strong></p>')
finddataset2020=re.compile(r'<p style="text-align: left;"><strong>(.*?)</strong></p>')
baseurl="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/"
#元特区 福田区 罗湖区 盐田区 南山区 宝安区 大鹏新区 龙宝区 龙华区 坪山区 光明区
def ask(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.178.400 QQBrowser/11.2.5170.400"}request = urllib.request.Request(url=url, headers=headers)html = ""try:response = urllib.request.urlopen(request)html = response.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"): # hasattr() 函数用来判断某个类实例对象是否包含指定名称的属性或方法。print(e.code)if hasattr(e, "reason"):print(e.reason)return html
def getaddress(baseurl):addressList=[]htmll=ask(baseurl)soup=BeautifulSoup(htmll,"html.parser")for item in soup("a",target="_blank"):item=str(item)add=re.findall(findaddress,item)if(len(add)>0):addressList.append(add[0][0])return addressList
def get2021(): url="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/content/post_9685824.html"html=ask(url)soup=BeautifulSoup(html,"html.parser")year="2021"districtList=[]districtname=[]sum1=[]sum2=[]for i in soup.tbody:i=str(i)data=re.findall(finddataset,i)if(len(data)>0):if(len(data)==1):districtname.append(data[0])if(len(data)==3):sum1.append(data[1])sum2.append(data[2])# for item in soup("p",style="text-align: center"):# print(item)# for i in districtname:# print(i)# for i in sum1:# print(i)# for i in sum2:# print(i)for i in range(0,7):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)return districtList
def get2020(): url="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/content/post_8666858.html"html = ask(url)soup = BeautifulSoup(html, "html.parser")year = "2020"districtList = []districtname = []sum1 = []sum2 = []for i in soup.tbody:i = str(i)data = re.findall(finddataset2020, i)if (len(data) > 0):if (len(data) == 1):districtname.append(data[0])if (len(data) == 3):sum1.append(data[1])sum2.append(data[2])for i in range(0,2):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)district = []district.append(year)district.append("盐田区")district.append(12)district.append(3003.25)districtList.append(district)for i in range(4,10):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)return districtList
def get2019():url="http://swj.sz.gov.cn/xxgk/zfxxgkml/szswgk/tjsj/psgltj/content/post_8123700.html"html = ask(url)soup = BeautifulSoup(html, "html.parser")year = "2019"districtList = []districtname = []sum1 = []sum2 = []for i in soup.tbody:i = str(i)data = re.findall(finddataset2020, i)if (len(data) > 0):if (len(data) == 1):districtname.append(data[0])if (len(data) == 3):sum1.append(data[1])sum2.append(data[2])for i in range(0,7):district = []district.append(year)district.append(districtname[i])district.append(sum1[i])district.append(sum2[i])districtList.append(district)return districtList
def initdb(sql):db=pymysql.connect(host="localhost",user="root",password="root",port=3307,database="student",charset='utf8')try:cursor=db.cursor()data=cursor.execute(sql)print(data)result=cursor.fetchall()for i in result:print(i)db.commit()except Exception as e:db.rollback()print(str(e))finally:db.close()
def usedb():a=get2021()for item in a:item[1]='"'+item[1]+'"'sql = "insert into sewage (year,district,scale,sewagetreatment)values(%s,%s,%s,%s)"%(item[0],item[1],item[2],item[3])initdb(sql)b=get2020()for item in b:item[1] = '"' + item[1] + '"'sql = "insert into sewage (year,district,scale,sewagetreatment)values(%s,%s,%s,%s)" % (item[0], item[1], item[2], item[3])initdb(sql)c=get2019()for item in c:item[1] = '"' + item[1] + '"'sql = "insert into sewage (year,district,scale,sewagetreatment)values(%s,%s,%s,%s)" % (item[0], item[1], item[2], item[3])initdb(sql)
def getDatafromDB():sql="select * from sewage"db = pymysql.connect(host="localhost", user="root", password="root", port=3307, database="student", charset='utf8')try:cursor = db.cursor()data = cursor.execute(sql)result = cursor.fetchall()db.commit()except Exception as e:db.rollback()print(str(e))finally:db.close()return result
def getDatafrom(sql):db = pymysql.connect(host="localhost", user="root", password="root", port=3307, database="student", charset='utf8')try:cursor = db.cursor()data = cursor.execute(sql)result = cursor.fetchall()db.commit()except Exception as e:db.rollback()print(str(e))finally:db.close()return result
if __name__=="__main__":sql = "select sum(sewagetreatment) from sewage where year=2019"sql1 = "select sum(sewagetreatment) from sewage where year=2020"r=getDatafrom(sql)q=getDatafrom(sql1)print(int(r[0][0]))print(int(q[0][0]))
二、对爬取的数据进行数据库、excel的存储与数据处理
必要性:对爬取的数据进行数据库、Excel的存储与数据处理是数据分析和挖掘过程中非常重要的一步,爬取的数据通常是从网页或其他来源临时获取的。如果不进行存储,一旦程序关闭或数据源更新,这些数据就会丢失。通过将其存储在数据库或Excel文件中,可以确保数据的持久化,即数据可以长期保存并随时访问。存储在数据库或Excel中的数据可以轻松地通过SQL查询、Excel函数或数据分析工具(如Python的pandas库)进行进一步的分析和挖掘。这有助于发现数据中的模式、趋势和关联,从而支持决策制定和业务洞察。在将数据存储到数据库或Excel之前,通常需要进行一系列的数据处理和清洗工作,如去除重复数据、处理缺失值、转换数据类型和格式等。这些工作有助于确保数据的准确性和一致性,为后续的分析和挖掘提供可靠的数据基础。
1.代码实现
# -*- codeing = utf-8 -*-
# @Time : 2022/11/9 19:46
# @Author : 小马
# @File: Methods.py
# @Software : PyCharmimport sqlite3
import xlrd
import xlwt
#从月度总水量表中获得数据并将数据插入到数据表WaterConsumption中
def CreateWaterConsumption():dbpath = "water.db"sql = '''create table WaterConsumption(id integer primary key autoincrement,date text,Machine1 text,Machine2 text,Machine3 text,Machine4 text,Machine5 text,Machine6 text,totaltime text,totalwater text,totalconsumption text)'''conn = sqlite3.connect(dbpath)cur = conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
def searchall():datalist = []con = sqlite3.connect("water.db")cur = con.cursor()sql = "select date,Machine1,Machine2,Machine3,Machine4,Machine5,Machine6,totaltime from WaterConsumption"data = cur.execute(sql)for item in data:datalist.append(item)cur.close()con.close()return datalist
def searchMachine():m1=[]m2=[]m3=[]m4=[]m5=[]m6=[]con = sqlite3.connect("water.db")cur = con.cursor()sql1 = "select Machine1,Machine2,Machine3,Machine4,Machine5,Machine6 from WaterConsumption"data1 = cur.execute(sql1)for item in data1:m1.append(item[0])m2.append(item[1])m3.append(item[2])m4.append(item[3])m5.append(item[4])m6.append(item[5])cur.close()con.close()return m1,m2,m3,m4,m5,m6
def searchDateAndWater():date=[]wate=[]con = sqlite3.connect("water.db")cur = con.cursor()sql = "select date,totaltime from WaterConsumption"data = cur.execute(sql)for item in data:date.append(item[0])wate.append(item[1])cur.close()con.close()return date,watedef ReadExcel():conn=sqlite3.connect("water.db")cur=conn.cursor()data=xlrd.open_workbook("月度总用水量.xls")sheet=data.sheet_by_name("Sheet1")for i in range(1,sheet.nrows):sql = '''insert into WaterConsumption(date,Machine1,Machine2,Machine3,Machine4,Machine5,Machine6,totalconsumption,totaltime,totalwater)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'''%(sheet.row(i)[0].value, sheet.row(i)[1].value, sheet.row(i)[2].value,sheet.row(i)[3].value,sheet.row(i)[4].value,sheet.row(i)[5].value,sheet.row(i)[6].value,sheet.row(i)[7].value,sheet.row(i)[8].value,sheet.row(i)[9].value)cur.execute(sql)conn.commit()cur.close()conn.close()#创建WaterConsumption水量消耗表格#将注册手机号,邮箱,密码插入到数据库中
def InsertIntoTable(p,pa,e):sql = '''insert into UserTable(phonenumber,password,email,isdeleted)values(%s,%s,%s,0)'''%(p,pa,e)conn=sqlite3.connect("water.db")cur=conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
#根据手机号查询密码和逻辑删除来实现登陆功能
def SelectFromTable(p):sql='''select password from UserTable where phonenumber=%s and isdeleted=0'''%pconn=sqlite3.connect("water.db")cur=conn.cursor()pa=cur.execute(sql)result=pa.fetchone()conn.commit()cur.close()conn.close()return result[0]#创建数据库并建表
def CreateTableAndDataBase():dbpath="water.db"sql='''create table UserTable(id integer primary key autoincrement,phonenumber text,password text,email text,isdeleted integer)'''conn=sqlite3.connect(dbpath)cur=conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
def deleteTable():dbpath = "water.db"sql = '''drop table WaterConsumption'''conn = sqlite3.connect(dbpath)cur = conn.cursor()cur.execute(sql)conn.commit()cur.close()conn.close()
#将数据写入excel表格
def exportTo():data = xlrd.open_workbook("月度总用水量.xls")sheet = data.sheet_by_name("Sheet1")# #for i in range(1, sheet.nrows):workbook = xlwt.Workbook(encoding="UTF-8") # 创建workbook对象 一个文件worksheet = workbook.add_sheet('sheet1')for i in range(0,10):worksheet.write(0,i,sheet.row(0)[i].value)for i in range(1, sheet.nrows):for j in range(0, 10):worksheet.write(i, j, sheet.row(i)[j].value)workbook.save('C:/Users/DELL/Downloads/月度总用水表.xls')
def searchSumSix():datalist=[]sql="select sum(Machine1),sum(Machine2),sum(Machine3),sum(Machine4),sum(Machine5),sum(Machine6) from WaterConsumption"dbpath = "water.db"conn = sqlite3.connect(dbpath)cur = conn.cursor()data=cur.execute(sql)for item in data:datalist.append(item)conn.commit()cur.close()conn.close()return datalistif __name__=='__main__':d=searchSumSix()print(int(d[0][0]))print(d[0][1])
# -*- codeing = utf-8 -*-
# @Time : 2022/11/12 16:50
# @Author : 小马
# @File: Service.py
# @Software : PyCharm#代价
import xlrd2#将供水管网维修记录表中的信息插入到数据库中
def ReadAndAnalysisExcel():datelist=[]data = xlrd2.open_workbook("供水管网维修记录.xls")sheet = data.sheet_by_name("新交叉表_供水管网")for i in range(1,476):if(sheet.row(i)[7].value == "是"):date="2021-"+(sheet.row(i)[0].value)[4:6]+"-"+(sheet.row(i)[0].value)[6:8]datelist.append(date)return datelist#其他、第三者/人为、非我司管辖范围 外腐蚀 自然老化 施工质量
def ReadAndAnalysisQuestion():result=[]a=0b=0c=0d=0e=0f=0datelist = []data = xlrd2.open_workbook("供水管网维修记录.xls")sheet = data.sheet_by_name("新交叉表_供水管网")for i in range(1,sheet.nrows):if(sheet.row(i)[3].value=="其他"):a=a+1elif(sheet.row(i)[3].value=="第三者/人为"):b=b+1elif (sheet.row(i)[3].value == "非我司管辖范围"):c = c + 1elif (sheet.row(i)[3].value == "外腐蚀"):d = d + 1elif (sheet.row(i)[3].value == "自然老化"):e = e + 1elif (sheet.row(i)[3].value == "施工质量"):f = f + 1result.append(a)result.append(b)result.append(c)result.append(d)result.append(e)result.append(f)return resultif __name__=='__main__':r=ReadAndAnalysisQuestion()print(r[1])
三、应用Flask框架将后端获取数据后渲染到前端
Flask 是一个非常适合初学者和经验丰富的开发者使用的 Web 框架,它简洁而强大,能够帮助你快速构建出高质量的 Web 应用。
Flask的安装:
pip install Flask
Flask 的特点
轻量级:Flask 核心非常简洁,易于扩展。
灵活:你可以自由地选择数据库、模板引擎等。
WSGI 兼容:Flask 遵循 WSGI(Web Server Gateway Interface)标准,可以与多种服务器兼容。
开发便捷:内置的开发服务器和调试器让开发变得简单快捷。
社区支持:由于 Flask 的流行,其社区非常活跃,提供了大量的插件和扩展。
简单实例:
from flask import Flask app = Flask(__name__) @app.route('/')
def hello_python(): return 'Hello, Python!' if __name__ == '__main__': app.run(debug=True)
具体实现
# -*- codeing = utf-8 -*-
# @Time : 2022/11/8 10:44
# @Author : 小马
# @File: app.py
# @Software : PyCharm
import GetData
from flask import Flask,render_template
from flask import request
import sqlite3
import Methods
import json
import Serviceapp=Flask(__name__)
@app.route('/',methods=['GET','POST'])
def login():data=request.get_data()if(len(data)>0):print(data)phonenumber = request.form.get('phonenumber')password = request.form.get('password')p = '"' + phonenumber + '"'password1=Methods.SelectFromTable(p)if(password==password1 or password is password1):return render_template("index.html")else:print(password)print(password1)return render_template("login.html")
@app.route('/forgotpassword')
def forgot():return render_template("forgot-password.html")
@app.route('/index')
def index():return render_template("index.html")@app.route('/utilities-animation')
def animation():result=GetData.getDatafromDB()sql = "select sum(sewagetreatment) from sewage where year=2019"sql1 = "select sum(sewagetreatment) from sewage where year=2020"sql2="select sum(sewagetreatment) from sewage where year=2021"r = GetData.getDatafrom(sql)q = GetData.getDatafrom(sql1)l = GetData.getDatafrom(sql2)return render_template("utilities-animation.html",data=result,d1=int(r[0][0])/1000,d2=int(q[0][0])/1000,d3=int(l[0][0])/1000)@app.route('/question')
def question():r = Service.ReadAndAnalysisQuestion()return render_template("question.html",data=r)
@app.route('/buttons')
def buttons():d=Methods.searchall()return render_template("buttons.html",waterlist=d)
@app.route('/charts')
def charts():d=Service.ReadAndAnalysisExcel()return render_template("charts.html",dateList=d)
@app.route('/export')
def export():Methods.exportTo()d = Methods.searchall()return render_template("buttons.html",waterlist=d)@app.route('/tables')
def tables():return render_template("tables.html")
@app.route('/cards')
def cards():a=Methods.searchMachine()b=Methods.searchSumSix()b1 = int(b[0][0])b2 = int(b[0][1])b3 = int(b[0][2])b4 = int(b[0][3])b5 = int(b[0][4])b6 = int(b[0][5])d=Methods.searchDateAndWater()Xdata=d[0]Ydata=d[1]return render_template("cards.html",Xdata=Xdata,Ydata=Ydata,m1=a[0],m2=a[1],m3=a[2],m4=a[3],m5=a[4],m6=a[5],n1=b1,n2=b2,n3=b3,n4=b4,n5=b5,n6=b6)@app.route('/register',methods=['GET','POST'])
def register():data = request.get_data()print("----------")print(data)if(len(data)>0):phonenumber=request.form.get('phonenumber')password=request.form.get('password')email=request.form.get('email')if(len(phonenumber)>0 and len(password)>0):p='"'+phonenumber+'"'pa='"'+password+'"'e='"'+email+'"'Methods.InsertIntoTable(p,pa,e)return render_template("login.html")return render_template("register.html")if __name__=='__main__':app.run(debug=True)
四、前端Echarts的使用
1.下载echarts.min.js
链接:
https://github.com/apache/echarts/tree/master/dist
2.放入静态文件夹下
3.在要使用echarts的html网页中,导入这个文件
代码如下:
<script src="static/js/echarts.min.js"></script>
4.在官网中找到自己心仪的图表
5.下载官网中的代码到本地
6.下载后用记事本打开,选取需要的部分
7.将需要的部分粘贴到前端页面中,并将数据修改为后端传递的数据即可
后端传递的数据
@app.route('/charts')
def charts():d=Service.ReadAndAnalysisExcel()return render_template("charts.html",dateList=d)
前端接收和调用
var datelist={{dateList|tojson}};
五、最终的效果
将代码的链接放到了最后,有喜欢的小伙伴在下载时给作者点一个star
智慧水务:https://gitee.com/majunlong1/IntelligentWater
相关文章:

Python 爬取网页水务数据并实现智慧水务前端可视化
提示:本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。 文章目录 一、爬虫二、对爬取的数据进行数据库、excel的存储与数据处理1.代码实现 三、应用Flask框架将后端获取数据后渲染到前端四、前端Echarts的使用1.下载echarts.min.js…...

百度智能云发布3款轻量级+2款场景大模型
文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景,ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”,推理场景…...

UE基础 —— 编辑器界面
菜单栏 UE中每个编辑器都有一个菜单栏,部分菜单会出现在所有编辑器窗口中,如File、Window、Help,其他则是其编辑器特有的; 主工具栏 UE中部分最常用的工具和命令的快捷方式; 1,保存按钮(ctrls&a…...

2024年Vue组件库大比拼:谁将成为下一个Element?
2024 年,Vue生态蓬勃发展,越来越多的开发者开始探索更适合自己项目的组件库。 今天我们来看一下2024年最受欢迎的几款Vue开源组件库,除了Element,开发者们还有哪些选择呢? 1.Vuetify Vuetify是由社区支持的Vue组件库&…...

SS9283403 sqlite3交叉编译并部署到SS928(六)
1.Sqlite3下载 连接:SQLite Download Page 2.解压 tar zxvf sqlite-autoconf-3460000.tar.gz 3.配置并编译 进入解压目录,打开命令行,输入如下命令 ./configure CCaarch64-mix210-linux-gcc --hostarm-linux --prefix/home/mc/work/sqlite…...

java3d-1_4_0_01-windows-i586.exe
下载 Java 3D API 安装 C:\Program Files\Java\Java3D\1.4.0_01\bin C:\Java\jre6 C:\Java\jdk1.6.0_45 C:\Windows 记录下这 4 个目录,去检查下 4 哥目录下文件多了什么 检查目录① C:\Program Files\Java\Java3D\1.4.0_01\bin 检查目录② C:\Java\jre6 C:…...

Vue3中的history模式路由:打造无缝导航体验!
Hey小伙伴们,今天给大家带来Vue3中使用history模式路由的实战案例!🌟 🔍 项目背景 Vue3的路由功能非常强大,可以帮助我们轻松实现单页面应用中的页面切换。但是你知道吗?默认情况下Vue Router使用的是has…...

python(6)
一、datetime函数 方法一: 前一个datetime是模块。后一个datetime是类型 方法二: 方法三: 二、逆序字符串 三 、旋转字符串...

以Zed项目为例学习大型Rust项目的组织与管理
说明 Zed项目代码:https://github.com/zed-industries/zed.git本文项目代码:https://github.com/VinciYan/zed_workspace.git Zed是一款由Atom创始人开发的高性能、协作友好的现代开源代码编辑器,使用Rust编写,集成AI辅助功能&a…...

正点原子imx6ull-mini-Linux驱动之Linux RS232/485/GPS 驱动实验(23)
错误1:我一直找不到为什么我的minicom用不了,编译啥的都通过了,原来是我的密码文件命名错了,我就习以为常的命名为password,谁知道应该是passwd,所以以后该复制的还是复制,不然就容易找不到源头…...

用户上下文打通+本地缓存Guava
文章目录 🌞 Sun Frame:SpringBoot 的轻量级开发框架(个人开源项目推荐)🌟 亮点功能📦 spring cloud模块概览常用工具 🔗 更多信息1.设计1.链路流程2.详细设计 2.网关过滤器获取唯一标识放到Hea…...

Windows图形界面(GUI)-MFC-C/C++ - 树形视图(Tree Control) - CTreeCtrl
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 树形视图(Tree Control) - CTreeCtrl 创建和初始化 添加和删除项 获取和设置项属性 操作项 项选择变化 项双击 项展开 示例代码 树形视图(Tree Control) - CTreeCtrl 创建和初始…...

C语言 --- 枚举、位运算
(一)枚举 1.概念:枚举是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围 2.作用:a.提高代码可读性;b.提高代码的安全性 3.枚举类型: enum 枚举名 { 列举各种值 //枚举元素或枚…...

12322222222
当您和老王不在同一个网段时,您们之间的通信需要通过路由器来实现。这是因为不同的网段被视为不同的网络,而路由器的作用之一就是连接不同的网络并负责数据包的转发。下面是详细的通信流程: 本地网络通信尝试:您的设备࿰…...

知识改变命运:Java 语言 【可变参数】
可变参数 概念:Java允许一个类中多个同名同功能但是参数不同的方法,封装为一个方法。 基本语法: 访问修饰符 返回值 方法名 (数据类型...参数名) { ...... }案例:写一个类名DyMethod 方法名sum 计算两个整数和,三个整…...

Spring及相关框架的重要的问题
Java框架 问题一:Spring框架中的单例bean是线程安全的吗? 看下图,不能被修改的成员变量就是无状态的类,无状态的类没有线程安全问题,所以在开发中尽量避免可修改的成员变量。 回答:不是线程安全的…...

Linux Vim教程
Linux Vim 教程 Vim(Vi IMproved)是一个强大的文本编辑器,广泛用于编程和系统管理。本文将带你全面了解 Vim 的基础使用、常用命令、高级功能等。 1. 安装 Vim 在大多数 Linux 发行版中,Vim 已经预装。如果没有,可以…...

【学习笔记】多进程信号量控制
目录 1、CreateSemaphore 2、ReleaseSemaphore 3、CreateEvent 4、SetEvent 5、WaitForSingleObject 程序案例1: 程序案例2: 1、CreateSemaphore 创建一个计数信号量对象,成功时返回信号量对象的句柄;失败时返回NULL&…...

Redis与Memorycache的区别
Redis与Memorycache主要是持久线程和持久化的区别 1、从性能方面来说: Redis是单线程的,优点是CPU开销小,省去多线程线程之间切换的开销,但是相对于Memorycache来说海量数据的相对较低 Memorycache使用了多线程技术,数…...

docker和Helm Chart的基本命令和操作
一、docker基本命令和操作 1. docker login【登录】 登录 docker client,登录成功之后会显示 Login Succeeded。 docker login登陆到指定的镜像仓库,docker pull 和 docker push 操作都需要预先执行 docker login 操作; 指令:&a…...

Node中的CSRF攻击和防御
Node中的CSRF攻击和防御 假设有一个网上银行系统,用户可以通过该系统进行转账操作。转账功能的URL可能是这样的: https://www.bank.com/transfer?toAccount123456&amount1000当用户登录到银行系统,并在浏览器中访问这个URL时ÿ…...

CSS 多按钮根据半圆弧度排列
需求 多个按钮根据弧度,延边均匀排列。 实现 HTML 分两级;第一级,外层定义按钮的 compose-container 宽度;第二级,按钮集合,使用方法 styleBtn(index),根据索引计算; <div c…...

【Linux】网络编程套接字Scoket:UDP网络编程
目录 一、了解UDP协议 二、了解端口和IP地址 三、套接字概述与Socket的概念 四、Socket的类型 五、 Socket的信息数据结构 六、网络字节序与主机字节序的互相转换 七、地址转换函数 八、UDP网络编程流程及相关函数 socket函数 bind函数 recvfrom函数 sendto函数 …...

基于模糊PID控制器的puma560机器人控制系统的simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PUMA 560机器人的数学模型 4.2 PID控制原理 4.3 模糊PID控制器的设计 5.完整工程文件 1.课题概述 基于模糊PID控制器的puma560机器人控制系统的simulink建模与仿真,对比传统的PID控制器…...

C语言文件操作超详解
文章目录 1. 为什么使用文件2. 什么是文件2. 1 程序文件2. 2 数据文件2. 3 文件名3. 二进制文件和文本文件? 4. 文件的打开和关闭4. 1 流和标准流4. 1. 1 流4. 1. 2 标准流 4. 2 文件指针4. 3 文件的打开和关闭 5. 文件的顺序读写5. 1 顺序读写函数介绍5. 2 对比一组函数: 6. …...

表字段显示tip
需求背景: 生成的报表,前端只展示字段名称,计算逻辑没有解释,使用方频繁“骚扰”,实在受不了,增加一个字段tip,实现效果(下图): 代码 结合使用el-table-colu…...

十二、享元模式
文章目录 1 基本介绍2 案例2.1 Digit 接口2.2 Color 枚举2.3 BigDigit 类2.4 DigitFactory 类2.5 Client 类2.6 Client 类的测试结果2.7 总结 3 各角色之间的关系3.1 角色3.1.1 Flyweight ( 抽象享元 )3.1.2 ConcreteFlyweight ( 具体享元 )3.1.3 UnsharedFlyweight ( 非享元 )…...

黑马Java零基础视频教程精华部分_18_Arrays各种方法
系列文章目录 文章目录 系列文章目录Arrays简介Arrays各种方法toString代码示例binarySearch代码示例copyOf代码示例copyOfRange和fill代码示例sort代码示例 Arrays简介 操作数组的工具类。 Arrays各种方法 toString代码示例 int[]arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //to…...

RAG私域问答场景超级详细方案(第一期方案)[1]:工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块)
RAG私域问答场景整体夏详细方案(第一期方案):工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块) 大模型性能的跳阶式增长给文本摘要、信息检索、信息抽取、语义问答等自然语言处理任务带来了卓越的性能提升。同时,LangChain 作为一种基于 LLM 的框架,能够快速…...

【AI在医疗领域的应用】AI在疾病诊断、个性化治疗等领域的应用
AI在医疗领域的应用 AI在疾病诊断、个性化治疗等领域的应用 引言 人工智能(AI)技术正在迅速改变各个行业,而医疗领域无疑是AI应用最广泛、影响最深远的领域之一。AI在医疗中的应用不仅能够提高诊断的准确性和效率,还为个性化治疗…...