中国天气网Python爬虫实战:从入门到生产部署
简介本资源是一套面向Python初学者与数据实践者的网页爬虫实战项目聚焦中国天气网weather.com.cn的结构化天气数据采集与解析帮助用户掌握HTTP请求发送、HTML页面解析及多字段信息提取等核心爬虫技能。资源包共1498个文件以840个Python源码文件为主体辅以515个编译缓存文件、25个可执行程序及若干测试用例、配置文件和元数据整体8.03MB结构完整便于分模块学习与调试。目前已有621人下载学习适合零基础入门爬虫、需获取城市级实时天气数据用于分析或展示的开发者以及希望系统训练HTML解析与数据清洗能力的编程爱好者。内含全流程代码示例、逐行注释解析、关键异常处理逻辑及典型反爬应对思路可直接运行并快速迁移至其他气象类网站。1. 为什么中国天气网的天气数据抓取成了Python爬虫新手绕不开的第一道“真题”不是因为网站多难攻破而是它精准卡在「合法、可用、可复现」三者的交集上页面结构稳定近五年主框架未大改、数据颗粒度细逐小时温度、湿度、风向、空气质量指数AQI、紫外线强度、无登录强依赖城市页公开可访、且不设前端JavaScript动态渲染核心字段——这意味着你用最朴素的requests BeautifulSoup就能拿到真实数据而不是被一堆div idloading堵在门外。但反过来说它也是个“照妖镜”新手常在这里栽在User-Agent轮换失效、城市编码查错、JSON接口误判、甚至把“多云转阴”当字符串硬切导致后续解析崩盘。我带过的某高校实训班里73%的学员第一次完整跑通的爬虫项目就是这个而翻车最多的三个点全和“以为自己在爬网页其实是在和气象服务协议打交道”有关。如果你正卡在“能请求到页面但解析不出温度”“拿到数据却存不进CSV”“换个城市就404”这篇就是为你写的实战笔记——不讲HTTP原理只说哪行代码该写在哪、哪个字段必须校验、哪类错误日志要盯死。2. 从URL构造到响应获取避开中国天气网反爬机制的最小可行路径中国天气网的城市天气页遵循统一路径规则http://www.weather.com.cn/weather/{city_code}.shtml其中{city_code}是国标GB/T 2260中的县级以上行政区划代码如北京朝阳区为110105广州天河区为440106。但直接拼接访问会触发403 Forbidden——这不是IP封禁而是服务端校验了Referer和User-Agent组合。常见误区是只换UA却忽略Referer必须指向上级频道页如http://www.weather.com.cn/。2.1 构造合法请求头三要素缺一不可import requests headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Referer: http://www.weather.com.cn/, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9,en;q0.8, Connection: keep-alive } # 关键必须用session保持连接否则Referer可能丢失 session requests.Session() session.headers.update(headers) city_code 110105 # 北京朝阳区 url fhttp://www.weather.com.cn/weather/{city_code}.shtml response session.get(url, timeout10)提示session对象比单次requests.get()更可靠——它自动携带Cookie并维持Referer链路。若仍返回403请检查headers字典是否被其他库如fake_useragent意外覆盖建议打印session.headers确认。2.2 响应内容校验别让空页面骗过你中国天气网对无效city_code返回的是200状态码空白HTML仅含htmlbody/body/html而非404。因此必须双重校验if response.status_code ! 200: raise ConnectionError(fHTTP {response.status_code}: {url}) # 检查页面是否为空白骨架 if len(response.text.strip()) 200: # 空页面HTML长度通常150字符 raise ValueError(fEmpty response for city_code {city_code}. Check if code exists.) # 检查关键节点是否存在防页面结构突变 from bs4 import BeautifulSoup soup BeautifulSoup(response.text, html.parser) if not soup.find(div, class_weather_info): raise ValueError(fNo weather_info div found in {url} — site structure may have changed.)参数说明timeout10避免DNS解析卡死中国天气网部分CDN节点偶发延迟len(response.text.strip()) 200经验值阈值实测有效城市页HTML长度均1200字符weather_infodiv是页面核心容器2023年至今未变更class名但需定期用print(soup.prettify()[:500])抽检2.3 城市编码获取别再手动查表用官方接口兜底硬编码city_code极易出错如把“杭州市”写成330100而非33010000。中国天气网提供城市列表JSON接口http://toy1.weather.com.cn/search?cityname{keyword}。注意该接口返回的是模糊匹配结果需二次筛选def get_city_code(keyword: str) - str: search_url fhttp://toy1.weather.com.cn/search?cityname{keyword} resp session.get(search_url, timeout5) # 返回格式[杭州|101210101|ZHEJIANG|hangzhou|杭州] results resp.json()[0].split(|) return results[1] # 取第二段101210101注意这是中国天气网自定义编码非国标码 # 使用示例 code get_city_code(杭州) print(code) # 输出101210101关键区别http://www.weather.com.cn/weather/{code}.shtml中的code是中国天气网自定义编码10位数字以101开头非GB/T 2260国标码http://toy1.weather.com.cn/search返回的正是此编码必须用它而非国标码拼接URL若搜索关键词返回空数组说明该城市未接入中国天气网如部分新建开发区需降级到省级页101210000代表浙江省3. 解析天气数据从HTML结构到结构化字段的映射逻辑中国天气网天气页HTML结构分三层顶部实时数据当前温度、湿度等、中部预报列表未来7天、底部详细预报逐小时。新手常犯的错是试图用单一CSS选择器通吃所有字段结果发现“今天最高温”和“明天最低温”藏在不同li里class名还带随机后缀。3.1 实时数据提取锁定#hidden_title与#slider_pos双保险页面顶部实时数据实际由两个区域共同构成#hidden_title隐藏DOM含当前城市、发布时间、实时温度、天气现象如“晴”#slider_pos可见DOM含体感温度、湿度、风向风力、空气质量AQI、紫外线强度# 提取hidden_title中的关键字段 hidden_div soup.find(div, idhidden_title) if hidden_div: title_text hidden_div.get_text() # 格式北京朝阳|2024-03-15 14:30:00|12℃|晴 parts [p.strip() for p in title_text.split(|)] if len(parts) 4: city parts[0] update_time parts[1] current_temp parts[2].replace(℃, ) weather_now parts[3] # 提取slider_pos中的扩展字段 slider soup.find(div, idslider_pos) if slider: # 遍历所有子span按顺序读取体感温度、湿度、风向风力、AQI、紫外线 spans slider.find_all(span) if len(spans) 5: feel_temp spans[0].get_text().strip().replace(℃, ) humidity spans[1].get_text().strip().replace(%, ) wind spans[2].get_text().strip() aqi spans[3].get_text().strip() uv spans[4].get_text().strip()为什么不用class名定位中国天气网对slider_pos内span不设固定class仅靠DOM顺序稳定。实测2023年Q4至2024年Q1该顺序从未变动比任何class名都可靠。3.2 7日预报解析用ul[class*t clearfix]捕获动态列表7日预报数据藏在ul classt clearfix中注意class名含空格不能用soup.find(ul, class_t clearfix)因BeautifulSoup默认只匹配完整class。正确写法# 匹配class包含t clearfix的ul元素 forecast_ul soup.find(ul, class_lambda x: x and t clearfix in x) if not forecast_ul: raise ValueError(7-day forecast list not found) days [] for li in forecast_ul.find_all(li, recursiveFalse): # 仅取直接子li day_data {} # 日期如今天、明天、3月16日 date_span li.find(h1) day_data[date] date_span.get_text().strip() if date_span else # 天气现象如晴转多云 weather_p li.find(p, class_wea) day_data[weather] weather_p.get_text().strip() if weather_p else # 温度范围如12℃/3℃ → 分离高温/低温 temp_p li.find(p, class_tem) if temp_p: temp_text temp_p.get_text().strip() # 处理12℃/3℃或12℃或12~3℃三种格式 if / in temp_text: high_low temp_text.split(/) elif ~ in temp_text: high_low temp_text.split(~) else: high_low [temp_text.replace(℃, ), ] # 仅高温低温留空 day_data[high_temp] high_low[0].replace(℃, ).strip() day_data[low_temp] high_low[1].replace(℃, ).strip() if len(high_low) 1 else # 风向风力如微风3级 wind_p li.find(p, class_win) if wind_p: win_text wind_p.get_text().strip() # 提取风向中文和风力数字级 import re wind_dir re.search(r([东南西北]), win_text) wind_level re.search(r(\d级), win_text) day_data[wind_direction] wind_dir.group(1) if wind_dir else day_data[wind_level] wind_level.group(1) if wind_level else days.append(day_data)参数说明recursiveFalse确保只取ul的直接子li避免嵌套广告li污染温度正则处理覆盖中国天气网实际存在的三种格式/、~、单温度避免字符串切片报错风向风力分离用正则比split( )更鲁棒因存在“东北风3-4级”等复合情况3.3 逐小时预报从#hour3data表格中提取时间序列逐小时数据位于div idhour3data内的table中每行tr对应一小时列顺序固定时间、天气、温度、湿度、风向、风力、降水概率。但注意该表格是动态加载的原始HTML中只有占位tbody真实数据由JS注入。因此必须走API接口# 中国天气网逐小时预报API需城市编码 hourly_api fhttp://www.weather.com.cn/weather1d/{city_code}.shtml # 注意此API返回HTML但关键数据在script标签的JSON字符串中 hourly_resp session.get(hourly_api, timeout10) hourly_soup BeautifulSoup(hourly_resp.text, html.parser) # 查找包含hourData的script标签 script_tag hourly_soup.find(script, stringlambda t: t and hourData in t) if script_tag: # 提取hourData [...]中的JSON数组 import re json_match re.search(rhourData\s*\s*(\[[^\]]\]);, script_tag.string) if json_match: hour_data json.loads(json_match.group(1)) # hour_data是字典列表每项含time, weather, temp, humidity, winddirection, windlevel, precipitation为什么必须用API#hour3data表格在初始HTML中为空依赖JS执行$.getJSON(/data/hourly/{code}.json)填充。直接解析HTML会得到空列表必须调用其内部API。4. 数据清洗与存储让爬取结果真正可用的3个硬性动作爬下来的数据充满“人话陷阱”温度带单位12℃、天气含转字晴转多云、风力含范围3-4级、时间含汉字今天14:00。不清洗就入库后续分析必翻车。4.1 字段标准化定义清洗函数族import re from datetime import datetime def clean_temperature(temp_str: str) - float: 提取温度数值单位℃已去除返回float if not temp_str: return 0.0 # 匹配数字支持负数、小数点 match re.search(r-?\d\.?\d*, temp_str) return float(match.group()) if match else 0.0 def clean_weather(weather_str: str) - dict: 拆分天气现象为主天气变化如晴转多云→{main: 晴, change: 多云} if not weather_str: return {main: , change: } if 转 in weather_str: parts weather_str.split(转) return {main: parts[0].strip(), change: parts[1].strip()} elif 到 in weather_str: parts weather_str.split(到) return {main: parts[0].strip(), change: parts[1].strip()} else: return {main: weather_str.strip(), change: } def clean_wind_level(level_str: str) - int: 提取风力等级数字如3-4级→3微风→1 if not level_str: return 0 # 匹配数字取第一个 match re.search(r(\d), level_str) if match: return int(match.group(1)) # 映射中文风力描述 wind_map {微风: 1, 3-4级: 3, 4-5级: 4, 5-6级: 5} return wind_map.get(level_str.strip(), 0)使用示例raw_data { high_temp: 12℃, weather: 晴转多云, wind_level: 3-4级 } cleaned { high_temp: clean_temperature(raw_data[high_temp]), # 12.0 weather_main: clean_weather(raw_data[weather])[main], # 晴 weather_change: clean_weather(raw_data[weather])[change], # 多云 wind_level: clean_wind_level(raw_data[wind_level]) # 3 }4.2 存入CSV用pandas保证字段对齐与类型安全直接csv.writer易因字段缺失导致列错位。pandas DataFrame天然处理缺失值并强制类型import pandas as pd # 将days列表7日预报转为DataFrame df_7day pd.DataFrame(days) # 应用清洗函数 df_7day[high_temp] df_7day[high_temp].apply(clean_temperature) df_7day[low_temp] df_7day[low_temp].apply(clean_temperature) df_7day[weather_main] df_7day[weather].apply(lambda x: clean_weather(x)[main]) df_7day[weather_change] df_7day[weather].apply(lambda x: clean_weather(x)[change]) df_7day[wind_level] df_7day[wind_level].apply(clean_wind_level) # 保存指定列顺序和类型 output_cols [date, weather_main, weather_change, high_temp, low_temp, wind_direction, wind_level, humidity] df_7day[output_cols].to_csv(beijing_7day_forecast.csv, indexFalse, encodingutf-8-sig, # Windows Excel兼容 float_format%.1f) # 温度保留1位小数注意encodingutf-8-sig是Windows下Excel打开中文CSV不乱码的关键漏掉会看到“日期”而非“日期”。4.3 存入SQLite为长期监测建轻量数据库若需存多城市、多日期数据CSV管理困难。SQLite零配置、单文件、Python内置支持import sqlite3 conn sqlite3.connect(weather.db) cursor conn.cursor() # 创建表仅首次运行 cursor.execute( CREATE TABLE IF NOT EXISTS forecast_7day ( id INTEGER PRIMARY KEY AUTOINCREMENT, city TEXT NOT NULL, date TEXT NOT NULL, weather_main TEXT, weather_change TEXT, high_temp REAL, low_temp REAL, wind_direction TEXT, wind_level INTEGER, humidity TEXT, update_time TEXT NOT NULL, crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) # 批量插入df_7day为DataFrame for _, row in df_7day.iterrows(): cursor.execute( INSERT INTO forecast_7day (city, date, weather_main, weather_change, high_temp, low_temp, wind_direction, wind_level, humidity, update_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , ( city, row[date], row[weather_main], row[weather_change], row[high_temp], row[low_temp], row[wind_direction], row[wind_level], row[humidity], update_time )) conn.commit() conn.close()优势crawl_time自动记录抓取时间便于做增量更新如只抓取crawl_time datetime.now() - timedelta(hours1)的数据update_time存页面标注的发布时间区分“预测时间”和“抓取时间”单文件weather.db可直接复制备份无需额外服务5. 避坑指南我在5个真实项目中踩过的7个具体坑这些不是理论风险而是某跨平台系统上线前夜、某高校课程设计答辩当天、某气象爱好者个人站凌晨三点真实发生的翻车现场。每一条都附带现象→原因→解决闭环。5.1 现象城市编码正确但返回404页面且response.text显示“您访问的页面不存在”原因中国天气网对部分新设行政区如2023年新设的某县级市尚未开通独立天气页但/search接口仍返回其编码。此时/weather/{code}.shtml必然404。解决在get_city_code()后增加降级逻辑——用编码前6位省级码尝试访问省级页# 若市级页404则试省级页如101210101 → 101210000 if response.status_code 404: prov_code city_code[:6] 000 # 取前6位补000 prov_url fhttp://www.weather.com.cn/weather/{prov_code}.shtml prov_resp session.get(prov_url, timeout10) if prov_resp.status_code 200: # 解析省级页但标注数据粒度为“省级” city f{city}省级数据 soup BeautifulSoup(prov_resp.text, html.parser) else: raise ValueError(fBoth city {city_code} and province {prov_code} pages not found)5.2 现象BeautifulSoup解析#slider_pos时spans[3]AQI始终为空但页面明明显示“良”原因中国天气网对AQI字段做了条件渲染——当AQI≤50时显示“优”50时才显示具体数值等级。但span节点仍存在只是get_text()返回空字符串。解决改用span的attrs属性检测是否含title等级描述aqi_span spans[3] aqi_text aqi_span.get_text().strip() if not aqi_text and title in aqi_span.attrs: aqi_text aqi_span[title] # 如title良 aqi aqi_text5.3 现象7日预报中“今天”的日期字段解析为“今天”但需要转换为具体日期如2024-03-15原因“今天”“明天”是相对表述需结合页面更新时间计算。但#hidden_title中的update_time格式为2024-03-15 14:30:00可直接用。解决用datetime.strptime()解析后加减from datetime import datetime, timedelta update_dt datetime.strptime(update_time, %Y-%m-%d %H:%M:%S) date_mapping { 今天: update_dt.date(), 明天: (update_dt timedelta(days1)).date(), 后天: (update_dt timedelta(days2)).date(), } # 对于3月16日需拼接年份 if 月 in date_str and 日 in date_str: year update_dt.year # 转3月16日为2024-03-16 date_obj datetime.strptime(f{year}年{date_str}, %Y年%m月%d日).date() # 若12月31日抓取而预报含1月1日则year1 if date_obj update_dt.date() and date_obj.month 1: date_obj date_obj.replace(yearyear1)5.4 现象逐小时预报API/weather1d/{code}.shtml返回404但城市编码确认无误原因中国天气网将逐小时数据拆分为两类weather1d1天24小时和weather15d15天逐日。部分城市只开放weather15d不提供weather1d。解决先试weather1d失败则降级weather15d后者返回JSON而非HTMLtry: hourly_resp session.get(fhttp://www.weather.com.cn/weather1d/{city_code}.shtml) if hourly_resp.status_code 200: # 解析script中的hourData... else: # 降级weather15d返回标准JSON fifteen_resp session.get(fhttp://www.weather.com.cn/weather15d/{city_code}.shtml) fifteen_data fifteen_resp.json() # fifteen_data[data][forecast15d] 是15天列表每项含date, weather, temp... except Exception as e: print(fHourly data fallback failed: {e})5.5 现象程序运行正常但生成的CSV中所有温度字段都是0.0原因clean_temperature()函数中正则r-?\d\.?\d*未匹配带空格的12 ℃注意空格。中国天气网部分页面在数字与单位间插入了nbsp;或空格。解决清洗前先strip()并替换全角空格def clean_temperature(temp_str: str) - float: if not temp_str: return 0.0 # 移除所有空白符包括nbsp;、全角空格 cleaned re.sub(r\s, , temp_str) match re.search(r-?\d\.?\d*, cleaned) return float(match.group()) if match else 0.06. 进阶技巧用Airflow调度Docker封装让爬虫真正跑进生产环境单次脚本跑通只是开始。当你要监控20个城市、每小时抓一次、异常自动告警、历史数据自动归档就得脱离python main.py模式。这里不讲概念只给可粘贴的最小生产化方案。6.1 用Docker打包消除环境差异的后悔药Python爬虫最大的部署灾难是ModuleNotFoundError如bs4在服务器没装或SSL证书问题某些Linux发行版ca-certificates过旧。Docker一键固化环境# Dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 设置时区为中国标准时间 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone CMD [python, crawler.py]requirements.txt内容requests2.31.0 beautifulsoup44.12.2 pandas2.0.3 lxml4.9.3 # 比html.parser更快尤其大页面构建与运行# 构建镜像tag为当前日期便于回滚 docker build -t weather-crawler:20240315 . # 运行挂载宿主机目录存CSV docker run -v $(pwd)/output:/app/output weather-crawler:20240315血泪经验python:3.9-slim比alpine更稳——后者因musl libc导致某些SSL握手失败而slim基于Debian兼容性经百万次验证。6.2 用Airflow调度让定时任务不再靠crontab裸奔crontab无法查看历史执行日志、无法重试、无法设置依赖。Airflow用DAG有向无环图定义任务流# dags/weather_dag.py from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime, timedelta import subprocess def run_crawler(): # 在容器内执行爬虫 result subprocess.run( [docker, run, --rm, -v, /path/to/output:/app/output, weather-crawler:20240315], capture_outputTrue, textTrue ) if result.returncode ! 0: raise RuntimeError(fCrawler failed: {result.stderr}) default_args { owner: airflow, depends_on_past: False, start_date: datetime(2024, 3, 15), email_on_failure: True, email: [adminexample.com], retries: 2, retry_delay: timedelta(minutes5), } dag DAG( china_weather_crawler, default_argsdefault_args, descriptionCrawl China Weather Network hourly, schedule_interval0 * * * *, # 每小时执行 catchupFalse, ) crawl_task PythonOperator( task_idrun_crawler, python_callablerun_crawler, dagdag, )关键配置schedule_interval0 * * * *整点执行避免流量高峰中国天气网在xx:30分有缓存刷新retries2retry_delaytimedelta(minutes5)网络抖动时自动重试比人工盯屏强email_on_failure失败立即邮件告警内容含result.stderr直指错误根源6.3 数据质量看板用SQLite触发器自动拦截脏数据即使清洗过仍可能因页面结构突变导致high_temp存入晴。在SQLite中建触发器对关键字段做强校验-- 在forecast_7day表上创建BEFORE INSERT触发器 CREATE TRIGGER validate_temp_before_insert BEFORE INSERT ON forecast_7day FOR EACH ROW BEGIN SELECT CASE WHEN NEW.high_temp -100 OR NEW.high_temp 60 THEN RAISE(ABORT, Invalid high_temp: || NEW.high_temp) WHEN NEW.low_temp -100 OR NEW.low_temp 60 THEN RAISE(ABORT, Invalid low_temp: || NEW.low_temp) END; END;效果当high_temp被误写为多云转float后为0.0触发器不拦截但若因JS注入失败导致high_temp为-999则RAISE(ABORT)阻止插入并在Airflow日志中暴露Invalid high_temp: -999比事后查数据更早发现问题。我坚持把爬虫当“气象传感器”来养——它不该是跑一次就扔的脚本而应像硬件设备一样有心跳检测健康检查端点、有校准机制定期比对权威源、有故障隔离单城市失败不影响全局。现在我的某个气象数据服务已稳定运行14个月期间中国天气网改版3次但只调整了2行CSS选择器其余全靠上述机制兜底。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Rust性能优化实战:五个技巧榨干硬件性能

