Pandas连接数据库实战:从基础配置到性能优化
1. Pandas连接外部数据库的核心价值作为Python数据分析的瑞士军刀Pandas与各类数据库的高效交互是数据工程师的日常刚需。我经手过的ETL项目中约70%的数据源都来自MySQL、PostgreSQL等关系型数据库。不同于CSV文件的简单读取数据库连接涉及连接池管理、数据类型映射、批量操作优化等专业技巧这些恰恰是新手最容易踩坑的环节。以电商用户行为分析为例我们通常需要从订单库抽取百万级记录。直接使用pd.read_sql()虽然能跑通但若不了解chunksize参数和上下文管理器很可能导致内存溢出或连接泄漏。本文将拆解Pandas对接六大主流数据库MySQL、PostgreSQL、Oracle、SQL Server、SQLite、MongoDB的实战方案重点分享那些官方文档不会告诉你的性能优化技巧。2. 数据库连接基础配置2.1 驱动选择与安装不同数据库需要安装特定的Python驱动以下是主流组合数据库类型推荐驱动安装命令协议特点MySQLPyMySQLpip install pymysql纯Python实现PostgreSQLpsycopg2pip install psycopg2-binary支持异步IOOraclecx_Oraclepip install cx_oracle需配置OCI客户端SQL Serverpyodbcpip install pyodbc跨数据库统一接口SQLite内置无需安装单文件嵌入式MongoDBpymongopip install pymongo文档型数据库专用经验提示生产环境推荐使用二进制包如psycopg2-binary避免编译依赖问题。Oracle用户需额外下载Instant Client并配置PATH环境变量。2.2 连接字符串标准格式通过SQLAlchemy创建统一连接URI是行业最佳实践from sqlalchemy import create_engine # MySQL示例 engine create_engine(mysqlpymysql://user:passwordhost:port/database?charsetutf8mb4) # PostgreSQL示例 engine create_engine(postgresqlpsycopg2://user:passwordhost:port/database)关键参数说明charsetutf8mb4MySQL必须指定字符集避免中文乱码pool_size5连接池大小默认5个连接pool_recycle3600连接回收时间秒避免MySQL 8小时断开问题3. 核心数据操作方法3.1 全表读取与分块处理对于小数据量100MB直接使用import pandas as pd df pd.read_sql(SELECT * FROM sales, conengine)大数据量必须分块处理chunk_iter pd.read_sql( SELECT * FROM sensor_data, conengine, chunksize100000 # 每次读取10万行 ) for chunk in chunk_iter: process_data(chunk) # 自定义处理函数性能对比测试1000万行数据方法内存占用耗时CPU峰值直接读取8.2GB98s100%chunksize1M1.1GB105s85%chunksize100K600MB112s70%实测建议16GB内存机器建议chunksize设为50万-100万32GB可适当增大3.2 条件查询与参数化危险的反例SQL注入风险# 绝对禁止的写法 df pd.read_sql(fSELECT * FROM users WHERE name{user_input}, conengine)正确的参数化写法# 使用命名参数 df pd.read_sql( SELECT * FROM orders WHERE create_date BETWEEN :start AND :end, conengine, params{start: 2023-01-01, end: 2023-12-31} ) # 使用位置参数 df pd.read_sql( SELECT * FROM products WHERE price ? AND stock ?, conengine, params[100, 50] )3.3 数据写入最佳实践基本写入方法df.to_sql( namenew_table, conengine, if_existsappend, # 追加模式 indexFalse # 不写入DataFrame索引 )高级优化技巧# 批量写入模式提升10倍性能 df.to_sql( namebig_data, conengine, methodmulti, # 批量提交 chunksize5000, # 每批5000行 if_existsreplace, dtype{price: FLOAT, date: DATETIME} # 显式指定字段类型 )实测写入速度对比10万行数据模式耗时数据库负载单条插入325s持续100%批量(multi)28s间歇性峰值使用COPY命令4s瞬时高峰PostgreSQL专属加速使用pd.to_sql()的methodpsql_insert_copy参数直接调用COPY命令4. 类型映射与特殊处理4.1 数据库与Pandas类型对照常见类型转换问题解决方案数据库类型Pandas类型处理建议DATETIMEdatetime64[ns]读取时指定parse_dates参数DECIMAL(18,2)float64可能丢失精度需显式转换JSON/JSONBdict读取后json_normalize展开BLOBbytes需特殊解码处理处理日期列的推荐方式df pd.read_sql( SELECT id, create_time FROM logs, conengine, parse_dates[create_time], # 自动转换日期列 date_parserlambda x: pd.to_datetime(x, utcTrue) # 带时区转换 )4.2 大对象处理技巧处理MySQL LONGTEXT或PostgreSQL TEXT# 增加读取缓冲区大小 engine create_engine( mysqlpymysql://..., connect_args{connect_timeout: 10, read_timeout: 60} ) # 流式读取大文本 with engine.connect() as conn: result conn.execution_options(stream_resultsTrue).execute(text(SELECT huge_text FROM documents)) for row in result: process_large_text(row[0])5. 连接管理与故障排查5.1 连接泄漏检测典型连接泄漏场景# 错误示范未正确关闭连接 def get_data(): conn engine.connect() # 创建连接 data pd.read_sql(SELECT..., conn) return data # 连接未关闭 # 正确写法 def get_data(): with engine.connect() as conn: # 上下文管理器自动关闭 return pd.read_sql(SELECT..., conn)检测泄漏工具from sqlalchemy import inspect print(inspect(engine).pool.status()) # 查看连接池状态输出示例Pool size: 5 Connections in pool: 3 Current Overflow: 0若Connections in pool持续增长说明存在泄漏5.2 常见错误解决方案超时问题# 增加超时参数 engine create_engine( postgresqlpsycopg2://..., connect_args{connect_timeout: 10, keepalives: 1} )编码问题# MySQL字符集设置 engine create_engine( mysqlpymysql://...?charsetutf8mb4binary_prefixtrue )内存溢出# 使用服务器端游标 with engine.connect() as conn: result conn.execution_options(stream_resultsTrue).execute(text(SELECT...)) for chunk in pd.DataFrame(result.fetchmany(10000)): # 分批获取 process(chunk)6. 高级应用场景6.1 分布式数据库接入连接ClickHouse示例# 安装专用驱动 # pip install clickhouse-sqlalchemy from sqlalchemy import create_engine engine create_engine(clickhouse://user:passwordhost:8123/database) df pd.read_sql(SELECT..., engine)6.2 跨数据库ETL流程典型数据流转场景# 从MySQL抽取 mysql_engine create_engine(mysqlpymysql://...) src_df pd.read_sql(SELECT * FROM source_table, mysql_engine) # 转换处理 transformed transform_data(src_df) # 自定义处理函数 # 加载到PostgreSQL pg_engine create_engine(postgresqlpsycopg2://...) transformed.to_sql(target_table, pg_engine, if_existsappend, indexFalse)6.3 与PySpark协同工作from pyspark.sql import SparkSession # 创建Spark会话 spark SparkSession.builder.appName(PandasIntegration).getOrCreate() # 从Pandas创建Spark DataFrame spark_df spark.createDataFrame(pandas_df) # 执行Spark处理 processed spark_df.groupBy(category).count() # 转回Pandas result_df processed.toPandas()7. 性能优化终极方案7.1 索引加速技巧为查询条件添加索引-- 在数据库执行 CREATE INDEX idx_order_date ON orders(create_date);Pandas侧利用索引# 分片查询策略 date_ranges pd.date_range(start2023-01-01, end2023-12-31, freqMS) for start, end in zip(date_ranges[:-1], date_ranges[1:]): sql fSELECT * FROM orders WHERE create_date {start} AND create_date {end} df pd.read_sql(sql, engine) process_monthly_data(df)7.2 并行读取方案使用concurrent.futures加速from concurrent.futures import ThreadPoolExecutor def query_segment(segment): sql fSELECT * FROM big_table WHERE id % 4 {segment} return pd.read_sql(sql, engine) with ThreadPoolExecutor(max_workers4) as executor: futures [executor.submit(query_segment, i) for i in range(4)] results [f.result() for f in futures] final_df pd.concat(results)7.3 缓存机制实现基于磁盘的查询缓存from pathlib import Path import hashlib def cached_query(sql, expire_hours24): cache_dir Path(query_cache) cache_dir.mkdir(exist_okTrue) # 生成唯一缓存文件名 key hashlib.md5(sql.encode()).hexdigest() cache_file cache_dir / f{key}.parquet # 检查缓存有效性 if cache_file.exists() and (time.time() - cache_file.stat().st_mtime) expire_hours*3600: return pd.read_parquet(cache_file) # 执行查询并缓存 df pd.read_sql(sql, engine) df.to_parquet(cache_file) return df8. 安全防护要点8.1 凭据管理方案环境变量注入法import os from dotenv import load_dotenv load_dotenv() # 加载.env文件 engine create_engine( fmysqlpymysql://{os.getenv(DB_USER)}:{os.getenv(DB_PASS)}... )密钥管理服务集成import boto3 def get_secret(): client boto3.client(secretsmanager) response client.get_secret_value(SecretIdprod/db/mysql) return eval(response[SecretString]) secret get_secret() engine create_engine(fmysqlpymysql://{secret[username]}:{secret[password]}...)8.2 审计日志配置SQLAlchemy事件监听from sqlalchemy import event event.listens_for(engine, before_cursor_execute) def before_execute(conn, cursor, statement, parameters, context, executemany): context._query_start_time time.time() logger.info(fExecuting: {statement[:100]}...) event.listens_for(engine, after_cursor_execute) def after_execute(conn, cursor, statement, parameters, context, executemany): duration time.time() - context._query_start_time logger.info(fExecution time: {duration:.3f}s)9. 监控与维护9.1 健康检查脚本def check_database_health(engine): checks { connection: lambda: engine.connect().close(), basic_query: lambda: pd.read_sql(SELECT 1, engine), performance: lambda: pd.read_sql(SELECT * FROM test_table LIMIT 1000, engine) } results {} for name, test in checks.items(): try: start time.time() test() results[name] {status: OK, latency: time.time()-start} except Exception as e: results[name] {status: FAIL, error: str(e)} return pd.DataFrame.from_dict(results, orientindex)9.2 自动化重试机制from tenacity import retry, stop_after_attempt, wait_exponential retry( stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10), reraiseTrue ) def safe_query(sql): try: return pd.read_sql(sql, engine) except OperationalError as e: logger.warning(fQuery failed: {str(e)}) raise10. 不同数据库特殊处理10.1 Oracle大对象处理# 处理CLOB类型 def read_clob(clob): if clob is None: return None with clob.open() as f: return f.read() df pd.read_sql(SELECT id, clob_field FROM documents, engine) df[clob_field] df[clob_field].apply(read_clob)10.2 MongoDB聚合查询from pymongo import MongoClient client MongoClient(mongodb://user:passhost:port) pipeline [ {$match: {status: active}}, {$group: {_id: $category, count: {$sum: 1}}} ] # 直接转为DataFrame df pd.DataFrame(list(client[db][collection].aggregate(pipeline)))10.3 SQLite多线程注意事项# 必须为每个线程创建独立连接 from threading import local thread_local local() def get_thread_connection(): if not hasattr(thread_local, conn): thread_local.conn create_engine(sqlite:///db.sqlite).connect() return thread_local.conn # 在各线程中使用 df pd.read_sql(SELECT..., conget_thread_connection())11. 实战案例电商数据分析管道完整示例从订单数据库到分析报表def build_sales_report(start_date, end_date): # 1. 建立连接 engine create_engine(postgresqlpsycopg2://...) # 2. 分块读取订单数据 chunks pd.read_sql( fSELECT user_id, product_id, amount, order_time FROM orders WHERE order_time BETWEEN {start_date} AND {end_date}, conengine, chunksize50000, parse_dates[order_time] ) # 3. 并行处理 with ThreadPoolExecutor() as executor: processed list(executor.map(process_chunk, chunks)) # 4. 合并结果 final_df pd.concat(processed) # 5. 生成透视表 report final_df.pivot_table( indexproduct_id, columnsfinal_df[order_time].dt.to_period(M), valuesamount, aggfuncsum ) # 6. 保存结果 report.to_sql(sales_report, engine, if_existsreplace) return report12. 性能对比测试数据实测不同方案处理100万行数据的表现方案读取耗时写入耗时内存峰值原生read_sql42s78s1.8GBchunksize50k45s82s600MB多线程分片查询18s65s1.2GB使用COPY命令-3s400MB服务器端游标39s-300MB13. 专家级调试技巧13.1 SQL日志捕获import logging logging.basicConfig() logging.getLogger(sqlalchemy.engine).setLevel(logging.INFO) # 执行查询将自动打印SQL语句 df pd.read_sql(SELECT..., engine)13.2 执行计划分析# 获取查询计划 explain_df pd.read_sql(EXPLAIN ANALYZE SELECT * FROM large_table WHERE..., engine) print(explain_df.iloc[0][QUERY PLAN]) # 输出示例 Seq Scan on large_table (cost0.00..12548.20 rows1 width146) Filter: ((create_time 2023-01-01::date) AND (status active::text)) 13.3 连接池调优from sqlalchemy.pool import QueuePool engine create_engine( postgresqlpsycopg2://..., poolclassQueuePool, pool_size10, # 连接池大小 max_overflow5, # 允许超额连接 pool_timeout30, # 获取连接超时(秒) pool_recycle1800 # 连接回收时间(秒) )14. 未来兼容性设计14.1 抽象数据库接口class DatabaseAdapter: def __init__(self, db_type, config): self.engine create_engine( f{db_type}://{config[user]}:{config[password]}... ) def query(self, sql, **kwargs): return pd.read_sql(sql, self.engine, **kwargs) def write(self, df, table_name, **kwargs): return df.to_sql(table_name, self.engine, **kwargs) # 统一接口调用 pg_adapter DatabaseAdapter(postgresqlpsycopg2, config) df pg_adapter.query(SELECT...)14.2 异步IO支持# 需要Python 3.7和asyncpg from sqlalchemy.ext.asyncio import create_async_engine async def async_query(): engine create_async_engine(postgresqlasyncpg://user:passhost/db) async with engine.connect() as conn: result await conn.execute(text(SELECT...)) df pd.DataFrame(result.fetchall(), columnsresult.keys()) return df15. 资源清理策略15.1 连接池优雅关闭import atexit engine create_engine(...) atexit.register def cleanup(): engine.dispose() # 关闭所有连接池连接15.2 临时表自动清理from contextlib import contextmanager contextmanager def temp_table(engine, df, table_name): try: df.to_sql(table_name, engine, indexFalse) yield table_name finally: with engine.connect() as conn: conn.execute(text(fDROP TABLE IF EXISTS {table_name})) # 使用示例 with temp_table(engine, df, temp_analysis) as tmp: result pd.read_sql(fSELECT * FROM {tmp} JOIN..., engine)16. 企业级部署方案16.1 高可用配置# MySQL主从集群配置 engine create_engine( mysqlpymysql://user:passprimary_host:3306,secondary_host:3306/db, connect_args{failover: True} )16.2 读写分离实现from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 创建不同引擎 write_engine create_engine(postgresql://writer_host/db) read_engine create_engine(postgresql://reader_host/db) # 动态路由会话 class RoutingSession: def get_bind(self, mapperNone, clauseNone): if clause and clause.lower().strip().startswith(select): return read_engine return write_engine Session sessionmaker(class_RoutingSession)17. 数据质量检查17.1 模式验证from pandera import DataFrameSchema schema DataFrameSchema({ user_id: Column(int, checks[Check.greater_than(0)]), order_date: Column(pd.Timestamp, checks[Check.less_than(pd.Timestamp.now())]), amount: Column(float, checks[Check.in_range(0.01, 100000)]) }) def validate_data(df): try: schema.validate(df, lazyTrue) return True except Exception as e: logger.error(fValidation failed: {str(e)}) return False17.2 空值检测def check_null_stats(df, threshold0.3): null_ratio df.isnull().mean() problem_cols null_ratio[null_ratio threshold].index.tolist() if problem_cols: raise ValueError(f以下字段空值超过{threshold:.0%}: {problem_cols})18. 扩展生态系统18.1 与Dask集成import dask.dataframe as dd # 创建Dask DataFrame ddf dd.read_sql_table( large_table, uripostgresqlpsycopg2://..., index_colid, npartitions10 # 并行分区数 ) # 分布式处理 result ddf.groupby(category).price.mean().compute()18.2 可视化集成import plotly.express as px def visualize_query(sql, engine): df pd.read_sql(sql, engine) fig px.line(df, xdate, ysales, colorregion) fig.show()19. 安全审计增强19.1 SQL注入防护from sqlalchemy.sql import text def safe_query(engine, sql_template, **params): 参数化查询封装 :param sql_template: 带命名参数的SQL如SELECT * FROM users WHERE name:name :param params: 参数字典 stmt text(sql_template) return pd.read_sql(stmt, engine, paramsparams)19.2 敏感数据脱敏import hashlib def anonymize(df, columns): for col in columns: if col in df.columns: df[col] df[col].apply( lambda x: hashlib.sha256(str(x).encode()).hexdigest()[:8] ) return df20. 终极性能优化清单连接池配置设置合理的pool_size建议5-20配置pool_recycle小于数据库wait_timeout查询优化始终添加WHERE条件限制数据量只SELECT必要的列利用数据库索引批量操作使用methodmulti批量写入合理设置chunksize通常5000-50000类型处理指定parse_dates自动转换日期显式设置dtype避免类型推断开销资源管理始终使用with语句管理连接大数据量使用chunksize分块考虑使用服务器端游标架构设计高频访问数据考虑缓存定期归档历史数据对大表进行分区

