使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战
使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战
- 前言
- 项目概述
- 技术栈
- 代码分析
- 1. 导入必要的库
- 2. 初始化FastAPI应用
- 3. 定义请求模型
- 4. 核心爬虫功能
- 4.1 URL验证和准备
- 4.2 设置HTTP请求
- 4.3 发送请求和解析HTML
- 4.4 提取文章内容
- 4.5 保存结果和返回数据
- 5. API端点定义
- 6. 启动服务器
- 爬虫技术要点分析
- 1. 请求头和会话管理
- 2. 重试机制
- 3. HTML解析技巧
- 4. 递归内容提取
- 5. 错误处理和异常管理
- 爬虫开发的最佳实践
- 改进建议
- 总结
- 注意事项
前言
在数据分析和信息收集的时代,网络爬虫技术已成为获取互联网数据的重要手段。本文将通过分析一个实际的爬虫项目,帮助大家了解如何使用Python构建一个功能完善的网站爬虫API,特别是针对医疗类网站的内容抓取。
项目概述
这个项目是一个基于FastAPI的Web服务,专门用于抓取日本医疗网站Oncolo的文章内容。该API可以接收文章URL,然后抓取并解析文章的各个部分,包括标题、副标题、发布日期、正文内容、标签和作者信息等,最后将结果保存为文本文件并返回JSON格式的响应。
技术栈
- Python:编程语言
- FastAPI:构建API服务
- BeautifulSoup:HTML解析
- Requests:HTTP请求处理
- Pydantic:数据验证
代码分析
1. 导入必要的库
import requests
from bs4 import BeautifulSoup
import os
import time
import re
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optionalfrom bs4.element import NavigableString, Tag
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from requests.packages.urllib3.exceptions import InsecureRequestWarning
这部分导入了项目所需的所有库,包括HTTP请求、HTML解析、文件操作和API构建等功能模块。
2. 初始化FastAPI应用
# 安全でないリクエストの警告を無効化
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)app = FastAPI(title="Oncoloの記事スクレイピングAPI", description="Oncoloウェブサイトの記事内容をスクレイピングするAPI")
这里初始化了FastAPI应用,并禁用了不安全请求的警告(因为代码中使用了verify=False
选项)。
3. 定义请求模型
class ScrapeRequest(BaseModel):url: str
使用Pydantic定义了一个简单的请求模型,只包含一个URL字段。
4. 核心爬虫功能
scrape_oncolo_article
函数是整个项目的核心,它完成了以下任务:
4.1 URL验证和准备
def scrape_oncolo_article(url: str):# URL验证if not url.startswith('https://oncolo.jp/news/'):raise ValueError("URLはoncolo.jp/news/形式である必要があります")# 从URL提取文件名file_id = url.split('/news/')[1]output_filename = f"{file_id}.txt"
这部分代码验证URL是否符合要求的格式,并从URL中提取文章ID作为保存文件的名称。
4.2 设置HTTP请求
# HTTP请求头设置headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive','Upgrade-Insecure-Requests': '1',}# 创建会话对象session = requests.Session()# 设置重试策略retry_strategy = Retry(total=5,backoff_factor=1,status_forcelist=[429, 500, 502, 503, 504],)adapter = HTTPAdapter(max_retries=retry_strategy)session.mount("https://", adapter)session.mount("http://", adapter)
这部分代码设置了HTTP请求头,创建了一个会话对象,并配置了重试策略。这是爬虫开发中的重要步骤,因为:
- 自定义User-Agent可以模拟浏览器行为,避免被网站识别为爬虫
- 设置重试策略可以处理临时网络问题和服务器错误
- 使用会话对象可以在多次请求之间保持Cookie等状态
4.3 发送请求和解析HTML
try:# 禁用SSL验证response = session.get(url, headers=headers, verify=False, timeout=30)response.raise_for_status() # 如果请求失败则抛出异常# 使用BeautifulSoup解析HTMLsoup = BeautifulSoup(response.text, 'html.parser')
这部分代码发送HTTP请求并使用BeautifulSoup解析返回的HTML内容。注意这里禁用了SSL验证(verify=False
),这在开发阶段可能有用,但在生产环境中应该避免。
4.4 提取文章内容
代码使用BeautifulSoup的选择器功能,根据网站的HTML结构提取各种信息:
- 主标题和副标题
- 发布日期和更新日期
- 文章正文内容
- 标签信息
- 作者信息和简介
例如,提取标题的代码:
# 提取标题和副标题
h1_element = main_section.find('h1')
main_title = ""
subtitle = ""if h1_element:subtitle_element = h1_element.find('span', class_='subtitle')if subtitle_element:subtitle = subtitle_element.get_text(strip=True)# 创建h1的副本以避免修改原始souptitle_copy = BeautifulSoup(str(h1_element), 'html.parser').h1subtitle_in_copy = title_copy.find('span', class_='subtitle')if subtitle_in_copy:subtitle_in_copy.decompose() # 从副本中删除副标题元素main_title = title_copy.get_text(strip=True)else:main_title = h1_element.get_text(strip=True)
4.5 保存结果和返回数据
# 保存为纯文本文件
output_path = os.path.join('scraped_data', output_filename)
with open(output_path, 'w', encoding='utf-8') as f:f.write(f"メインタイトル: {main_title}\n")f.write(f"サブタイトル: {subtitle}\n")# ...其他内容...# 返回包含所有内容的响应
return {"success": True,"message": f"記事は {output_path} に保存されました","filename": output_filename,"title": main_title,# ...其他字段...
}
这部分代码将提取的内容保存到文本文件中,并返回一个包含所有数据的JSON响应。
5. API端点定义
@app.post("/scrape/", summary="Oncolo記事のスクレイピング", description="oncolo.jpの記事URLを提供し、コンテンツをスクレイピングして保存します")
async def scrape_article(request: ScrapeRequest):try:result = scrape_oncolo_article(request.url)return resultexcept ValueError as e:raise HTTPException(status_code=400, detail=str(e))except HTTPException as e:raise eexcept Exception as e:raise HTTPException(status_code=500, detail=f"サーバーエラー: {str(e)}")@app.get("/", summary="APIルートパス", description="APIの基本情報を返します")
async def root():return {"message": "Oncolo記事スクレイピングAPIへようこそ", "usage": "/scrape/エンドポイントにPOSTリクエストを送信し、oncolo.jpの記事URLを提供してください"}
这部分代码定义了两个API端点:
/scrape/
:接收POST请求,包含要抓取的URL/
:根路径,返回API的基本信息
6. 启动服务器
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)
这部分代码使用uvicorn启动FastAPI服务器,监听所有网络接口的8000端口。
爬虫技术要点分析
1. 请求头和会话管理
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',# ...其他头信息...
}
session = requests.Session()
要点:
- 设置User-Agent模拟真实浏览器,避免被网站拦截
- 使用Session对象维护会话状态,提高效率并保持登录状态
2. 重试机制
retry_strategy = Retry(total=5,backoff_factor=1,status_forcelist=[429, 500, 502, 503, 504],
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("https://", adapter)
要点:
- 实现自动重试机制,处理临时网络问题
- 使用指数退避策略(backoff_factor)避免频繁请求
- 针对特定HTTP错误码(如429太多请求、500服务器错误等)进行重试
3. HTML解析技巧
soup = BeautifulSoup(response.text, 'html.parser')
main_section = soup.find('section', class_='main')
要点:
- 使用BeautifulSoup进行HTML解析,比正则表达式更可靠
- 根据HTML结构和CSS选择器定位元素
- 处理复杂的嵌套结构和不同类型的内容
4. 递归内容提取
for content in content_div.contents:if isinstance(content, NavigableString):# 处理文本节点elif isinstance(content, Tag):# 处理标签节点# 递归处理子节点
要点:
- 区分处理文本节点和标签节点
- 递归遍历复杂的DOM结构
- 保持原始格式和链接信息
5. 错误处理和异常管理
try:# 爬虫代码
except requests.exceptions.RequestException as e:raise HTTPException(status_code=500, detail=f"リクエストエラー: {str(e)}")
except Exception as e:raise HTTPException(status_code=500, detail=f"処理エラー: {str(e)}")
要点:
- 区分不同类型的异常(请求错误、解析错误等)
- 提供有意义的错误信息
- 将内部错误转换为适当的HTTP状态码
爬虫开发的最佳实践
-
尊重robots.txt:虽然本例中没有显示,但在实际开发中应该检查目标网站的robots.txt文件,遵守其访问规则。
-
控制请求频率:使用
time.sleep()
或更复杂的限速机制,避免对目标服务器造成过大负担。 -
异常处理:全面的异常处理确保爬虫能够稳定运行,即使遇到意外情况。
-
模块化设计:将爬虫功能拆分为多个模块,如请求发送、内容解析、数据存储等,便于维护和扩展。
-
数据验证:使用Pydantic等工具验证输入和输出数据,确保数据的完整性和一致性。
改进建议
-
添加请求延迟:在代码中添加
time.sleep()
,控制请求频率,避免被目标网站封禁。 -
启用SSL验证:在生产环境中应启用SSL验证(删除
verify=False
),提高安全性。 -
使用代理池:对于大规模爬虫,可以实现代理IP轮换机制,避免IP被封。
-
添加日志系统:记录爬虫运行状态和错误信息,便于调试和监控。
-
实现增量爬取:检查已爬取的内容,只抓取新内容,提高效率。
总结
这个项目展示了如何使用Python构建一个功能完善的网站爬虫API,涵盖了HTTP请求、HTML解析、内容提取、数据存储和API服务等多个方面。通过分析这个实例,我们可以学习到网络爬虫开发的核心技术和最佳实践。
爬虫开发是一个需要不断学习和适应的过程,因为网站结构经常变化,反爬虫技术也在不断升级。希望这篇文章能够帮助你理解爬虫开发的基本原理和技术要点,为你的爬虫项目提供参考。
注意事项
在使用爬虫技术时,请务必遵守以下原则:
- 遵守网站的robots.txt规则和使用条款
- 控制爬取频率,不对目标网站造成过大负担
- 尊重版权,不将抓取的内容用于商业用途(除非得到授权)
- 保护个人隐私数据,不抓取和存储敏感信息
只有合法、合理地使用爬虫技术,才能发挥其真正的价值,并避免不必要的法律风险。
相关文章:
使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战
使用Python和FastAPI构建网站爬虫:Oncolo医疗文章抓取实战 前言项目概述技术栈代码分析1. 导入必要的库2. 初始化FastAPI应用3. 定义请求模型4. 核心爬虫功能4.1 URL验证和准备4.2 设置HTTP请求4.3 发送请求和解析HTML4.4 提取文章内容4.5 保存结果和返回数据 5. AP…...
光纤克尔非线性效应及其在光通信系统中的补偿教程-3.2 克尔效应
需要结合上一期的文章,光纤克尔非线性效应及其在光通信系统中的补偿教程-3.1 非线性极化性 光纤中的非线性效应源于三阶感性 χ ( 3 ) \chi^{(3)} χ(3)。 光纤中非线性效应的主要来源之一是由 χ ( 3 ) \chi^{(3)} χ(3)引起的非线性折射,即克尔效应&a…...
【Tools】VMware Workstation 17.6 Pro安装教程
00. 目录 文章目录 00. 目录01. VMware Workstation 17.6简介02. VMware Workstation 17.6新功能03. VMware Workstation 17.6特性04. VMware Workstation 17.6下载05. VMware Workstation 17.6安装06. VMware Fusion 和 Workstation免费07. 附录 01. VMware Workstation 17.6简…...
Unity10分钟回顾指南
🎮 Unity10分钟回顾指南 欢迎踏上Unity场景创作之旅!本教程将带你从零开始,循序渐进地掌握Unity场景制作的全部技能。无论你是游戏开发爱好者还是专业开发者,这份指南都将成为你的得力助手。 第一章:Unity基础认知 1.…...
SeleniumBase - 多合一浏览器自动化框架
手动编写Selenium脚本,繁琐且常遇“掉坑”?SeleniumBase来救场!这款基于Selenium的Python框架集测试、爬虫、RPA于一体,支持多浏览器、并行测试、CAPTCHA绕过和智能等待,堪称Web自动化的“瑞士军刀”。不少行业大佬盛赞…...
【人工智能导论】第2.3章知识表示、确定性推理
1、李明的父亲是教师,用谓词逻辑可以表示为Teacher(father(Liming))这里father(Liming)是( ) A、常量 LIMING B、变元 X未知的可取多个值的对象 C、函数 X的父亲 D、一元…...
【QT】一个界面中嵌入其它界面(一)
在 Qt 中嵌入其他界面通常可以通过以下几种方式实现。以下是详细的步骤说明和示例代码: 方法 1:直接通过布局嵌入子部件 如果目标界面是 QWidget 的子类,可以直接将其添加到父窗口的布局中。 步骤: 创建子界面类: //…...
[学习]POSIX消息队列的原理与案例分析(完整示例代码)
POSIX消息队列的原理与案例分析 文章目录 POSIX消息队列的原理与案例分析摘要关键词一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究内容与方法 二、POSIX消息队列的基本原理2.1 消息队列概述2.2 POSIX消息队列的特性2.2 POSIX消息队列的特性2.3 POSIX消息队列的内部机制…...
IDC数据中心动力环境监控系统解决方案
文档围绕 IDC 数据中心动力环境监控系统解决方案展开,先介绍数据中心分级,包括国家规范的 A/B/C 级和美国 TIA-942 标准的 Tier1-Tier4 级,强调动环监控对数据中心的重要性。接着阐述系统架构,涵盖底端设备层、采集层、接入层、服务层、应用层,具备数据采集、分析、可视化…...
WebSphere Application Server(WAS)8.5.5教程第五讲
续前篇! 一、Web 应用部署与类加载策略 Web 应用部署与类加载策略是 WebSphere Application Server(WAS)日常管理的核心部分,尤其对运行大型企业级 Java 应用(如 BAW)非常关键。本讲将分两部分讲解&#…...
Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
在runtime中有runtime.LockOSThread 和 runtime.UnlockOSThread 两个函数,这两个函数有什么作用呢?我们看一下标准库中对它们的解释。 runtime.LockOSThread // LockOSThread wires the calling goroutine to its current operating system thread. // T…...
计算圆周率 (python)
使用模特卡罗方法(模拟法),模拟撒点100000次,计算圆周率π 输入格式: 一个整数,表示随机数种子 输出格式: 计算的π值,结果小数点后保留5位数字 输入样例: 在这里给出一组输入。例如: 10…...
机器学习EM算法原理及推导
在机器学习与统计推断中,我们经常会遇到“缺失数据”或“潜在变量”(latent variables)的情形:样本并非完全可观测,而部分信息被隐藏或丢失。这种情况下,直接对观测数据做极大似然估计(Maximum …...
Linux项目部署全攻略:从环境搭建到前后端部署实战
Linux项目部署全攻略:从环境搭建到前后端部署实战 注:根据黑马程序员javawebAI视频课程总结: 视频地址 详细讲义地址 一、Linux基础入门:为什么选择Linux? 要成为一名Java开发工程师,掌握Linux是企业级…...
人工智能重塑医疗健康:从辅助诊断到个性化治疗的全方位变革
人工智能正在以前所未有的速度改变着医疗健康领域,从影像诊断到药物研发,从医院管理到远程医疗,AI 技术已渗透到医疗服务的各个环节。本文将深入探讨人工智能如何赋能医疗健康产业,分析其在医学影像、临床决策、药物研发、个性化医…...
ubuntu系统 | dify+ollama+deepseek搭建本地应用
1、安装 Ollama 下载并安装 Ollama (llm) wangqiangwangqiang:~$ curl -fsSL https://ollama.ai/install.sh | bash >>> Installing ollama to /usr/local >>> Downloading Linux amd64 bundle0.3% curl -fsSL https://ollama.ai/install.sh (下…...
NHANES最新指标推荐:C-DII
文章题目:Non-linear relationship between the childrens dietary inflammatory index and asthma risk: identifying a critical inflection point in US children and adolescents DOI:10.3389/fnut.2025.1538378 中文标题:儿童饮食炎症指…...
【PhysUnits】4.4 零类型(Z0)及其算术运算(zero.rs)
一、源码 该代码定义了一个类型系统中的零类型Z0,并为其实现了基本的算术运算(加法、减法、乘法、除法)。这是一个典型的类型级编程示例,使用Rust的类型系统在编译期进行数学运算。 //! 零类型(Z0)及其算术运算实现 //! //! 本…...
【大模型面试每日一题】Day 23:如何设计一个支持多模态(文本+图像)的大模型架构?
【大模型面试每日一题】Day 23:如何设计一个支持多模态(文本图像)的大模型架构? 📌 题目重现 🌟🌟🌟 面试官:我们需要构建一个同时处理文本和图像的多模态大模型&#…...
BUUCTF PWN刷题笔记(持续更新!!)
ciscn_2019_c_1 64位,没有开启保护。点进去没发现明显的漏洞函数,考虑泄露libc基地址的rop构造。先看看有多少gadget 估计也够用了。puts函数只接受一个参数,观看汇编看看用的哪个寄存器传输的参数。 用的是edi。但是我们怎么找到so的版本呢…...
Tare使用MCP|Win11安装UV
servers/src/git at main modelcontextprotocol/servers GitHub 进入Installation | uv 打开powershell 运行 (如果要删除 文章中也有删除的链接) powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" …...
小白的进阶之路-人工智能从初步到精通pytorch的基本流程详解-1
Pytorch大致流程一览表: 主题内容1 准备数据数据几乎可以是任何东西,但在开始之前,我们将创建一条简单的直线2 建立模型在这里,我们将创建一个模型来学习数据中的模式,我们还将选择损失函数,优化器并构建一个训练循环。3 拟合模型我们已经有了数据和模型,现在让模型尝试…...
linux kernel 编译
1. 获取内核源码 从官方仓库获取: 访问kernel.org下载所需版本的Linux内核源码压缩包(如linux-x.y.z.tar.xz)。或者使用Git克隆特定版本: bash git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gitcd linux-stablegit checkout vX.Y.Z # 切…...
【氮化镓】偏置对GaN HEMT 单粒子效应的影响
2025年5月19日,西安电子科技大学的Ling Lv等人在《IEEE Transactions on Electron Devices》期刊发表了题为《Single-Event Effects of AlGaN/GaN HEMTs Under Different Biases》的文章,基于实验和TCAD仿真模拟方法,研究了单粒子效应对关断状态、半开启状态和开启状态下AlG…...
Assistants API
一、前言 0.1、从轰动一时的 OpenAI DevDay 说起 2023 年 11 月 6 日,OpenAI DevDay 发表了一系列新能力,其中包括:GPT Store 和 Assistants API 这一波操作一度被认为是创业公司终结者 0.2、GPTs 和 Assistants API 本质是降低开发门槛 可操控性和易用性之间的权衡与折中…...
AcWing 223. 阿九大战朱最学——扩展欧几里得算法
题目来源 223. 阿九大战朱最学 - AcWing题库 题目描述 自从朱最学搞定了 QQ 农场以后,就开始捉摸去 QQ 牧场干些事业,不仅在自己的牧场养牛,还到阿九的牧场放牛! 阿九很生气,有一次朱最学想知道阿九牧场奶牛的数量…...
开发指南116-font-size: 0的使用
平台前台的css样式里有几个地方用到了font-size: 0,这是个使用小技巧。原理说明:font-size 属性用于定义元素中文本的大小。当设置 font-size: 0 时,意味着该元素内的文本将不占据空间。当元素的 font-size 设置为零时,该元素内的…...
算法-数对的使用
1、数对可用于数组排序中,并且可记忆化排序前的元素下标 #include<iostream> #include<string> #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10; pair<int, int> a[N]; void solve() {ll n;cin …...
EmoBox:我与 CodeBuddy 共创的 Emoji 表情分类小工具
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 最近我萌生了一个想法,想做一个小而美的工具——一个叫「EmoBox」的 emoji 表情分类应用࿰…...
力扣HOT100之二叉树:199. 二叉树的右视图
这道题没啥好说的,首先定义一个向量来保存每一层的最后一个元素,直接用层序遍历(广度优先搜索)遍历二叉树,然后将每一层的最后一个元素加入到这个向量中即可。属于是二叉树层序遍历的模板题。 /*** Definition for a …...
力扣992做题笔记
左神做法的理论依据 我们可以通过 集合的包含关系 和 具体示例枚举 来直观理解这一推导过程。以下结合题目示例 1 进行详细说明: 示例 1 分析 输入:nums [1,2,1,2,3], k 2 目标:计算恰好包含 2 种不同整数 的子数组个数。 步骤一集合 A…...
特征值与特征向量的计算——PCA的数学基础
特征值与特征向量 定义 令 A {\bm A} A为 n n n \times n nn矩阵,如果存在非零向量 x {\bm x} x使得 A x λ x (1) {\bm A}{\bm x} \lambda {\bm x}\tag{1} Axλx(1) 成立,则称数 λ \lambda λ是矩阵 A {\bm A} A的特征值,称非零向量 x…...
vue2.0 的计算属性
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
【数根】2022-1-24
缘由程序设计 -- 数根(2)-编程语言-CSDN问答 void 数根() {//缘由https://ask.csdn.net/questions/7635593?spm1005.2025.3001.5141std::string n;int m 0, a 0;std::cin >> n;while (n[a] ! \0)m n[a] - 0;a 0;while (m)a m - m / 10 * 10…...
【Android】一键创建Keystore + Keystore 参数说明 + 查询SHA256(JDK Keytool Keystore)
一键创建 Android Keystore 的实用方法与参数详解 在 Android 应用开发与发布中,**Keystore(签名文件)**扮演着至关重要的角色。本文将介绍如何通过 .bat 脚本一键创建 Keystore 文件,并详细讲解每一个参数的含义,帮助…...
laravel 通过Validator::make验证后,如何拿到验证后的值
在 Laravel 中,通过 Validator::make 创建的验证器实例验证数据后,可以通过以下方式获取验证后的值: 使用 validate() 方法 调用验证器实例的 validate() 方法,会返回经过验证的数据数组。如果验证失败,该方法会抛出 V…...
centos把jar包配置成服务并设置开机自启
1.准备好jar包,启动路径,日志路径 2.编写启动脚步 vim /etc/systemd/system/test.service [Unit] Descriptionlapis Requiresnetwork.target remote-fs.target ##启动优先级,在下面的服务之后启动 Afterkafka.service zookeeper.service n…...
CentOS相关操作hub(更新中)
CentOS介绍: CentOS(Community Enterprise Operating System)是基于 Red Hat Enterprise Linux(RHEL)源代码编译的开源企业级操作系统,提供与 RHEL 二进制兼容的功能 完全兼容 RHEL,可直接使用…...
数据库(一):分布式数据库
定义 分布式数据库(Distributed Database) 是指: 数据分布在多个物理位置,但对用户透明,表现为一个统一逻辑数据库的系统。 结构模式(三层模式扩展) 层次作用对应实体用户层提供统一视图&…...
人工智能(AI)与BIM:建筑业创新实践的深度融合
一、BIM在建筑领域的发展现状与挑战 作为建筑数字化的核心技术,BIM通过三维模型集成建筑全生命周期信息,已成为工程设计、施工及运维的标准工作流程。当前,BIM在碰撞检测、施工模拟、成本管控等场景的应用已较为成熟,但行业仍面临…...
FIR数字滤波器设计与实现
低通滤波器的设计与实现 打开Matlab ,运行命令filterDesigner,选择FIR 最小二乘或者其它,设置采样频率,和低通滤波器截止频率。点击设计滤波器,如图1: 点击目标生成.C头文件,滤波器系数如下: …...
软件架构之-论高并发下的可用性技术
论高并发下的可用性技术 摘要正文摘要 ;2023年2月,本人所在集团公司承接了长三角地区某省渔船图纸电子化审查系统项目开发,该项目旨在为长三角地区渔船建造设计院、以及渔船审图机构提供一个便捷化的服务平台。在此项目中,我作为项目组成员参与了项目建设工作,并担任系统架…...
阻塞队列:线程安全与生产者消费者模型解析
一、阻塞队列 阻塞队列就是基于普通队列做出扩展 1.线程安全的 如果针对一个已经满了的队列进行入队列,此时入队列操作就会阻塞,一直阻塞到队列不满(其他线程出队列元素)之后 如果针对一个已经空了的队列进行出队列,…...
【时时三省】(C语言基础)用函数实现模块化程序设计
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 为什么要用函数? 已经能够编写一些简单的C程序,但是如果程序的功能比较多,规模比较大,把所有的程序代码都写在一个主函数(main函数)中&#x…...
基于CATIA参数化圆锥建模的自动化插件开发实践——NX建模之圆锥体命令的参考与移植(一)
引言 在CATIA二次开发领域,Python因其灵活性和丰富的库支持逐渐成为高效工具开发的首选语言。本文将以笔者开发的CATIA锥体自动化建模工具为例,参考NX软件中高效锥体创建命令,深度解析基于PySide6 GUI框架与pycatia接口库的集成…...
天才简史——Paolo Fiorini与他的速度障碍法
一、背景 第一次“认识”Paolo Fiorini教授是看了DMP的体积避障论文《Dynamic Movement Primitives: Volumetric Obstacle Avoidance》,而且他的学生Michele Ginesi将相关代码开源了,后来查阅了Paolo Fiorini相关资料才发现他竟然是速度障碍法的作者&am…...
第五天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 毅力是永久的享受。 没有人是一座孤岛,每个人都是这块大陆的一部分。 二、练习题 import numpy as np import matplotlib.pyplot as plt array np.array([1,2,3,4,5]) plt.plot…...
大小端模式和消息的加密解密
大小端模式 知识点一 什么是大小端模式 // 大端模式 // 是指数据的高字节保存在内存的低地址中 // 而数据的低字节保存在内存的高地址中 // 这样的存储模式有点儿类似于把数据当作字符串顺序处理 // 地址由小向大增加,数据从高位往低位放 …...
(1) 查看端口状态
1. lsof 和 netstat 命令的区别 1.1 lsof 概念:只有在 root 的命令下才能执行,否则无内容显示;root 命令下显示完全 lsof -i: 8080 1.2 netstat 普通用户下显示不完全,root 命令下显示完全 netstat -tunlp | grep 8080 1.3…...
【C++]string模拟实现
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<assert.h> using namespace std; namespace liu {class string{public:using iterator char*;using const_iterator const char*;//string();//无参构造 string(const string&…...