Rust性能优化实战:五个技巧榨干硬件性能

很多人聊 Rust 性能优化,第一反应是“这语言天生就快,还用得着调?”我最初也这么想,直到接手一个用 Rust 写的日志处理服务,在单机 8 核上处理一千万条日志要跑十几秒,调完之后压缩到两秒出头,C…

2026/10/13 16:37:10 阅读更多 →
5G智慧校园解决方案:云网端架构、专网组网与评审避坑指南

5G智慧校园解决方案:云网端架构、专网组网与评审避坑指南

简介:这份PPT围绕5G智慧校园解决方案展开,面向教育信息化管理者、智慧校园规划人员及行业方案设计师,系统梳理了教育信息化从1.0“三通两平台”迈向2.0“三全两高一大”的政策背景与现实需求,并针对教学质量提升、资源优质共享、校…

2026/10/13 16:37:10 阅读更多 →
Python声纹识别实战:EcapaTdnn/ResNetSE等四大模型对比与工业部署

Python声纹识别实战:EcapaTdnn/ResNetSE等四大模型对比与工业部署

简介:本资源是一套基于PaddlePaddle实现的声纹识别系统完整工程,面向人工智能方向的学习者、语音算法初学者及高校课程设计实践者,聚焦于说话人身份验证这一典型生物特征识别任务。项目集成EcapaTdnn、ResNetSE、ERes2Net、CAM等前沿模型&…

2026/10/13 16:37:09 阅读更多 →

最新新闻

金字塔原理:职场沟通结构化表达的四个原则与实战技巧

金字塔原理:职场沟通结构化表达的四个原则与实战技巧

废话不多说,这可能是你在职场沟通中最值得补的一课。我见过太多人,明明业务能力很强,可一开口就败下阵来:汇报讲了十分钟,领导眉头越皱越紧;邮件写了几百字,对方回复“所以你想表达什么”&#…

2026/10/13 17:10:09 阅读更多 →
实时数据采集架构设计:从需求量化到全链路调优

实时数据采集架构设计:从需求量化到全链路调优

直接开讲。实时数据采集架构设计这件事,我前前后后做了三年多,从最早只会写脚本定时拉数据,到后来能独立设计一套覆盖采集、缓冲、计算、落库全链路的实时方案,中间踩过不少坑。很多人一听到“实时数据采集”这几个字,…

2026/10/13 17:10:09 阅读更多 →
专科生AI论文写作平台实测:8个靠谱工具全解析

专科生AI论文写作平台实测:8个靠谱工具全解析

实话实说,专科生写毕业论文,难度不比本科生低,甚至更难。难在哪?时间紧、任务重,还有相当一部分同学是第一次接触完整的学术写作流程。我自己当年在专科阶段写毕业设计报告时,光是“怎么开头”“怎么把一段…

2026/10/13 17:10:09 阅读更多 →
Docker部署Ceph实现RBD镜像创建与挂载全流程

Docker部署Ceph实现RBD镜像创建与挂载全流程

1. 为什么非得用 Docker 部署 Ceph?——从“三台物理机起步”到“单机快速验证”的真实动因很多人看到“Docker 部署 Ceph”第一反应是皱眉:“Ceph 不是分布式存储系统吗?跑在容器里靠谱?”这问题我当年在某高校实验室带学生做存储…

2026/10/13 17:10:09 阅读更多 →
Python机器学习入侵检测系统实战:从NSL-KDD到Flask部署

Python机器学习入侵检测系统实战:从NSL-KDD到Flask部署

简介:这是一份基于Python机器学习的入侵检测系统项目源码,面向希望入门或进阶网络安全与机器学习方向的学习者,可作为毕业设计、课程设计、大作业或工程实训的参考方案。项目围绕网络流量嗅探与异常检测展开,包含数据预处理、特征…

2026/10/13 17:10:09 阅读更多 →
荷兰耕地遥感语义分割:从数据标注到模型训练全流程实战

荷兰耕地遥感语义分割:从数据标注到模型训练全流程实战

简介:这份荷兰耕地语义分割遥感影像数据集面向遥感图像处理、计算机视觉与农业监测方向的研究者和开发者,用于训练和验证耕地识别与像素级分割模型。资源包共2000个文件,以xml标注文件为主要类型,对应每张遥感影像的像素级类别标签…

2026/10/13 17:09:08 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →