【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镜像构建过程,每次代码提交后,自动创建新的容器镜像,并将其推送到镜像仓库。
自动化流程图下图所示。
总体流程
整个项目流程覆盖了从数据采集、存储、分析、展示到自动化部署和安全保障的各个方面,确保了系统的高效性、可扩展性和安全性。
总体流程如下图所示。
图表设计
系统从以下几个方面进行设计与实现:
- 电影更新频率分析
图表类型:折线图
用途:折线图适合展示随时间变化的电影更新频率,尤其是月度更新频率的变化趋势。通过折线图,平台可以清晰地看到电影更新的波动情况,并分析哪些时间段更新较为频繁。
- 电影产地热度分析
图表类型:地图
用途:地图适用于展示电影产地的热度分布。通过将不同产地的电影数量和观看量等指标映射到地图上,可以直观地看到各个地区的电影资源热度。
- 用户评论关键词提取分析
图表类型:词云图
用途:词云图通过可视化用户评论中的高频关键词,能够帮助发现用户的偏好和需求。关键词出现频率越高,字形越大,能够直观显示哪些主题在评论中讨论得最多。
- 导演热度分析
图表类型:柱状图
用途:柱状图适合展示不同导演的影片数量和受欢迎程度,能够帮助平台了解哪些导演的作品更受欢迎。
- 影片类型占比分析
图表类型:饼图
用途:饼图适合展示平台中各类型电影的资源占比,能够清晰地展示各类型电影在平台中的分布。
项目优势
本项目采用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所示。
描述 | 工具 | 版本 |
---|---|---|
解释器 | Python | 3.8 |
Python库 | Flask | 3.0.3 |
Python库 | jieba | 0.42.1 |
Python库 | pandas | 2.0.3 |
Python库 | pyecharts | 2.0.6 |
Python库 | beautifulsoup4 | 4.12.3 |
Python库 | pymongo | 4.10.1 |
Python库 | Requests | 2.32.3 |
容器运行时 | Docker-ce | 27.0.3 |
数据库 (主从架构) | mongodb | 7.0.12 |
CI/CD平台 | jenkins | 2.462.3 |
代码仓库 | gitea | 22.3.1 |
操作系统 | Rocky Linux | 9.4 |
web服务器 | nginx | 1.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”访问结果如图所示。
相关文章:
【Project】CupFox电影网站数据爬取分析与可视化
数据采集清洗与数据存储流程如下图所示。 数据分析与数据可视化流程设计如下 1.使用pymongo从数据库中查询所需的数据。对数据进行处理和分析,进行统计、分类、聚合等操作,提取关键指标和洞察。分析结果可以通过编写Python代码进一步优化、筛选和整理&a…...
Spring Boot 后端跨域解决方案:解锁前后端通信的障碍
随着前后端分离架构的普及,跨域资源共享(Cross-Origin Resource Sharing, CORS)问题成为了许多开发者必须面对的一个挑战。当Web浏览器尝试从一个源加载资源到另一个不同的源时,出于安全考虑,它会实施同源策略…...
Linux如何设置用户登录超时(/etc/profile)
Linux如何设置用户登录超时(/etc/profile) 1. 针对所有用户 # vi /etc/profile ... export TMOUT900 # 设置闲置时间为15分钟,单位为秒;如果没有此行则直接添加进去 ... vi /etc/profile TMOUT18000000000000 export QT_IM_MODULEfcitx readonly TMOUT expor…...
Elastic Cloud Serverless 获得主要合规认证
作者:来自 Elastic Oliver Mao 我们很高兴地宣布,Elastic Cloud Serverless 已获得多项重要的合规性认证。这一里程碑加强了我们对安全性、隐私性和法规遵从性的承诺。Elastic Cloud Serverless 现已通过以下行业领先框架的审核或认证:SOC 2 …...
渐变颜色怎么调?
渐变颜色的调整是设计中非常重要的一部分,尤其是在创建具有视觉吸引力和深度感的设计作品时。以下是一些在不同设计软件中调整渐变颜色的详细步骤和技巧: 一、Adobe Photoshop 1. 创建渐变 打开渐变工具: 选择工具栏中的“渐变工具”&#x…...
DDD该怎么去落地实现(1)关键是“关系”
DDD落地的关键是“关系” 这些年,我认为DDD走到了一个死胡同里了,因为落地实现过于困难。很多团队在经过一段时间的学习,清楚理解了DDD那些晦涩的概念,根据业务绘制出领域模型,这都不困难。但绘制领域模型不是我们最终…...
基于本地事务表+MQ实现分布式事务
基于本地事务表MQ实现分布式事务 引言1、原理2、本地消息表优缺点3、本地启动rocketmq4、代码实现及验证4.1、核心代码4.2、代码执行流程4.3、项目结构4.4、项目源码 引言 本地消息表的方案最初由ebay的工程师提出,核心思想是将分布式事务拆分成本地事务进行处理。…...
第17篇:python进阶:详解数据分析与处理
第17篇:数据分析与处理 内容简介 本篇文章将深入探讨数据分析与处理在Python中的应用。您将学习如何使用pandas库进行数据清洗与分析,掌握matplotlib和seaborn库进行数据可视化,以及处理大型数据集的技巧。通过丰富的代码示例和实战案例&am…...
S4 HANA Tax相关的定价过程
本文主要介绍在S4 HANA OP中Tax相关的定价过程相关设置。具体请参照如下内容: 目录 1. 定义定价过程(OBYZ) 2. 将定价过程分配给国家(OBBG)编辑编辑 3. 新增Transaction Key(OBCN) 1. 定义定价过程(OBYZ) 定价过程就是为了将“条件类型”和“事务”关联起来…...
Linux下php8安装phpredis扩展的方法
Linux下php8安装phpredis扩展的方法 下载redis扩展执行安装编辑php.ini文件重启php-fpmphpinfo 查看 下载redis扩展 前提是已经安装好redis服务了 php-redis下载地址 https://github.com/phpredis/phpredis 执行命令 git clone https://github.com/phpredis/phpredis.git执行…...
K8S 启动探测、就绪探测、存活探测
先来思考一个问题: 在 Deployment 执行滚动更新 web 应用的时候,总会出现一段时间,Pod 对外提供网络访问,但是页面访问却发生404,这个问题要如何解决呢?学完今天的内容,相信你会有自己的答案。 …...
rust学习-rust中的保留字
rust学习-rust中的保留字 已使用的保留字未来可能使用的保留字 保留字是语言中预定义的标识符,不能用作变量名、函数名或其他自定义标识符,Rust的保留字大致可以分为两类:已使用的保留字和未来可能使用的保留字 已使用的保留字 as࿱…...
-bash: ./uninstall.command: /bin/sh^M: 坏的解释器: 没有那个文件或目录
终端报错: -bash: ./uninstall.command: /bin/sh^M: 坏的解释器: 没有那个文件或目录原因:由于文件行尾符不匹配导致的。当脚本文件在Windows环境中创建或编辑后,行尾符为CRLF(即回车和换行,\r\n)…...
【C】memory 详解
<memory.h> 是一个 C 标准库头文件,提供了一组内存管理函数,用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块,是早期 C 编程中常用的内存操作工具。 尽管在现代 C 编程中更推荐使用<cstring>或<memory&…...
Android实训九 数据存储和访问
实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储, 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面,实现以下功能: 1ÿ…...
Redis vs. 其他数据库:深度解析,如何选择最适合的数据库?
一、如何为项目选择合适的数据库? 选择合适的数据库是一个复杂的过程,需要综合考虑多个因素。下面几个维度来详细阐述: 1.数据模型 关系型数据库(RDBMS):适用于高度结构化、关联性强的数据,如电…...
docker 安装 mysql 详解
在平常的开发工作中,我们经常需要用到 mysql 数据库。那么在docker容器中,应该怎么安装mysql数据库呢。简单来说,第一步:拉取镜像;第二步:创建挂载目录并设置 my.conf;第三步:启动容…...
C++实现设计模式---桥接模式 (Bridge)
桥接模式 (Bridge) 桥接模式 是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立变化。桥接模式的核心思想是使用组合(而非继承)来扩展功能。 意图 将抽象部分与实现部分分离,使它们都可以独立地变…...
LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统
单纯仅靠LLM会产生误导性的 “幻觉”,训练数据会过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。 正是在这样的背景下,检索增强生成技术(Retrieval-Augmented Generati…...
pycharm 运行远程环境问题 Error:Failed to prepare environment.
问题排查 拿到更详细的报错信息: Help > Diagnostic Tools > Debug Log Settings section: 添加下面的配置 com.intellij.execution.configurations.GeneralCommandLine 重显报错,我这里是再次运行代码打开 Help | Collect Logs and Diagnosti…...
Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250124
逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/1UWVY11Q1IOfME9itDN5aZA?pwdhgeg 提取码: hgeg Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交与逐笔委托的详细数据,这种以毫秒为单位的信息能揭示许多关键点,如庄家意图、误导性行为…...
最新最详细的配置Node.js环境教程
配置Node.js环境 一、前言 (一)为什么要配置Node.js?(二)NPM生态是什么(三)Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…...
【Address Overfitting】解决过拟合的三种方法
目录 1. 收集更多数据实践方法:适用场景:优缺点: 2. 特征选择方法介绍:实践示例:适用场景:优缺点: 3. 正则化(Regularization)正则化类型:实践示例࿱…...
【缘于J2ME】
我与 J2ME 的不解之缘 那年我 25 岁,如今已即将退休。 在那个娱乐生活并不丰富的年代,每每响起「小霸王其乐无穷啊」,小伙伴们就会摩拳擦掌、轮番上阵,而我却痴迷于 G-BASIC 编程。 最大的乐趣就是对着仅有的两页说明,…...
c#使用log4Net配置日志文件
1.# 写一个通用类 LogHelper using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net;namespace WindowsFormsApplication22 {public class LogHelper{static ILog mylog LogManager.GetLogge…...
[ACTF2020 新生赛]Include1
题目 点击tips后: 使用PHP伪协议直接读取flag /?filephp://filter/readconvert.base64-encode/resourceflag.php base64解码 拿下flag flag{6cce5a3d-997a-4c8a-ba07-f6652ee462a9}...
【数据结构】树的基本:结点、度、高度与计算
树是数据结构中一种重要的非线性结构,广泛应用于计算机科学的各个领域,例如文件系统、数据库索引、编译器等。理解树的各种性质,如结点数、度、高度等,对于解决实际问题至关重要。 本文将会探讨树的基本概念,以及给出几…...
1.24 共享内存和信号灯集
使用共享内存信号灯集实现两个进程之间相互对话。 程序代码: #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stst.h> #include <fcntl.h> #…...
正则表达式以及Qt中的使用
目录 一、正则表达式 1、基本匹配: 2、元字符: 2.1 .运算符: 2.2 字符集: 2.3 重复次数: 2.4 量词{} 2.5 特征标群() 2.6 或运算符 2.7 \反斜线转码特殊字符 2.8 锚点 3、简写字符 4、零宽度断言 4.1 正…...
STM32简介
STM32简介 STM32是ST公司基于ARMCortex-M内核开发的32位微控制器 (Microcontroller) MCU微控制器、MPU微处理器、CPU中央处理器 1.应用领域 STM32常应用于嵌入式领域。 如智能车:循迹小车 读取光电传感器或者摄像头的数据,…...
【设计模式-行为型】访问者模式
一、什么是访问者模式 说起来访问者模式,其实很少用。我一直在思考该用什么样的例子把这个设计模式表述清晰,最近突然想到一个例子也许他就是访问者。港片有过很辉煌的年代,小的时候一直在看港片觉得拍的非常好,而且演员的演技也在…...
上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天冲高回落,深成指、创业板指午后翻绿。大金融板块全天强势,天茂集团…...
docker部署jenkins
环境: centos7.9 jenkins/jenkins:lts-jdk11 1、拉去jenkins镜像,请指明版本号 [rootlocalhost ~]# docker pull jenkins/jenkins:lts 开始拉取 拉取完成 [rootlocalhost ~]# docker pull jenkins/jenkins:lts lts: Pulling from jenkins/jenkins 0a9…...
初阶数据结构:链表(二)
目录 一、前言 二、带头双向循环链表 1.带头双向循环链表的结构 (1)什么是带头? (2)什么是双向呢? (3)那什么是循环呢? 2.带头双向循环链表的实现 (1)节点结构 (2…...
Django实现数据库的表间三种关系
Django实现数据库的表间三种关系 1. 一对多(One-to-Many)关系示例:关系说明:查询示例: 2. 一对一(One-to-One)关系示例:关系说明:查询示例: 3. 多对多&#x…...
AI导航工具我开源了利用node爬取了几百条数据
序言 别因今天的懒惰,让明天的您后悔。输出文章的本意并不是为了得到赞美,而是为了让自己能够学会总结思考;当然,如果有幸能够给到你一点点灵感或者思考,那么我这篇文章的意义将无限放大。 背景 随着AI的发展市面上…...
概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础
对于连续型随机变量,分布函数(Cumulative Distribution Function, CDF)是概率密度函数(Probability Density Function, PDF)的变上限积分,概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…...
OpenHarmony OTA升级参考资料记录
OpenHarmony 作为一个开源分布式操作系统,通过其强大的 OTA(Over-The-Air)升级能力,为开发者和厂商提供了一套灵活而安全的系统升级方案。 OTA升级方式 根据升级包的应用方式,OpenHarmony 的 OTA 升级可以分为两种:本地升级和网络OTA升级。 本地升级 本地升级是将已制作…...
从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型
作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…...
网络知识小科普--5
81、什么是组播路由? 组播路由是一种有针对性的广播形式,将消息发送到所选择的用户组,而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…...
【JWT】jwt实现HS、RS、ES、ED签名与验签
JWT 实现 HS、RS、ES 和 ED 签名与验签 签名方式算法密钥类型签名要点验签要点HSHMAC-SHA256对称密钥- 使用 crypto/hmac 和对称密钥生成 HMAC 签名- 将 header.payload 作为数据输入- 使用同一密钥重新计算 HMAC 签名- 比较计算结果与接收到的签名是否一致RSRSA-SHA256公钥 …...
cherry USB 键盘分析
文章目录 cherry USB 键盘分析描述符结构设备描述符配置描述符集合配置描述符接口 1 描述符HID 描述符端点 IN 描述符接口 2 描述符HID 描述符端点 IN 描述符端点 OUT 描述符字符串描述符语言 ID (字符串索引为 0)厂商字符串(字符串索引为 1)产品字符串(字符串索引为 2)HID 报告…...
R语言学习笔记之高效数据操作
一、概要 数据操作是R语言的一大优势,用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作,包括排序、更新、分组汇总等。R数据操作包:data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具,可以实现快…...
高阶C语言|数组名的深度解析(数组名结合sizeof与strlen的详解)
💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴…...
Vue3 v-bind 和 v-model 对比
1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…...
科家多功能美发梳:科技赋能,重塑秀发新生
在繁忙的都市生活中,头皮健康与秀发养护成为了现代人不可忽视的日常课题。近日,科家电动按摩梳以其卓越的性能和创新设计,赢得了广大消费者的青睐。这款集科技与美学于一身的美发梳,不仅搭载了2亿负离子、6000次/分钟的声波振动等前沿技术,更融入了650nm聚能环红光与415nm强劲蓝…...
systemverilog中的force,release和assign
1 assign assign 语句用于为 wire 类型的信号提供连续赋值。它建立了一个驱动源,根据右侧表达式的值持续驱动 wire 信号。 module Example;wire a, b, c;assign c a & b; endmodule 2 force force 用于强制将一个信号的值设定为某个特定值,会覆盖…...
9【如何面对他人学习和生活中的刁难】
我们在学习的过程中,会遇到很多来自于他人的刁难与嘲讽,如果处理不好,这会大大影响我们的心情,从而影响学习的效率 我建议,如果你学习或生活中也遇到了类似的问题,不要去生气,更不要发生冲突&a…...
新项目传到git步骤
1.首先创建远程仓库,创建一个空白项目,即可生成一个克隆URL,可以是http也可以是SSH,copy下这个地址 2.找到项目的本机目录,进入根目录,打开git bash here命令行 3.初始化: git init 4.关联远程地址: git remote add origin "远程仓库的URL" 5.查看关联 git re…...
docker搭建redis集群(三主三从)
本篇文章不包含理论解释,直接开始集群(三主三从)搭建 环境 centos7 docker 26.1.4 redis latest (7.4.2) 服务器搭建以及环境配置 请查看本系列前几篇博客 默认已搭建好三个虚拟机并安装配置好docker 相关博客…...