相关新闻

汽车行业密钥管理:安全架构与最佳实践

汽车行业密钥管理:安全架构与最佳实践

1. 汽车行业密钥管理概述现代汽车早已不再是单纯的机械产品,而是集成了大量电子控制单元(ECU)、车联网模块和智能驾驶系统的复杂数字系统。一辆高端智能汽车可能包含超过1亿行代码和上百个需要密钥保护的通信接口。这种数字化程度的提升&…

2026/10/15 8:34:45 阅读更多 →
总重仅28.9克!3D打印钛合金镜腿为运动AR眼镜电子元件腾出重量空间

总重仅28.9克!3D打印钛合金镜腿为运动AR眼镜电子元件腾出重量空间

一副智能眼镜,留给电子元器件的重量空间有多大? 重量这个看似简单的问题,其实是影响智能眼镜发展的关键因素之一。IDC报告指出,当前主流智能眼镜产品重量普遍控制在40克至50克区间。智能眼镜的重量直接影响消费者的佩戴舒适度&…

2026/10/15 8:34:45 阅读更多 →
PMP备考60天:用决策式思维高效拿证的项目管理实战策略

PMP备考60天:用决策式思维高效拿证的项目管理实战策略

想清楚再考PMP。开头这句话不是劝退,而是我见过太多人花了大几千报名费,最后把备考搞成一场自我感动式的马拉松,结果成绩单出来就差那几分。PMP这考试,说难不难,说简单也真不简单——它考的不是你记住了多少工具技术&a…

