【Project】CupFox电影网站数据爬取分析与可视化

数据采集清洗与数据存储流程如下图所示。

数据分析与数据可视化流程设计如下

1.使用pymongo从数据库中查询所需的数据。对数据进行处理和分析,进行统计、分类、聚合等操作,提取关键指标和洞察。分析结果可以通过编写Python代码进一步优化、筛选和整理,以便于后续可视化展示。

2.使用pyecharts库生成图表对象(如柱状图、折线图、饼图等),将分析结果可视化。通过render_embed()方法将生成的图表嵌入到HTML模板中。使用Flask框架将图表渲染并传输到前端,展示给用户。用户可以在Web界面上交互式地查看图表,了解数据的动态变化和趋势。

数据分析与数据可视化流程如下图所示。

自动化流程设计

代码管理与版本控制

Gitea:作为代码托管平台,团队通过Gitea进行源代码的管理和版本控制。所有代码变更(如新功能开发、Bug修复)都通过Git提交,并同步到Gitea仓库中。

分支管理:采用Git的分支策略,开发人员在不同的分支上进行开发工作(如feature、bugfix、release等),确保主分支(main)保持稳定,避免开发中断。

持续集成

Jenkins:使用Jenkins实现持续集成,自动化构建和测试代码。当代码提交到Gitea仓库后,Jenkins会检测到变更并自动启动构建流程。

Jenkinsfile:通过编写Jenkinsfile脚本定义CI/CD流水线,确保每次提交代码时都进行构建、编译、单元测试等任务,确保代码质量。

容器化与自动化构建

Docker:项目采用Docker容器化技术,将应用及其所有依赖项打包成容器镜像,确保应用在任何环境下都能一致运行。

Dockerfile:使用Dockerfile定义容器镜像的构建过程,包括操作系统、运行时环境、依赖包等的配置。

自动化构建:Jenkins自动触发Docker镜像构建过程,每次代码提交后,自动创建新的容器镜像,并将其推送到镜像仓库。

自动化流程图下图所示。

总体流程

整个项目流程覆盖了从数据采集、存储、分析、展示到自动化部署和安全保障的各个方面,确保了系统的高效性、可扩展性和安全性。

总体流程如下图所示。

图表设计

系统从以下几个方面进行设计与实现:

  1. 电影更新频率分析

图表类型:折线图

用途:折线图适合展示随时间变化的电影更新频率,尤其是月度更新频率的变化趋势。通过折线图,平台可以清晰地看到电影更新的波动情况,并分析哪些时间段更新较为频繁。

  1. 电影产地热度分析

图表类型:地图

用途:地图适用于展示电影产地的热度分布。通过将不同产地的电影数量和观看量等指标映射到地图上,可以直观地看到各个地区的电影资源热度。

  1. 用户评论关键词提取分析

图表类型:词云图

用途:词云图通过可视化用户评论中的高频关键词,能够帮助发现用户的偏好和需求。关键词出现频率越高,字形越大,能够直观显示哪些主题在评论中讨论得最多。

  1. 导演热度分析

图表类型:柱状图

用途:柱状图适合展示不同导演的影片数量和受欢迎程度,能够帮助平台了解哪些导演的作品更受欢迎。

  1. 影片类型占比分析

图表类型:饼图

用途:饼图适合展示平台中各类型电影的资源占比,能够清晰地展示各类型电影在平台中的分布。

项目优势

本项目采用Python3.8编写,具备以下几个主要优势:

Flask Web可视化页面

本项目使用Flask框架开发的Web可视化页面,相较于传统的静态HTML页面,Flask提供了更强的动态交互能力和灵活性。Flask支持模板渲染、路由管理及RESTful接口,使得前后端分离和数据交互更加便捷高效。

Docker容器技术

使用Docker容器技术部署项目,避免了繁琐的环境配置操作,显著简化了项目迁移和部署的复杂度。Docker容器提供了一种轻量级的虚拟化方式,可以确保应用在不同环境中具有一致的运行效果。此外,容器与宿主机之间实现隔离,提升了服务器的安全性和稳定性,减少了环境配置对生产环境的影响。

MongoDB复制集机制

