爬虫框架与库
爬虫框架与库是用于网络数据抓取的核心工具,帮助开发者高效地从网页中提取结构化数据。
Requests:用于发送HTTP请求。
BeautifulSoup:用于解析HTML和XML。
Scrapy:强大的爬虫框架,适合大规模爬取。
Selenium:用于处理JavaScript渲染的页面。
PyQuery:类似jQuery的HTML解析库。
一、常用爬虫库(灵活轻量)
1、Requests
特点:HTTP请求库,用于发送GET/POST请求,处理Cookies和Session。
使用场景:简单网页抓取,配合解析库(如BeautifulSoup)使用。
例如:
import requestsresponse = requests.get("https://emp.com")
2、BeautifulSoup
特点:HTML/XML解析库,支持多种解析器(如lxml、html.parser)。
使用场景:静态页面解析,提取标签内容。
例如:
from bs4 import BeautifulSoupsoup = BeautifulSoup(html_content,"lxml")title = soup.find("h1").text
3、lxml
特点:高性能XML/HTML解析库,支持XPath。
使用场景:需要快速处理大规模结构化数据。
4、Selenium
特点:自动化浏览器工具,可模拟用户操作(点击,滚动等)。
使用场景:动态渲染页面(如JavaScript加载的内容)。
缺点:资源消耗大,速度较慢。
5、Pyppeteer
特点:基于Chromium的无头浏览器,类似Puppeteer(Node.js)。
使用场景:处理复杂动态页面,支持异步操作。
二、常用爬虫框架(结构化,可扩展)
1、Scrapy
特点:
- 完整的爬虫框架,内置请求调度,数值管道,中间件等功能。
- 支持异步处理,适合大规模抓取。
使用场景:复杂项目(如电商商品爬虫,新闻聚合)。
核心组件:
- Spiders(定义抓取逻辑)
- Items(结构化数据容器)
- Pipelines(数据清洗、存储)
- Middlewares(扩展请求/响应处理)
2、PySpider
特点:
- 分布式架构,支持web界面管理任务。
- 实时监控爬虫状态。
使用场景:需要分布式协作或可视化的项目。
3、Playwright
特点:
- 支持多浏览器(Chromium、Firefox、WebKit)自动化。
- 可处理动态内容,生成截图或PDF。
使用场景:复杂交互页面(如登录验证)。
三、反爬虫应对工具
1、代理IP池
工具:requests-html,scrapy-rotating-proxies
用途:防止IP被封禁。
2、随机User-Agent
库:fake-useragent
用途:模拟不同浏览器/设备。
3、验证码识别
工具:Tesseract OCR(图像识别)、第三方 API(如打码平台)。
4、请求频率控制
方法:设置延迟(time.sleep)或使用Scrapy的DOWNLOAD_DELAY。
四、数据处理与存储
1、数据清洗
工具:Pandas(结构化数据)、正则表达式(re模块)。
2、存储方案
数据库:MySQL、MongoDB、Redis。
文件:CSV、JSON、Excel。
云服务:AWS S3、Google Cloud Storage。
五、选择依据
简单任务:Requests + BeautifulSoup/lxml。
动态页面:Selenium/Playwright/Pyppeteer。
大型项目:Scrapy(扩展性强)、PySpider(分布式)。
反爬严格:结合代理、User-Agent轮换、请求频率控制。
六、注意事项
1、合法性:遵守目标网站的 `robots.txt`,避免侵犯隐私或版权。
2、道德性:控制抓取频率,防止对服务器造成压力。
3、异常处理:增加重试机制(如 `retrying` 库)应对网络波动。
4、设置请求头:模拟浏览器行为,避免被封禁。
headers = {"User-Agent": "Mozilla/5.0"}requests.get(url, headers=headers)
5、处理反爬:使用代理 IP、随机延时、验证码识别等。
6、数据存储:结合数据库(如 MySQL、MongoDB)或文件(JSON、CSV)。
七、爬虫工具和框架的用法及实战案例总结
1、Requests + BeautifulSoup/lxml
特点:
- Requests:发送 HTTP 请求,获取网页内容。
- BeautifulSoup:解析 HTML/XML 数据,语法简单。
- lxml:高性能解析库,支持 XPath。
基本用法:
import requests
from bs4 import BeautifulSoupurl = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml") # 使用 lxml 解析器
title = soup.find("h1").text
实战案例:抓取新闻标题
url = "https://news.ycombinator.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
titles = [a.text for a in soup.select(".titleline > a")]
print(titles)
2、Selenium
特点:
- 模拟浏览器操作,处理动态加载内容(如 JavaScript)。
- 支持 Chrome、Firefox 等浏览器。
基本用法
from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://example.com")
element = driver.find_element("tag name", "h1")
print(element.text)
driver.quit()
实战案例:自动登录并抓取数据
driver = webdriver.Chrome()
driver.get("https://login.example.com")
driver.find_element("id", "username").send_keys("user")
driver.find_element("id", "password").send_keys("pass")
driver.find_element("id", "submit").click()
# 登录后抓取数据
data = driver.find_element("class name", "data").text
driver.quit()
3. Pyppeteer(已不推荐,推荐 Playwright)
特点:
- 基于 Chromium 的异步无头浏览器。
- 类似 Puppeteer(Node.js),但已停止维护。
基本用法:
import asyncio
from pyppeteer import launchasync def main():browser = await launch()page = await browser.newPage()await page.goto("https://example.com")title = await page.title()await browser.close()asyncio.get_event_loop().run_until_complete(main())
4. Playwright
特点:
- 支持多浏览器(Chromium、Firefox、WebKit)。
- 异步操作,性能更高,维护更活跃。
基本用法:
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("https://example.com")print(page.title())browser.close()
实战实例:抓取动态渲染内容
with sync_playwright() as p:browser = p.chromium.launch(headless=True)page = browser.new_page()page.goto("https://spa.example.com")page.wait_for_selector(".dynamic-content")content = page.query_selector(".dynamic-content").text_content()print(content)
5. Scrapy
基本用法:
1、创建项目:
scrapy startproject myproject
2. 编写 Spider:
import scrapyclass MySpider(scrapy.Spider):name = "example"start_urls = ["https://example.com"]def parse(self, response):yield {"title": response.css("h1::text").get()}
3. 运行:
scrapy crawl example -o output.json
实战案例:抓取电商商品信息
class ProductSpider(scrapy.Spider):name = "product"start_urls = ["https://shop.example.com"]def parse(self, response):for product in response.css(".product-item"):yield {"name": product.css("h2::text").get(),"price": product.css(".price::text").get(),}next_page = response.css("a.next-page::attr(href)").get()if next_page:yield response.follow(next_page, self.parse)
6. PySpider
特点:
- 分布式爬虫框架,自带 Web 界面。
- 适合实时监控和调度。
基本用法:
from pyspider.libs.base_handler import *class Handler(BaseHandler):@every(minutes=24*60)def on_start(self):self.crawl("https://example.com", callback=self.index_page)@config(age=10*24*60*60)def index_page(self, response):return {"title": response.doc("h1").text()}
工具对比与选型
工具 | 使用场景 | 优点 | 缺点 |
Requests | 简单静态页面 | 轻量、易用 | 无法处理动态内容 |
Selenium | 动态渲染页面(少量请求) | 支持浏览器操作 | 性能低,资源占用高 |
Playwright | 动态渲染页面(高性能) | 多浏览器支持、异步 | 学习成本略高 |
Scrapy | 大规模数据抓取 | 完整框架、扩展性强 | 配置复杂 |
PySpider | 分布式爬取与实时监控 | web界面、分布式支持 | 社区活跃度下降 |
相关文章:
爬虫框架与库
爬虫框架与库是用于网络数据抓取的核心工具,帮助开发者高效地从网页中提取结构化数据。 Requests:用于发送HTTP请求。 BeautifulSoup:用于解析HTML和XML。 Scrapy:强大的爬虫框架,适合大规模爬取。 Selenium&#…...
从电子管到量子计算:计算机技术的未来趋势
计算机发展的历史 自古以来人类就在不断地发明和改进计算工具,从结绳计数到算盘,计算尺,手摇计算机,直到1946年第一台电子计算机诞生,虽然电子计算机至今虽然只有短短的半个多世纪,但取得了惊人的发展吗,已经经历了五代的变革。计算机的发展和电子技术的发展密切相关,…...
LeetCode 15.三数之和
15.三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组…...
c#笔记-基础知识
目录 整数 浮点 decimal bool 引用 object string 值 枚举 关键字 enum 类型转换 隐式转换 编辑 显式转换 装箱,拆箱 常量 表达式 编辑 字符串的使用 比较字符串 字符格式化 编辑 截取字符串 字符串的分割 插入字符串 删除字符串 …...
el-table fixed滚动条被遮挡导致滚动条无法拖动
/* 设置默认高度-滚动条高度 */ .el-table__fixed { height: calc(100% - 16px) !important; } .el-table__fixed:before { height: 0px; }...
如何在个人电脑本地部署Deepseek大模型?Windows10 + Ollama+Deepseek+ChatBox
第一阶段:下载并安装Ollama 1,打开浏览器,进入 Ollama 官方网站 2,点击“Download”,在新页面选择“Windows”,再点击“Download for Windows”。 3,下载完成后,在文件名࿰…...
链表题()
1、环形列表 141 方法一、 卡节点数量,或者值范围的bug 方法二、 快慢指针(最实用)寻找环 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NUL…...
ZIP64扩展和普通ZIP文件有什么区别?
ZIP64扩展是ZIP文件格式的一个扩展,旨在解决传统ZIP格式的限制,尤其是文件大小和数量的限制。以下是ZIP64扩展与普通ZIP文件的主要区别: 1. 文件大小限制 普通ZIP文件: 单个文件大小限制为 4GB(2^32字节)。…...
smolagents学习笔记系列(五)Tools-in-depth-guide
这篇文章锁定官网教程中的 Tools-in-depth-guide 章节,主要介绍了如何详细构造自己的Tools,在之前的博文 smolagents学习笔记系列(二)Agents - Guided tour 中我初步介绍了下如何将一个函数或一个类声明成 smolagents 的工具&…...
使用 Apache Dubbo 释放 DeepSeek R1 的全部潜力
作者:陈子康,Apache Dubbo Contributor 2025年1月20日,国产大模型公司深度求索(DeepSeek)正式发布了大语言模型 DeepSeek-R1,并同步开源其模型权重。通过大规模强化学习技术,DeepSeek-R1 显著提…...
【星云 Orbit-F4 开发板】03b. 按键玩法二:独立按键双击双击触发
【星云 Orbit-F4 开发板】03b. 按键玩法二:独立按键双击触发 引言 在嵌入式系统中,按键是常用的输入设备。通过检测按键的状态变化,可以实现多种功能,例如单击、双击、长按等。本文将详细介绍如何使用STM32F103的GPIO引脚检测独…...
ave-form.vue 组件中 如何将产品名称发送给后端 ?
如何将产品名称发送给后端。 在这段代码中,产品名称(productName)的处理和发送主要发生在 save() 方法中。让我逐步分析: 产品ID的选择: <w-form-selectv-model"form.productId"label"涉及产品&q…...
2025年电气工程与智能系统国际学术会议(IC2EIS 2025)
重要信息 官网:www.ic2eis.org(点击了解参会投稿等) 时间:2025年3月14-16日 地点:中国河南省郑州市 简介 2025年电气工程与智能系统国际学术会议(IC2EIS 2025)将于2025年3月14-16日在中国郑州举行。会议旨在为电气…...
Android TextView 使用.9图片文字不展示
参考文章 Android的TextView设置padding无效。 实现如上图效果的时候,选择框使用了.9,代码如下: LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(0,...
【PyTorch][chapter-33][transformer-5] MHA MQA GQA, KV-Cache
主要翻译外网: 解剖Deep Seek 系列,详细见参考部分。 目录: Multi-Head Attention (MHA) KV-Cache KV-Cache 公式 Multi-Query Attention(MQA) Grouped-Query Attention(GQA) Multi-Head Latent Attention …...
MS SQL 2008 技术内幕:T-SQL 语言基础
《MS SQL 2008 技术内幕:T-SQL 语言基础》是一部全面介绍 Microsoft SQL Server 2008 中 T-SQL(Transact-SQL)语言的书籍。T-SQL 是 SQL Server 的扩展版本,增加了编程功能和数据库管理功能,使得开发者和数据库管理员能…...
seacmsv9注入管理员账号密码+orderby+limit
seacmsv9注入管理员账号密码 安装海洋CMS(seacms) 将upload文件夹里的文件全部上传至网页服务器后,执行以下操作: 请运行http://域名/install/index.php进行程序安装 SQL语句尝试注入 http://127.0.0.1/upload/comment/api/index.php?g…...
智能生活综合平台需求规格说明书
一、引言 1.1 编写目的 本需求规格说明书旨在明确智能生活综合平台的功能、性能、用户界面等方面的需求,为平台的开发、测试和部署提供详细的指导,确保平台能够满足用户在社交、购物、教育、医疗、政务等多个领域的智能生活需求,提升用户的…...
应用的负载均衡
概述 负载均衡(Load Balancing) 调度后方的多台机器,以统一的接口对外提供服务,承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…...
TDengine 中的数据类型
简介 数据类型是数据库产品中一个非常重要的概念,它决定着能处理不同类型数据的范围。 TDengine 支持了所有通用的数据类型,同时还支持了一些特色数据类型,如地理坐标,未来准备支持 decimal 数据类型,方便银行等场景中…...
网络运维学习笔记(DeepSeek优化版)005网工初级(HCIA-Datacom与CCNA-EI)链路层发现协议与VLAN技术
文章目录 一、链路层发现协议1.1 思科CDP协议1.2 华为LLDP协议 二、VLAN(Virtual Local Area Network,虚拟局域网)技术详解2.1 基本概念2.2 技术特性2.3 接口工作原理2.3.1 Access模式2.3.2 Trunk模式 2.4 厂商配置对比思科配置华为配置 2.5 …...
51 哈希表的实现
目录 一、哈希介绍 (一)直接定值法 (二)哈希冲突 (三)负载因子 (四)将关键字转为整数 (五)哈希函数 1、除法散列法 / 除留余数法 2、乘法散列法&#…...
使用Python实现机器学习小案例:构建房价预测模型
背景 在日常生活中,很多人都希望了解某个区域的房价,特别是在购房时。如果我们能够根据一些已知的房屋特征(如面积、卧室数量、距离市中心的距离等)来预测房价,那将大大提高购房决策的效率。在本文中,我们将通过Python实现一个简单的房价预测模型,并帮助你理解机器学习…...
Layui页面粘贴的方法
一: 在Controller层 注解的注意点 : 1.先写一个大的 RequestMapping () () 里面的的是 : (这些你写的那个实体类的方法,在这取名是什么 比如 用户类 user) 2. 在Controller层 需要写一个 Controller的注解 3. Autowired 就相当与 之前new的 全局的serviceImpl 的方法 4.在…...
js:根据后端返回的数组取出每一个数组的keyword字段然后拼接成一个逗号分隔的字符串
问: 现在有一个el-select, 后端接口返回数据为keyword:xxx,referenceNum:1,tagId:132sf32fasdfaf组成的数组, 现在select是多选, 但是但我选择多个下拉框选项后,后端需要前端返回的数据tagIds字段需要时一个字符串…...
ES 客户端 API 二次封装思想
ES 客户端 API 二次封装思想 网页端 : ip5601 索引创建 数据新增 数据查询 数据删除 因为json串会出现在代码中,为了让用户更容易去添加数据所以去封装它。 思想:为了让json串变得更加容易添加,封装最主要是为了简化正文的…...
《Kettle保姆级教学-日志写入数据库(通过修改kettle.properties一劳永逸)》
目录 一、配置转换属性二、修改kettle.properties文件 一、配置转换属性 双击空白处,进入配置页面 执行转换 可以看到日志已写入数据库 二、修改kettle.properties文件 第一步的方式只能对某个转换/作业生效,怎么做到所有的转换/作业都可以生效呢&…...
SQL注入练习
目录 一、如何绕过 information schema 字段过滤注入 二、如何绕过 order by 语句过滤注入 三、seacmsv9 实现报错注入数据 一、如何绕过 information schema 字段过滤注入 1、使用其他系统表,不同数据库有各自的系统表,可替代information_schema。 …...
【大模型】量化、剪枝、蒸馏
大模型的量化、剪枝和蒸馏是三种常用的模型优化技术,旨在减少模型的复杂性,降低计算资源消耗,并加速推理过程。下面是每种技术的详细介绍: 1. 量化(Quantization) 量化是将浮点数表示的模型参数ÿ…...
Feign 类型转换问题解析:如何正确处理 `ResponseEntity<byte[]>` 返回值
在微服务架构中,Feign 是一种常见的用于服务间调用的客户端,它允许我们通过声明式接口来调用远程服务。使用 Feign 时,我们通常通过接口方法的返回类型来接收服务的响应体。然而,某些情况下,我们会遇到 Feign 无法正确解析响应体类型的问题,尤其是当服务返回一个如 Respo…...
最快安装ESP8266 ESP832 开发板·Arduino环境的方法
直接去官网找这种exe然后直接运行就好他会自动识别安装 请点击此处下载插件安装文件(提取码:49c1) 去官网可以找到最新的,但是这种方法有个弊端你更新不了,所以还要添加链接到首选项 http://arduino.esp8266.com/st…...
最新版本SpringAI接入DeepSeek大模型,并集成Mybatis
当时集成这个环境依赖冲突,搞了好久,分享一下依赖配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...
【工具变量】公司企业数字领导力(2004-2023年)
数据简介:企业数字化领导力是指在数字经济时代,领导者通过战略性地使用数字资产、引领组织变革,使企业在数字化环境中获得持续成功的能力。对于上市公司而言,这种领导力尤为重要,因为它直接关系到企业的战略方向、市场…...
LeetCode 动态规划 环形子数组的最大和
环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i 1) % n] , nums[i] 的前一个元素是 nums[(…...
毕业项目推荐:基于yolov8/yolo11的野生菌菇检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
基于开源鸿蒙OpenHarmony的智能家居综合应用系统 1. 智能安防与门禁系统1) 系统概述2) 系统架构3)关键功能实现4)安全策略5)总结 2.环境智能调节系统1)场景描述2)技术实现3)总结 3.健康管理与睡眠监测1&…...
C语言【指针篇】(三)
C语言【指针篇】(三) 前言正文1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 总结 前言 本文主要基于前面对指针的掌握,进一步学习:数组名的理解、使用指针…...
【嵌入式Linux应用开发基础】网络编程(4):UDP协议
目录 一、UDP 协议概述 二、UDP 协议特点 三、UDP协议的字段格式 四、UDP协议的数据传输过程 五、嵌入式UDP编程核心API 六、UDP 在嵌入式 Linux 中的编程实现 6.1 UDP 服务器代码示例 6.2 UDP 客户端代码示例 七、UDP 协议的应用场景 八、UDP 协议的优缺点 8.1 优点…...
PS渐变工具
渐变工具:(颜色条 起点到终点 为 前景色到背景色) 渐变shift:垂直、水平、45度 渐变工具–》仿色:让渐变变得细腻。仿色值高,过渡柔和,仿色值低,过渡粗糙 渐变工具–》渐变编辑器&am…...
win11系统通过WSL安装ubuntu
Linux 和Windows windows 属于单用户、多任务 Linux属于多用户多任务。Linux一切皆文件 https://blog.csdn.net/ddafei/article/details/142798010 一、启用WSL功能 首先,你需要在Windows上启用WSL功能。 打开“控制面板”。点击“程序” > “启用或关闭Windo…...
Sqoop从入门到使用
安装和配置 修改文件配置:修改文件名将(sqoop-env-template.sh改为sqoop-env.sh) 编辑sqoop-env.sh内部文本,修改调用文件位置 将sqoop-env.sh,配置到全局变量中,方便调用。 查看正常运用 第一类࿱…...
深度学习奠基作 AlexNet 论文阅读笔记(2025.2.25)
文章目录 训练数据集数据预处理神经网络模型模型训练正则化技术模型性能其他补充 训练数据集 模型主要使用2010年和2012年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)提供的 ImageNet 的子集进行训练,这些子集包含120万张图像。最终ÿ…...
解决python项目无法安装openai模块的问题
问题描述: pip install openai Fatal error in launcher: Unable to create process using ‘“e:\private\github\navigation_site.venv\Scripts\python.exe” “E:\private\github\my_project\navigation_site.venv\Scripts\pip.exe” install OpenAI’: ??? 这…...
项目实践 之 pdf简历的解析和填充(若依+vue3)
文章目录 环境背景最终效果前端讲解左侧模块解析右侧上传模块解析前端步骤 后端讲解代码前端 环境背景 若依前后端分离框架 vue最后边附有代码哦 最终效果 前端讲解 左侧模块解析 1、左侧表单使用el-form 注意: 1、prop出现的字段,需要保证是该类所…...
RAGS评测后的数据 如何利用influxdb和grafan 进行数据汇总查看
RAGS(通常指相关性、准确性、语法、流畅性)评测后的数据能借助 InfluxDB 存储,再利用 Grafana 进行可视化展示,实现从四个维度查看数据,并详细呈现每个问题对应的这四个指标情况。以下是详细步骤: 1. 环境准备 InfluxDB 安装与配置 依据自身操作系统,从 InfluxDB 官网下…...
本地部署阿里的万象2.1文生视频(Wan2.1-T2V-1.3B)模型
文章目录 (零)在线体验(一)本地部署(1.1)克隆仓库(1.2)安装依赖(1.2.1)安装 flash-attention(1.2.2)重新安装依赖(1.2.3&a…...
centos设置 sh脚本开机自启动
1. start.sh脚本 #!/bin/bash# 依赖docker,等待xxx容器完全启动 sleep 60curl -X POST "localhost:8381/models?urlmymodel.mar&model_namemymodel&batch_size1&max_batch_delay10&initial_workers1"sudo /usr/local/nginx/sbin/nginx …...
一文读懂什么是K8s Admission Controller
#作者:曹付江 文章目录 1、什么是 Admission Controllers?2、如何创建 Admission Controllers?3、Admission 控制器的最佳实践 K8s 中的操作与安全标准执行机制: 1、什么是 Admission Controllers? Admission contro…...
江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍
前言:本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…...
一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 不管是开发网站还是后台管理系统,我们页面里多多少少有公共的模块。比如博客网站,就有公共的头部&…...