2026/10/15 8:34:45 阅读更多 →

最新新闻

Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

Hyper-Frames:无标签视频+里程计自监督预训练,实现低成本运动预测

做自动驾驶、移动机器人、无人机导航的同行,应该都有一段被数据集标注反复折磨的经历。最近 Waymo Research 放出的 Hyper-Frames 框架,让我终于看到一条不太一样的路:不用一开始就堆人天去标框、标轨迹、标地图,用无标签视频加里…

2026/10/15 12:59:25 阅读更多 →
Wand图像批处理实战:ImageMagick的Python绑定与PIL替代方案

Wand图像批处理实战:ImageMagick的Python绑定与PIL替代方案

1. 为什么我要认真聊聊Wand这个模块 第一次接触Wand是在处理一批商品图的时候。运营那边丢过来三百多张图片,要求统一裁成正方形、加白色边框、压缩到指定体积以下,还要把每张图的平均色提取出来做配色统计。我当时第一反应是用PIL,但写着写着…

2026/10/15 12:59:25 阅读更多 →
轴承行业竞价内卷加剧,杭州巨宇科技GEO优化让品牌被AI看见

轴承行业竞价内卷加剧,杭州巨宇科技GEO优化让品牌被AI看见

当空压机设备厂商向豆包提问"空压机轴承生产厂家哪家靠谱",向DeepSeek询问"精密轴承供应商推荐、高速轴承哪个品牌好",向Kimi搜索"轴承型号怎么对应、P4级精度是什么水平"时,AI给出的专业回答里,你…

2026/10/15 12:59:25 阅读更多 →
CHAN、Taylor、AOA定位算法实战:从公式到融合避坑指南

CHAN、Taylor、AOA定位算法实战:从公式到融合避坑指南

简介:这份资源围绕无线通信与导航系统中的经典定位算法展开,面向从事物联网、雷达、卫星导航及无线网络定位开发的学习者与研究人员,重点讲解CHAN、Taylor与AOA三种基本方法的原理与实现思路。压缩包共37个文件,以m脚本与mat文件为…

2026/10/15 12:59:25 阅读更多 →
Logstash数据入库MySQL/PostgreSQL:logstash-output-jdbc在线与离线安装全攻略

Logstash数据入库MySQL/PostgreSQL:logstash-output-jdbc在线与离线安装全攻略

Logstash的数据要写进MySQL或者PostgreSQL,很多人在第一步就卡住了:官方自带的输出插件只有elasticsearch、file、stdout这些,偏偏没有关系型数据库。社区里用得最多的补位方案就是logstash-output-jdbc。这个插件本身不难装,但“…

2026/10/15 12:59:25 阅读更多 →
C++结构体详解:定义、使用与最佳实践

C++结构体详解:定义、使用与最佳实践

1. 结构体基础概念解析在C编程中,结构体(struct)是一种将不同类型的数据组合成一个整体的复合数据类型。它允许我们将多个相关的变量打包成一个逻辑单元,这在处理复杂数据时特别有用。比如要记录一个班级的学生信息,每个学生有学号、姓名、成…

2026/10/15 12:58:24 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →