【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目
项目介绍
【开源】项目基于python+pandas+flask+mysql等技术实现豆瓣电影数据获取及可视化分析展示,觉得有用的朋友可以来个一键三连,感谢!!!
项目演示
【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目
项目截图
- 首页

- 列表页

- 爬虫演示

项目地址
https://github.com/mudfish/python-douban-view
项目结构

核心模块
电影爬虫
"""
异步并发爬虫
"""# 本次运行获取的最大页数
MAX_PAGES = 5
# 进度控制文件
PAGE_PROGRESS_FILE = "page_progress.json"
# 电影类型
MOVIE_TYPES = ["剧情", "喜剧", "动作", "爱情", "科幻", "动画"]
# CSV文件名
CSV_NAME = "movie_data.csv"
# CSV头
CSV_HEADS = ["id","movie_id","title","year","directors","casts","rating","cover","country","summary","types","lang","release_date","time","url",
]
# 上映日期匹配正则,剔除非数字和-
RELEASE_DATE_REMOVE_RE = r"[^0-9-]"engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/db_douban")def get_id():return str(random.randint(1, 100000000)) + str(time.time()).split(".")[1].strip()class Spider:def __init__(self):self.movie_page_url = "https://m.douban.com/rexxar/api/v2/movie/recommend?"self.movie_detail_url = "https://movie.douban.com/subject/{}/"self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36","Referer": "https://movie.douban.com/explore",}self.movie_types = MOVIE_TYPESself.page_progress = {}# 需要抓取的页面数self.total_pages = 0self.completed_pages = 0self.global_progress_bar = Nonedef init(self):# 每次跑之前,先删除之前的csv文件if os.path.exists(CSV_NAME):os.remove(CSV_NAME)with open(CSV_NAME, "w", newline="", encoding="utf-8") as writer_f:writer = csv.writer(writer_f)writer.writerow(CSV_HEADS)def load_page_progress(self):if os.path.exists(PAGE_PROGRESS_FILE):with open(PAGE_PROGRESS_FILE, "r", encoding="utf-8") as f:# 判断文件内容是否为空if os.stat(PAGE_PROGRESS_FILE).st_size == 0:# 初始化页面进度print("初始化页面进度")self.page_progress = {}self.save_page_progress()else:self.page_progress = json.load(f)def save_page_progress(self):with open(PAGE_PROGRESS_FILE, "w", encoding="utf-8") as f:json.dump(self.page_progress, f, ensure_ascii=False)async def get_movie_pages(self, session, type_name):start_page = self.page_progress.get(type_name, 1)if start_page <= MAX_PAGES:for page in range(start_page, MAX_PAGES + 1):# print(f'{type_name}第{page}页:')start_time = time.time()params = {"start": (page - 1) * 20, "count": 10, "tags": type_name}try:async with session.get(self.movie_page_url, headers=self.headers, params=params) as resp:resp.raise_for_status()respJson = await resp.json()movie_list = respJson["items"]for i, m in enumerate(movie_list):if m["type"] == "movie":await self.process_movie(session, m)# progress_bar.update(round(1/len(movie_list)))self.page_progress[type_name] = page + 1# 记录进度self.save_page_progress()# 刷新全局进度self.update_global_progress()except Exception as e:print(f"处理:{type_name}第{page}页失败: {e}")traceback.print_exc()continueasync def process_movie(self, session, movie):movie_data = []movie_data.append(get_id())movie_data.append(movie["id"])movie_data.append(movie["title"])movie_data.append(movie["year"])async with session.get(self.movie_detail_url.format(movie["id"]), headers=self.headers) as resp:resp.raise_for_status()html_text = await resp.text()path = etree.HTML(html_text)# 导演movie_data.append(",".join(path.xpath('//a[@rel="v:directedBy"]/text()')))# 主演movie_data.append(",".join(path.xpath('//a[@rel="v:starring"]/text()')))# 评分movie_data.append(path.xpath('//strong[@property="v:average"]/text()')[0])# 封面movie_data.append(path.xpath('//img[@rel="v:image"]/@src')[0])# 国家movie_data.append(path.xpath('//span[contains(text(),"制片国家")]/following-sibling::br[1]/preceding-sibling::text()[1]')[0].replace(" / ", ","))# 摘要movie_data.append(path.xpath('//span[@property="v:summary"]/text()')[0].strip())# 类型movie_data.append(",".join(path.xpath('//div[@id="info"]/span[@property="v:genre"]/text()')))# 语言movie_data.append(path.xpath('//span[contains(text(),"语言")]/following-sibling::br[1]/preceding-sibling::text()[1]')[0])# 上映日期movie_data.append(re.sub(RELEASE_DATE_REMOVE_RE,"",path.xpath('//span[@property="v:initialReleaseDate"]/text()')[0][:10],))# 时长(空处理)# print(movie["id"])movie_time = path.xpath('//span[@property="v:runtime"]/text()')if len(movie_time) > 0:movie_data.append(movie_time[0])else:movie_data.append("")# urlmovie_data.append(self.movie_detail_url.format(movie["id"]))self.save_to_csv(movie_data)def save_to_csv(self, row):with open(CSV_NAME, "a", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(row)def clean_csv(self):print("===========清理数据============")df = pd.read_csv(CSV_NAME, encoding="utf-8")df.drop_duplicates(subset=["movie_id"], keep="first", inplace=True)print("存储到数据库...")df.to_sql("tb_movie", con=engine, index=False, if_exists="append")print("清理重复数据...")engine.connect().execute(text("delete t1 from tb_movie t1 inner join (select min(id) as id,movie_id from tb_movie group by movie_id having count(*) > 1) t2 on t1.movie_id=t2.movie_id where t1.id>t2.id"))def update_global_progress(self):self.completed_pages += 1# print(self.completed_pages)self.global_progress_bar.update(1)self.global_progress_bar.refresh()async def run(self):self.init()self.load_page_progress()# self.total_pages = MAX_PAGES*len(MOVIE_TYPES) - sum(self.page_progress.get(type_name, 1) for type_name in MOVIE_TYPES)for type_name in MOVIE_TYPES:if MAX_PAGES > self.page_progress.get(type_name, 1):self.total_pages += MAX_PAGES + 1 - self.page_progress.get(type_name, 1)print(self.total_pages)if self.total_pages > 0:self.global_progress_bar = tqdm(total=self.total_pages, desc="progress", unit="page", colour="GREEN")async with aiohttp.ClientSession() as session:tasks = [self.get_movie_pages(session, type_name)for type_name in self.movie_types]await asyncio.gather(*tasks)# 请求结束后,清空页面进度# self.page_progress = {}# self.save_page_progress()self.global_progress_bar.close()self.clean_csv()if __name__ == "__main__":loop = asyncio.get_event_loop()spider = Spider()loop.run_until_complete(spider.run())
电影可视化
接口代码
from flask import Flask, render_template, request, redirect, url_for, session
from utils import db_queryapp = Flask(__name__)
app.secret_key = "mysessionkey"# 统一请求拦截
@app.before_request
def before_request():# 利用正则匹配,如果/static开头和/login, /logout,/register的请求,则不拦截;其他的判断是否已登录if (request.path.startswith("/static")or request.path == "/login"or request.path == "/logout"or request.path == "/register"):return# 如果没有登录,则跳转到登录页面if not session.get("login_username"):return redirect(url_for("login"))# 首页
@app.route("/")
def index():# 获取电影统计数据movie_stats = db_query.fetch_movie_statistics()# 获取电影分类统计movie_type_distribution = db_query.fetch_movie_type_distribution()# 获取电影评分统计movie_rating_distribution = db_query.fetch_movie_rating_distribution()print(movie_rating_distribution)return render_template("index.html",login_username=session.get("login_username"),movie_stats=movie_stats,movie_type_distribution=movie_type_distribution,movie_rating_distribution=movie_rating_distribution,)# 登录
@app.route("/login", methods=["GET", "POST"])
def login():if request.method == "POST":req_params = dict(request.form)# 判断用户名密码是否正确sql = "SELECT * FROM `tb_user` WHERE `username` = %s AND `password` = %s"params = (req_params["username"], req_params["password"])if len(db_query.query(sql, params)) > 0:# 存储sessionsession["login_username"] = req_params["username"]return redirect(url_for("index"))else:return render_template("error.html",error="用户名或密码错误",)elif request.method == "GET":return render_template("login.html")# 退出
@app.route("/logout")
def logout():session.pop("login_username", None)return redirect(url_for("index"))# 注册
@app.route("/register", methods=["GET", "POST"])
def register():if request.method == "POST":req_params = dict(request.form)if req_params["password"] == req_params["password_confirm"]:# 判断是否已存在该用户名sql = "SELECT * FROM `tb_user` WHERE `username` = %s"params = (req_params["username"],)result = db_query.query(sql, params)if len(result) > 0:return render_template("error.html",error="用户名已存在",)sql = "INSERT INTO `tb_user` (`username`, `password`) VALUES (%s, %s)"params = (req_params["username"],req_params["password"],)db_query.query(sql, params, db_query.QueryType.NO_SELECT)return redirect(url_for("login"))else:return render_template("error.html",error="两次密码输入不一致",)elif request.method == "GET":return render_template("register.html")@app.route("/list")
def movie_list():# 查询数据库获取电影列表movies = db_query.fetch_movie_list() # 假设此函数返回一个包含电影信息的列表# 渲染并返回list.html,同时传递movies数据return render_template("list.html", login_username=session.get("login_username"), movies=movies)@app.errorhandler(404)
def page_not_found(error):return render_template("404.html"), 404@app.errorhandler(500)
def system_error(error):return render_template("500.html"), 500if __name__ == "__main__":# 静态文件缓存自动刷新app.jinja_env.auto_reload = Trueapp.run(host="127.0.0.1", port=8002, debug=True)
首页
<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><metaname="viewport"content="width=device-width, initial-scale=1, shrink-to-fit=no"/><meta name="description" content="" /><meta name="author" content="" /><title>首页</title><!-- Custom fonts for this template--><linkhref="/static/vendor/fontawesome-free/css/all.min.css"rel="stylesheet"type="text/css"/><linkhref="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"rel="stylesheet"/><!-- Custom styles for this template--><link href="/static/css/sb-admin-2.min.css" rel="stylesheet" /></head><body id="page-top"><!-- Page Wrapper --><div id="wrapper"><!-- Sidebar --><ulclass="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion"id="accordionSidebar"><!-- Sidebar - Brand --><aclass="sidebar-brand d-flex align-items-center justify-content-center"href="index.html"><div class="sidebar-brand-icon rotate-n-15"><i class="fas fa-laugh-wink"></i></div><div class="sidebar-brand-text mx-3">豆瓣电影可视化</div></a><!-- Divider --><hr class="sidebar-divider my-0" /><!-- Nav Item - Dashboard --><li class="nav-item active"><a class="nav-link" href="/"><i class="fas fa-fw fa-tachometer-alt"></i><span>首页</span></a></li><!-- 列表 --><li class="nav-item"><a class="nav-link" href="/list"><i class="fas fa-fw fa-table"></i><span>电影列表</span></a></li><!-- Divider --><hr class="sidebar-divider d-none d-md-block" /><!-- Sidebar Toggler (Sidebar) --><div class="text-center d-none d-md-inline"><button class="rounded-circle border-0" id="sidebarToggle"></button></div></ul><!-- End of Sidebar --><!-- Content Wrapper --><div id="content-wrapper" class="d-flex flex-column"><!-- Main Content --><div id="content"><!-- Topbar --><navclass="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow"><!-- Sidebar Toggle (Topbar) --><buttonid="sidebarToggleTop"class="btn btn-link d-md-none rounded-circle mr-3"><i class="fa fa-bars"></i></button><!-- Topbar Search --><!-- <form class="d-none d-sm-inline-block form-inline mr-auto ml-md-3 my-2 my-md-0 mw-100 navbar-search"><div class="input-group"><input type="text" class="form-control bg-light border-0 small" placeholder="Search for..." aria-label="Search" aria-describedby="basic-addon2"><div class="input-group-append"><button class="btn btn-primary" type="button"><i class="fas fa-search fa-sm"></i></button></div></div></form> --><!-- Topbar Navbar --><ul class="navbar-nav ml-auto"><div class="topbar-divider d-none d-sm-block"></div><!-- Nav Item - User Information --><li class="nav-item dropdown no-arrow"><aclass="nav-link dropdown-toggle"href="#"id="userDropdown"role="button"data-toggle="dropdown"aria-haspopup="true"aria-expanded="false"><span class="mr-2 d-none d-lg-inline text-gray-600 small">{{login_username}}</span><imgclass="img-profile rounded-circle"src="/static/img/avatar.png"/></a><!-- Dropdown - User Information --><divclass="dropdown-menu dropdown-menu-right shadow animated--grow-in"aria-labelledby="userDropdown"><aclass="dropdown-item"href="#"data-toggle="modal"data-target="#logoutModal"><iclass="fas fa-sign-out-alt fa-sm fa-fw mr-2 text-gray-400"></i>Logout</a></div></li></ul></nav><!-- End of Topbar --><!-- Begin Page Content --><div class="container-fluid"><!-- Page Heading --><!-- <div class="d-sm-flex align-items-center justify-content-between mb-4"><h1 class="h3 mb-0 text-gray-800">Dashboard</h1><a href="#" class="d-none d-sm-inline-block btn btn-sm btn-primary shadow-sm"><i class="fas fa-download fa-sm text-white-50"></i> Generate Report</a></div> --><!-- Content Row --><div class="row"><!-- Earnings (Monthly) Card Example --><div class="col-xl-3 col-md-6 mb-4"><div class="card border-left-primary shadow h-100 py-2"><div class="card-body"><div class="row no-gutters align-items-center"><div class="col mr-2"><divclass="font-weight-bold text-primary text-uppercase mb-1">电影总数</div><div class="h5 mb-0 font-weight-bold text-gray-800">{{ movie_stats['total_movies'] }}</div></div><div class="col-auto"><i class="fas fa-calendar fa-2x text-gray-300"></i></div></div></div></div></div><!-- Earnings (Monthly) Card Example --><div class="col-xl-3 col-md-6 mb-4"><div class="card border-left-success shadow h-100 py-2"><div class="card-body"><div class="row no-gutters align-items-center"><div class="col mr-2"><divclass="font-weight-bold text-success text-uppercase mb-1">电影最高评分</div><div class="h5 mb-0 font-weight-bold text-gray-800">{{ movie_stats['highest_rating'] }}</div></div><div class="col-auto"><i class="fas fa-dollar-sign fa-2x text-gray-300"></i></div></div></div></div></div><!-- Earnings (Monthly) Card Example --><div class="col-xl-3 col-md-6 mb-4"><div class="card border-left-info shadow h-100 py-2"><div class="card-body"><div class="row no-gutters align-items-center"><div class="col mr-2"><divclass="font-weight-bold text-info text-uppercase mb-1">出演最多演员</div><div class="row no-gutters align-items-center"><div class="col-auto"><divclass="h5 mb-0 mr-3 font-weight-bold text-gray-800">{{ movie_stats['most_popular_cast'] }}</div></div><div class="col"><div class="progress progress-sm mr-2"><divclass="progress-bar bg-info"role="progressbar"style="width: 50%"aria-valuenow="50"aria-valuemin="0"aria-valuemax="100"></div></div></div></div></div><div class="col-auto"><iclass="fas fa-clipboard-list fa-2x text-gray-300"></i></div></div></div></div></div><!-- Pending Requests Card Example --><div class="col-xl-3 col-md-6 mb-4"><div class="card border-left-warning shadow h-100 py-2"><div class="card-body"><div class="row no-gutters align-items-center"><div class="col mr-2"><divclass="font-weight-bold text-warning text-uppercase mb-1">制片最多国家</div><div class="h5 mb-0 font-weight-bold text-gray-800">{{ movie_stats['most_common_country'] }}</div></div><div class="col-auto"><i class="fas fa-comments fa-2x text-gray-300"></i></div></div></div></div></div></div><!-- Content Row --><div class="row"><!-- Area Chart --><div class="col-xl-6 col-lg-6"><div class="card shadow mb-4"><!-- Card Header - Dropdown --><divclass="card-header py-3 d-flex flex-row align-items-center justify-content-between"><h6 class="m-0 font-weight-bold text-primary">电影分类统计</h6></div><!-- Card Body --><div class="card-body"><divid="movie_type_chart"style="width: 100%; height: 450px"></div><!-- <div class="chart-area"></div> --></div></div></div><!-- Line Chart --><div class="col-xl-6 col-lg-6"><div class="card shadow mb-4"><!-- Card Header - Dropdown --><divclass="card-header py-3 d-flex flex-row align-items-center justify-content-between"><h6 class="m-0 font-weight-bold text-primary">电影评分统计</h6><div class="dropdown no-arrow"><aclass="dropdown-toggle"href="#"role="button"id="dropdownMenuLink"data-toggle="dropdown"aria-haspopup="true"aria-expanded="false"><iclass="fas fa-ellipsis-v fa-sm fa-fw text-gray-400"></i></a><divclass="dropdown-menu dropdown-menu-right shadow animated--fade-in"aria-labelledby="dropdownMenuLink"><div class="dropdown-header">Dropdown Header:</div><a class="dropdown-item" href="#">Action</a><a class="dropdown-item" href="#">Another action</a><div class="dropdown-divider"></div><a class="dropdown-item" href="#">Something else here</a></div></div></div><!-- Card Body --><div class="card-body"><divid="movie_score_chart"style="width: 100%; height: 450px"></div></div></div></div></div><!-- Content Row --></div><!-- /.container-fluid --></div><!-- End of Main Content --><!-- Footer --><footer class="sticky-footer bg-white"><div class="container my-auto"><div class="copyright text-center my-auto"><span>@Laoxu Open Source.<atarget="_blank"href="https://github.com/mudfish">Github</a></span></div></div></footer><!-- End of Footer --></div><!-- End of Content Wrapper --></div><!-- End of Page Wrapper --><!-- Scroll to Top Button--><a class="scroll-to-top rounded" href="#page-top"><i class="fas fa-angle-up"></i></a><!-- Logout Modal--><divclass="modal fade"id="logoutModal"tabindex="-1"role="dialog"aria-labelledby="exampleModalLabel"aria-hidden="true"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><h5 class="modal-title" id="exampleModalLabel">Ready to Leave?</h5><buttonclass="close"type="button"data-dismiss="modal"aria-label="Close"><span aria-hidden="true">×</span></button></div><!-- <div class="modal-body">Select "Logout" below if you are ready to end your current session.</div> --><div class="modal-footer"><buttonclass="btn btn-secondary"type="button"data-dismiss="modal">Cancel</button><a class="btn btn-primary" href="/logout">Logout</a></div></div></div></div><!-- Bootstrap core JavaScript--><script src="/static/vendor/jquery/jquery.min.js"></script><script src="/static/vendor/bootstrap/js/bootstrap.bundle.min.js"></script><!-- Core plugin JavaScript--><script src="/static/vendor/jquery-easing/jquery.easing.min.js"></script><!-- Custom scripts for all pages--><script src="/static/js/sb-admin-2.min.js"></script><!-- Page level plugins --><script src="/static/vendor/chart.js/Chart.min.js"></script><!-- Page level custom scripts --><script src="/static/js/demo/chart-area-demo.js"></script><script src="/static/js/demo/chart-pie-demo.js"></script><script src="/static/js/echarts.min.js"></script><script>var chartDom = document.getElementById("movie_type_chart");var myChart = echarts.init(chartDom);var option;var movieTypeData = {{ movie_type_distribution|tojson }};// console.log(movieTypeData)option = {title: {text: "",subtext: "来源:豆瓣数据",left: "center",},tooltip: {trigger: "item",},legend: {orient: "vertical",left: "left",},series: [{name: "Access From",type: "pie",radius: "50%",data: movieTypeData,emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: "rgba(0, 0, 0, 0.5)",},},},],};option && myChart.setOption(option);</script><script>var chartDom = document.getElementById("movie_score_chart");var myChart = echarts.init(chartDom);var option;var ratingData = {{ movie_rating_distribution|tojson }};console.log(ratingData)option = {title: {text: "",subtext: "来源:豆瓣数据",left: "center",},xAxis: {type: "category",boundaryGap: false,data: ratingData.map(item => item[0]),},yAxis: {type: "value",},series: [{data: ratingData.map(item => item[1]),type: "line",areaStyle: {},},],tooltip: {trigger: 'axis', //坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用axisPointer: {// 坐标轴指示器,坐标轴触发有效type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'}},};option && myChart.setOption(option);</script></body>
</html>
相关文章:
【开源】2024最新python豆瓣电影数据爬虫+可视化分析项目
项目介绍 【开源】项目基于pythonpandasflaskmysql等技术实现豆瓣电影数据获取及可视化分析展示,觉得有用的朋友可以来个一键三连,感谢!!! 项目演示 【开源】2024最新python豆瓣电影数据爬虫可视化分析项目 项目截图…...
[JDK工具-5] jinfo jvm配置信息工具
文章目录 1. 介绍2. 打印所有的jvm标志信息 jinfo -flags pid3. 打印指定的jvm参数信息 jinfo -flag InitialHeapSize pid4. 启用或者禁用指定的jvm参数 jinfo -flags [|-]HeapDumpOnOutOfMemoryError pid5. 打印系统参数信息 jinfo -sysprops pid6. 打印以上所有配置信息 jinf…...
【Linux系统编程】进程概念、进程排队、进程标识符、进程状态
目录 什么是进程? 浅谈进程排队 简述进程属性 进程属性之进程标识符 进程操作之进程创建 初识fork fork返回值 原理角度理解fork fork的应用 进程属性之进程状态 再谈进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux下的进程状态 “R”(运行状…...
Java与GO语言对比分析
你是不是总听到go与java种种对比,其中在高并发的服务器端应用场景会有人推荐你使用go而不是 java。 那我们就从两者运行原理和基本并发设计来对比分析,看看到底怎么回事。 运行原理对比 java java 中 jdk 已经帮我们屏蔽操作系统区别。 只要我们下载并…...
Linux文件系统原理
Linux文件系统 冯诺依曼在1945年提出计算机的五大组成部分 运算器:CPU 控制器:CPU 存储器:内存和硬盘 输入设备:鼠标、硬盘 输出设备:显示器一、硬盘结构 机械硬盘结构 扇区:硬盘的最小存储单位ÿ…...
初识Spring Cache:如何简化你的缓存处理?
文章目录 1、Spring Cache介绍2、 常用注解3、 使用案例 1、Spring Cache介绍 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。 Spring Cache 提供了一层抽象,底层可以切换不同的…...
攻防世界[GoodRe]
攻防世界[GoodRe] 学到知识: 逆向的精髓:三分懂,七分蒙。TEA 算法快速识别(蒙): 数据处理的形式:进入加密时的数据和加密结束后的数据,处理时数据的分组等等,都能用来…...
IntelliJ IDEA实用插件:轻松生成时序图和类图
IntelliJ IDEA生成时序图、类图 一、SequenceDiagram1.1 插件安装1.2 插件设置1.3 生成时序图 二、PlantUML Integration2.1 插件安装2.2 插件设置2.3 生成类图 在软件建模课程的学习中,大家学习过多种图形表示方法,这些图形主要用于软件产品设计。在传统…...
SpringBoot + Mybatis-Plus中乐观锁实现
悲观锁 悲观锁是一种悲观思想,它认为数据很可能会被别人所修改 所以总会对数据进行上锁,读操作和写操作都会上锁,性能较低,使用较少! 乐观锁 乐观锁是一种乐观思想,它认为数据并不一定会被别人所修改 所以…...
设计模式深度解析:分布式与中心化,IT界两大巨头“华山论剑”
🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨IT界的两大巨头交锋✨ 👋 在IT界的广阔天地中,有两座…...
转行一年了
关注、星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 来公司一年了。 说是转行其实还是在半导体行业,熟悉我的朋友知道 ,我在18年开始进入半导体行业,那个时候想着行业很重要,站对了…...
【LeetCode 151】反转字符串中的单词
1. 题目 2. 分析 这题要是用Python写,就非常简单了。 3. 代码 class Solution:def reverseWords(self, s: str) -> str:s " ".join(reversed(s.strip().split()))return s...
Behind the Code:Polkadot 如何重塑 Web3 未来
2024 年 5 月 17 日 Polkadot 生态 Behind the Code 第二季第一集 《创造 Web3 的未来》正式上线。第一集深入探讨了 Polkadot 和 Web3 技术在解决数字身份、数据所有权和去中心化治理方面的巨大潜力。 🔍 查看完整视频: https://youtu.be/_gP-M5nUidc?…...
for循环里如果std::pair的类型写不对,可能会造成性能损失
第一版 std::map<int, int> t;t.emplace(1, 1);for (const std::pair<int,int>& data : t){int i 0;std::ignore i;}中间留一些空格,是因为ms在调试的时候,尤其是模板比较多的时候,经常断点的行号有问题。比如第5行的断点&…...
【Linux】Linux的基本指令_2
文章目录 二、基本指令8. man9. nano 和 cat10. cp11. mv12. echo 和 > 和 >> 和 <13. more 和 less14. head 和 tail 和 | 未完待续 二、基本指令 8. man Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问…...
Effective C++(3)
3.资源管理 条款13:以对象管理资源 以对象管理资源对于传统的堆资源管理,我们需要使用成对的new和delete,这样若忘记delete就会造成内存泄露。因此,我们应尽可能以对象管理资源,并采用RAII(Resource Acqu…...
自定义RedisTemplate序列化器
大纲 RedisSerializerFastJsonRedisSerializer自定义二进制序列化器总结代码 在《RedisTemplate保存二进制数据的方法》一文中,我们将Java对象通过《使用java.io库序列化Java对象》中介绍的方法转换为二进制数组,然后保存到Redis中。实际可以通过定制Red…...
Flutter 中的 CupertinoContextMenuAction 小部件:全面指南
Flutter 中的 CupertinoContextMenuAction 小部件:全面指南 在 Flutter 中,CupertinoContextMenuAction 是一个专门用于构建 iOS 风格的上下文菜单选项的组件。它为用户提供了一种便捷的方式来执行与特定项目相关的操作,例如在列表项上长按可…...
Element-Ul快速入门
引言 Element UI是一个vue.js的桌面UI库。它提供了一套丰富、灵活和实用的UI组件,使开发者能以最少的时间和代码量完成复杂的界面设计。本文将会介明如何快速上手Element UI。 安装和基本使用 首先,你需要在你的项目中安装Element UI。如果你已经安装…...
Django的模型层——2模型实例
1. 类的属性 objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器 支持明确指定模型类的管理器 class BookInfo(models.Model):...books models.Manager()当为…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