本项目使用了MongoDB的复制集机制,构建了MongoDB集群,支持读写分离和故障转移。主节点负责写入操作,而从节点用于读取,确保系统在高负载情况下的稳定性和响应速度。复制集机制不仅提升了系统的可用性,还增强了数据的安全性,通过数据备份机制防止数据丢失和服务器故障对业务的影响。

DevOps自动化流程

集成Jenkins与Gitea实现了DevOps流程,能够自动化管理代码的构建、测试和部署。结合Docker容器化技术,通过编写Jenkinsfile流水线脚本,将代码打包为Docker容器镜像,支持自动化部署。此流程确保了团队开发的高效协作,同时在多平台(如Kubernetes)上均可运行,大大提升了开发部署和版本更新的效率。

Linux服务器部署与Nginx反向代理

项目部署在Linux服务器上,采用Nginx进行反向代理Flask应用。Nginx不仅能够高效处理大量并发请求,还通过负载均衡和反向代理提高了系统的可扩展性。同时,Nginx还提供了额外的安全性保障,如SSL加密和请求过滤,确保应用的安全性和稳定运行。

工具版本

使用的工具与工具版本如下表x所示。

描述工具版本
解释器Python3.8
Python库Flask3.0.3
Python库jieba0.42.1
Python库pandas2.0.3
Python库pyecharts2.0.6
Python库beautifulsoup44.12.3
Python库pymongo4.10.1
Python库Requests2.32.3
容器运行时Docker-ce27.0.3
数据库 (主从架构)mongodb7.0.12
CI/CD平台jenkins2.462.3
代码仓库gitea22.3.1
操作系统Rocky Linux9.4
web服务器nginx1.25

系统实现

数据采集数据清洗实现

获取所有电影详情页url的关键代码

网站带有请求速度检测反爬,带上请求头,使用time.sleep(random.randint(1, 5)),随机模拟人类访问时间,防止网站拉黑IP。

通过url_get(self,begin_page=1,end_page=3)方法,保存所有的url数据到data_type列表中,返回给video_data_get()方法。

get_url()方法关键代码如下:

for i in range(begin_page, end_page):index = i  # 页面数url = self.headurl + f"/cupfoxshow/dianying--------{index}---.html"try:data = requests.get(url, headers=self.headers)soup = BeautifulSoup(data.text, 'html.parser')# 查找所有的 a 标签每页30个urlelements = soup.find_all('a')# 输出每个元素的 href 属性for element in elements:href = element.get('href')if href and '/cupfox/' in href: self.url_path.append(self.headurl + href) -print(f"page {i} url add to list succeed")time.sleep(random.randint(1, 5))except Exception as e:print("出现异常:", e)return self.url_path
电影信息数据清洗

requests爬取到网页信息后使用bs4库解析网页,提取需要的数据存入到字典中。

video_data_get()方法关键代码如下:

'''电影信息提取'''
element_info = soup.select('body > div.details > div.container.flex > div.mobile-main.mobile-main-type > div.movie.bj.br.card.border-shadow > div.cf.b-t')tree2 = element_info[0]movie_info['名称'] = tree2.find('h1').get_text()
movie_info['图片'] = tree2.find('img').get("src")
movie_info['别名'] = tree2.find('p', class_='cr3').get_text(strip=True).replace("别名:", '').split(",")
movie_info['标签'] = [a.get_text() for a intree2.select('.scroll-content')[0].find_all('a', target="_blank")]
movie_info['连载'] = tree2.find('p', class_='cr3').find_next('p').get_text(strip=True).replace("连载:", "")
movie_info['导演'] = [a.get_text() for a intree2.find('p', class_='cr3').find_next('p').find_next('p').find_all("a",target="_blank")]
movie_info['演员'] = [a.get_text() for a in tree2.find_all('p', class_='cr3 starLink')[0].find_all('a')]
movie_info['类型'] = [a.get_text() for a intree2.find('p', class_='cr3 starLink').find_next("p").find_all('a')]
movie_info['分类'] = tree2.find('p', class_='cr3 starLink').find_next("p").find_next("p").get_text(strip=True).replace("分类:", "")
movie_info['更新时间'] = tree2.find('p', class_='cr3 starLink').find_next("p").find_next("p").find_next("p").get_text(strip=True).replace("更新时间:", "")# 单独提取出影片描述
miaoshu = soup.select("body > div.details > div.container.flex > div.mobile-main.mobile-main-type > div.movie.bj.br.card.border-shadow > div.summary.detailsTxt")
b_cleaned = re.sub(r'\s+', ' ', miaoshu[0].get_text(strip=True))
movie_info['影片描述'] = b_cleaned.replace('展开', '')'''网友评论提取'''
element = soup.select('body > div.details > div.container.flex > div.mobile-main.mobile-main-type > div:nth-child(6) > ul')
tree1 = element[0]b_tags = tree1.find_all('b')
p_tags = tree1.find_all('p')

数据存储实现

编写sava_db()类实现数据存储模块,通过传入dict列表,一次性插入多条数据到mongodb中。

其中构造函数通过os库中的getenv方法获取系统中的环境变量修改默认值,能更好的在Linux(容器)中读取环境变量值,而不用修改对应代码来连接mongodb数据库,sava_db()关键代码如下:

class sava_db():def __init__(self):# 从环境变量中读取配置信息,若未设置则使用默认值self.username = os.getenv("MONGO_USERNAME", "root")  # 默认用户名为 rootself.password = os.getenv("MONGO_PASSWORD", "password123")  # 默认密码为 password123self.host = os.getenv("MONGO_HOST", "192.168.100.120")  # 默认主机为 192.168.100.120self.port = int(os.getenv("MONGO_PORT", 27017))  # 默认端口为 27017self.db = os.getenv("MONGO_DB", "cup_fox_movie")  # 默认数据库为 cup_fox_movieself.table = os.getenv("MONGO_TABLE", "movie_data")  # 默认表为 movie_datadef save_more_data(self, json_list):json_list_data = json_listmyclient = MongoClient(f'mongodb://{self.username}:{self.password}@{self.host}:{self.port}/')mydb = myclient[self.db]  # 选中或者创建库mycol = mydb[self.table]  # 选中或者创建表mydict = json_list_datacontroller_more = mycol.insert_many(mydict)  # 一次插入多条数据return controller_more

数据分析实现

影片地区与发布年份数据查询

从数据库中查询标签列的所有数据(其中标签列中的数据类型为list),其中包含所有影片地区与影片发布年份数据,可视化部分可以使用“年份”字段做条形图、使用“国家”字段做世界地图,本项目使用“国家”字段做世界地图,关键代码如下:

# 影片地区与发布年份数据
def get_movie_label():"""return: dict"""label_data_list_year = []label_data_list_guoji = []label_dict = {}label_name = collection.find({}, {'标签': 1, '_id': 0})for x in label_name:if len(x["标签"][0]) == 4:label_data_list_year.append(x["标签"][0])label_data_list_guoji.append(x["标签"][1])label_dict["年份"] = label_data_list_yearlabel_dict["国家"] = label_data_list_guojireturn label_dict
导演参影数据查询

从数据库中查询导演列,(其中导演列中的数据类型为list),一个影片可能包含多个导演,将所有导演存入一个列表,返回包含所有导演的列表,数据可视化部分统计导演参影的top10数据,生成柱状图,关键代码如下:

# 导演参影数据返回
def get_movie_daoyan():"""return: list"""daoyan_data_list = []daoyan_name = collection.find({}, {'导演': 1, '_id': 0})for x in daoyan_name:for y in x["导演"]:daoyan_data_list.append(y)return daoyan_data_list
影片类型数据查询

从数据库中查询类型列,(其中类型列中的数据类型为list),一个影片可能包含多种类型,将所有类型存入一个列表,返回包含所有类型的列表,数据可视化部分过滤掉占比非常少的类型,生成饼图可以直观的看到网站内电影类型占比,关键代码如下:

# 影片类型占比分布
def get_movie_type():"""return: list"""type_data_list = []type_name = collection.find({}, {'类型': 1, '_id': 0})for x in type_name:for y in x["类型"]:type_data_list.append(y)return type_data_list
用户评论数据查询

从数据库中查询所有列,获取“【星辰影院】网友评价”的所有数据,将所有评论存入一个字符串,返回包含所有评论的字符串数据,在数据可视化部分使用jieba库分词,提取评论中的关键字,生成词云图,关键代码如下:

# 网友评论 整体拼接成字符串
def get_movie_remark():"""return: string"""remarks = ""remark_name = collection.find({})for x in remark_name:remark_sources = [x.get("【星辰影院】网友评价", "")] #所有评论插入列表for remark in remark_sources:if remark:remarks += remarkreturn remarks
电影网站更新时间查询

从数据库中查询更新时间列,获取“更新时间”的所有数据,将所有数据以“-”分割获取月份数据,返回包含所有月份数据的字符串列表,在可视化部分生成折线图,关键代码如下:

# 电影网站更新时间分布
def get_movie_date():"""return: list"""data_list = []update_time = collection.find({}, {'更新时间': 1, '_id': 0})for i in update_time:data_list.append(i['更新时间'].split("-")[1])  # 获取月份数据return data_list

数据可视化实现

影片产地国家分布图

地图可视化数据获取,关键代码如下:

guojia = show_mongo_data.get_movie_label()["国家"]
city_data = [1] * len(show_mongo_data.get_movie_label()["国家"])

地图可视化效果,显示各国电影资源分布,如图所示。

导演参影Top10数量图

导演参影柱状图可视化数据获取,关键代码如下:

directors = show_mongo_data.get_movie_daoyan()
directors = [i for i in directors if len(i) > 0]
director_count = pd.Series(directors).value_counts().head(10)

导演参影柱状图效果,展示热门导演参影频率,如图所示。

影片类型占比饼图

影片类型饼图可视化数据获取,关键代码如下:

film_types = show_mongo_data.get_movie_type()
film_type_counts = pd.Series(film_types).value_counts().head(10)
data = [(index, count) for index, count in film_type_counts.items()]

影片类型占比饼图效果,反映网站内资源类型分布,如图所示。

用户评论关键词分析图

用户评论关键词词云图可视化数据获取,关键代码如下:

reviews = jieba.lcut(show_mongo_data.get_movie_remark())
word_counts = Counter(reviews)#进一步清洗jieba库提取的数据
word_data = [(word, count) for word, count in word_counts.items() iflen(word) > 1 and not re.match(r'^[a-zA-Z0-9]+$', word)]
word_data = [(word, count) for word, count in word_data if count > 5]
word_data = sorted(word_data, key=lambda x: x[1], reverse=True)[:500]

用户评论关键词词云图效果,生成词云图展示用户关注点,如图所示。

电影网站影片更新时间分布图

电影网站影片更新时间分布可视化数据获取,关键代码如下:

monther = dict(Counter(show_mongo_data.get_movie_date()))
dates = [f"2024-{item}" for item in monther.keys()]
yearly_counts = list(monther.values())

电影网站影片更新时间分布折线图效果,以折线图呈现更新规律,如图所示。

可视化大屏

自动化流程实现

使用git命令将代码推送到gitea代码仓库中,jenkins会读取gitea中的Jenkinsfile文件,并检查语法,通过后会自动运行stages中声明的shell脚本。

效果图

爬虫模块自动部署,效果图如图所示。

数据可视化模块自动部署,效果图如图所示。

Jenkinsfile流水线脚本代码

爬虫模块自动构建与部署,流水线脚本代码如下:

pipeline {agent anyenvironment {IMAGE_NAME = 'cupfox_project'IMAGE_VERSION='v5'CONTAINER_NAME='cupfox'MONGO_CONTAINER_NETWORK='mongodb_data_set_db_network'}stages {stage('Build') {steps {echo "构建爬虫模块镜像..."sh 'docker build -t $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION .'}}stage('Push Image') {steps {echo "推送爬虫模块容器镜像到注册中心..."sh 'docker images $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION'sh 'docker push $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION'}}stage('Deploy') {steps {echo "部署爬虫模块到服务器..."// 停止并删除已存在的容器sh '''docker ps -q -f name=$CONTAINER_NAME | xargs -r docker stopdocker ps -aq -f name=$CONTAINER_NAME | xargs -r docker rm'''// 启动新的容器sh 'docker run -id --network $MONGO_CONTAINER_NETWORK --name $CONTAINER_NAME  $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION'// 查看容器状态和日志sh 'docker ps -a'sh 'sleep 10'sh 'docker logs $CONTAINER_NAME'}}}
}

数据可视化模块,动态更新并快速发布,流水线脚本代码如下:

pipeline {agent anyenvironment {IMAGE_NAME = 'cupfox_project_visuali'IMAGE_VERSION='v5'CONTAINER_NAME='cupfox_visuali'MONGO_CONTAINER_NETWORK='mongodb_data_set_db_network'}stages {stage('Build') {steps {echo "构建数据可视化模块镜像..."sh 'docker build -t $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION .'}}stage('Push Image') {steps {echo "推送数据可视化模块容器镜像到注册中心......"sh 'docker images $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION'sh 'docker push $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION'}}stage('Deploy') {steps {echo "部署数据可视化模块到服务器..."// 停止并删除已存在的容器sh '''docker ps -q -f name=$CONTAINER_NAME | xargs -r docker stopdocker ps -aq -f name=$CONTAINER_NAME | xargs -r docker rm'''// 启动新的容器sh 'docker run -id  --network $MONGO_CONTAINER_NETWORK  --name $CONTAINER_NAME -p 38000:5000 $IMAGE_HUB/$IMAGE_NAME:$IMAGE_VERSION'// 查看容器状态和日志sh 'docker ps -a'sh 'sleep 10'sh 'docker logs $CONTAINER_NAME'}}}
}
Dockerfile编写

爬虫模块容器构建代码如下:

FROM python:3.8-slim-busterCOPY ./requirements.txt /data/RUN apt-get update && apt-get install -y  net-tools \&& pip install -r /data/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ \&& apt-get autoremove -y \&& rm -rf /var/lib/apt/lists/* /root/.cache/pipENV MONGO_USERNAME="root"
ENV MONGO_PASSWORD="password123"
ENV MONGO_HOST="172.25.0.2"
ENV MONGO_PORT=27017
ENV MONGO_DB="cup_fox_movie"
ENV MONGO_TABLE="movie_data"WORKDIR /dataCOPY . /data/ENTRYPOINT ["python", "-u", "/data/main.py"]

数据可视化模块容器构建代码如下:

FROM python:3.8-slim-busterCOPY ./requirements.txt /data/RUN apt-get update && apt-get install -y  net-tools \&& pip install -r /data/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ \&& apt-get autoremove -y \&& rm -rf /var/lib/apt/lists/* /root/.cache/pipENV MONGO_USERNAME="root"
ENV MONGO_PASSWORD="password123"
ENV MONGO_HOST="172.25.0.3"
ENV MONGO_PORT=27017
ENV MONGO_DB="cup_fox_movie"
ENV MONGO_TABLE="movie_data"WORKDIR /dataCOPY . /data/EXPOSE 5000ENTRYPOINT ["python", "-u", "/data/app.py"]

NginxWeb服务器配置

配置文件

nginx反向代理服务器38000端口,重定向到443https端口,flask_38000.conf具体配置代码如下:


server {listen 80;server_name flask.localserver.local;location / {return 301 https://$host$request_uri;  # 将 HTTP 请求重定向到 HTTPS}
}server {listen 443 ssl;server_name flask.localserver.local;ssl_certificate /etc/nginx/ssl/server.crt;  # 证书文件路径ssl_certificate_key /etc/nginx/ssl/server.key;  # 私钥文件路径ssl_session_cache shared:SSL:5m;ssl_session_timeout 5m;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';location / {proxy_pass http://127.0.0.1:38000; #反向代理到本地38000 Docker映射端口proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
数据可视化大屏

通过配置Nginx反向代理,将流量从HTTP重定向至HTTPS,提升安全性,修改本地hosts文件解析服务器IP到“flask.localserver.local”访问结果如图所示。

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

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

相关文章

gradle创建springboot单项目和多模块项目

文章目录 gradle创建springboot项目gradle多模块项目创建 gradle创建springboot项目 适用IDEA很简单,如下图 gradle多模块项目创建 首选创建父项目,然后删除无用内容至下图 选择父项目目录,右键选择模块,创建子项目&#xff08…

数据库的JOIN连接查询算法

文章目录 3.2 Join 算法优化3.1.2 Nested Loop Join(NLJ)3.1.3 Block Nested Loop Join(BNLJ)3.1.4 Index Nested Loop Join(INLJ)3.1.5 Sort Merge Join(SMJ)3.1.6 Hash Join 3.2 J…

Golang Gin系列-8:单元测试与调试技术

在本章中,我们将探讨如何为Gin应用程序编写单元测试,使用有效的调试技术,以及优化性能。这包括设置测试环境、为处理程序和中间件编写测试、使用日志记录、使用调试工具以及分析应用程序以提高性能。 为Gin应用程序编写单元测试 设置测试环境…

二叉树的最大深度(C语言详解版)

一、摘要 嗨喽呀大家,leetcode每日一题又和大家见面啦,今天要讲的是104.二叉树的最大深度,思路互相学习,有什么不足的地方欢迎指正!好啦让我们开始吧!!! 二、题目简介 给定一个二…

开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)

在 WSL 环境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网:https://nodejs.org/zh-cn/download 点击【下载】,选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…

HTB:Support[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ldapsearch…

洛谷P1017 [NOIP2000 提高组] 进制转换

题目链接:P1017 [NOIP2000 提高组] 进制转换 - 洛谷 | 计算机科学教育新生态 题目难度:普及一 题目分析:这是道数学题,我们都知道,首先按照10进制转成n进制的做法:对这个数不断除以n,将余数一一…

php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞 一、目的 本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。 二、in_array函数学习 in_array() 函数搜索数组中是否存在指定的值。 in_array($search,$array…

【2024年华为OD机试】(A卷,200分)- 查找树中元素 (JavaScriptJava PythonC/C++)

一、问题描述 题目解析 题目描述 题目要求根据输入的坐标 (x, y) 在树形结构中找到对应节点的内容值。其中: x 表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依此类推。y 表示节点在该层内的相对偏移,从左至右,第一个节点偏移为0,第二个节点偏移为1,…

WPS数据分析000006

一、排序 开始→ 排序 同文件→选项→自定义序列→输入序列 二、筛选 高级筛选 条件区域要与列表区域一样。 三、条件格式

基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

记录一个连不上docker中的mysql的问题

引言 使用的debian12,不同发行版可能有些许差异,连接使用的工具是navicat lite 本来是毫无思绪的,以前在云服务器上可能是防火墙的问题,但是这个桌面环境我压根没有使用防火墙。 直到 ying192:~$ mysql -h127.0.0.1 -uroot ERROR 1045 (28…

SpringBoot基础概念介绍-数据源与数据库连接池

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池,同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…

深度学习 Pytorch 单层神经网络

神经网络是模仿人类大脑结构所构建的算法,在人脑里,我们有轴突连接神经元,在算法中,我们用圆表示神经元,用线表示神经元之间的连接,数据从神经网络的左侧输入,让神经元处理之后,从右…

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

SpringBoot统一功能处理

一.拦截器 1.拦截器的简单介绍 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码. 2.使用 (i).定义拦截器: (ii).注册拦截器 (iii).拦截路径 (iv).实行流程 3.登录校验 4.DispatcherServlet源码&…

31、Java集合概述

目录 一.Collection 二.Map 三.Collection和Map的区别 四.应用场景 集合是一组对象的集合,它封装了对象的存储和操作方式。集合框架提供了一组接口和类,用于存储、访问和操作这些对象集合。这些接口和类定义了不同的数据结构,如列表、集合…

Unity|小游戏复刻|见缝插针1(C#)

准备 创建Scenes场景,Scripts脚本,Prefabs预制体文件夹 修改背景颜色 选中Main Camera 找到背景 选择颜色,一种白中透黄的颜色 创建小球 将文件夹里的Circle拖入层级里 选中Circle,位置为左右居中,偏上&…

Word 中实现方框内点击自动打 √ ☑

注: 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分,第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等,通常…

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目,通过解析源码了解真实应用场景,写文的视角和读者是同步的,想到看到写到,没有上帝视角。 前期回顾,本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…