尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python多组学大数据挖掘完整工作流:从差异分析到论文整理
做生信这些年我越来越觉得Python这门语言看起来谁都能上手写两笔可真要把多组学大数据掘出点东西来坑全藏在细节里。转录组、蛋白组、代谢组单看每一层都有人做过一旦想跨组学找关联数据量上来之后脚本写得不讲究内存直接爆掉分析结果五花八门最后写论文的时候又找不回当时哪个参数跑出来的图这个我太有体会了。这篇文章不是从零教Python语法也不是给你贴官方文档而是聊一聊我自己从数据下载、清洗、差异分析、富集分析到多组学整合再到论文图表整理这一整套已经跑顺的工作流。里面包含了我的脚本习惯、工具选型理由、踩过的坑以及一些“当时要是有人告诉我该多好”的细节。适合已经会点Python基础、准备或正在做多组学项目的研究生和科研助理也适合想把手头分析流程规范化的从业者参考。1. 多组学大数据挖掘到底在做什么1.1 千万别把“跑通脚本”当成“做完分析”很多新手拿到转录组或者蛋白组数据下载完读进来跑一个差异表达画出火山图和热图就以为分析结束了。实际上这只是万里长征的第一步。多组学分析和单组学最大的区别在于你要处理的不是一个表达矩阵而是几个甚至十几个来自不同实验平台、不同数据格式、不同生物学层次的矩阵。它们之间既有各自的噪声又存在真实的生物学关联如何把这些层次串起来讲出一个完整的故事才是深度挖掘的核心。我早期的做法很原始每个组学单独分析然后把结果放在同一个Excel不同sheet里写到论文里也是各写各的。后来审稿人问“转录组和蛋白组趋势不一致怎么解释”我当场就卡住了。因为我没有做关联分析根本没有数据支撑去回答这个问题。从那之后我才意识到所谓“整合”不是最后拼在一起而是从数据预处理阶段就要设计好分析路径。所以你现在要做的第一件事不是急着写代码而是先画出整个项目的“分析地图”。比如你手上有转录组和代谢组那你要想清楚是打算用转录组解释代谢物变化的上游调控还是用代谢组验证转录组下游的功能改变。这个逻辑关系决定了后面所有代码怎么写、结果怎么解释。1.2 从单组学思维转向系统层面的关联思维单组学分析有很多成熟的R包而Python在机器学习、网络构建、文本挖掘这些方面优势更明显。多组学整合恰恰需要大量的矩阵运算、降维聚类、相关性计算和网络分析这是Python的强项。所以我的主分析语言是Python只有在个别R包实在绕不开的时候比如某些特定的富集分析工具才会通过rpy2或者把中间结果导出让R处理。说到数据分析我的核心思想是“先降维再关联”。多组学数据的变量数通常远超样本数你直接去算两个组学矩阵的相关系数结果会非常不可靠。我先用PCA、t-SNE或者UMAP看样本的整体分布确认批次效应和分组情况然后再做后续分析。这一步能避免很多“假阳性关联”尤其是当你样本量不大的时候。另外我强烈建议你建立自己的“多组学知识文件”。很多人学了无数教程但真到用时还是满世界搜代码。我现在会把常用的分析模块、参数含义、输出格式、踩坑记录全部整理成一个个Markdown文件和代码脚本放同一个项目目录下。这样每次接到新项目直接复制模板改参数效率提升非常明显。后面我会详细说这个项目目录怎么搭。2. Python生态的选型与部署2.1 环境管理别再用全局Python裸跑了先说一下最基础但百分之八十的人都会忽视的问题Python环境。我以前图省事所有项目共用一套Anaconda结果就是今天这个项目要pandas 1.5明天那个项目要pandas 2.0一升级全乱套。后来还出现过因为numpy版本变了某天早上起来跑之前好好的脚本直接报错的情况。从那以后我所有的项目都强制使用虚拟环境一个项目一个环境环境里用requirements.txt或者environment.yml锁定版本。多组学项目我建议你直接用conda创建环境因为很多生物信息相关库通过conda安装比pip省心得多比如bedtools、samtools这类C写的工具conda会自动帮你处理底层依赖。创建一个新环境的命令很简单conda create -n multiomics python3.11 conda activate multiomics进环境之后再按需安装分析库。我常用的组合是pandas、numpy、scipy、scikit-learn、statsmodels、matplotlib、seaborn、plotly、networkx、biopython。这些库用pip安装基本没问题。如果你要用到scanpy单细胞、metpy代谢组通路这类专门工具建议去各自的官方文档看推荐安装方式有些需要先装特定版本的依赖。关于Python版本我现在统一用3.11。有几个早期的分析库还停留在Python 3.8时代的写法但大多数已经兼容了。如果你有老脚本要跑创建环境时指定老版本Python就行不需要迁就全部项目。2.2 核心计算库别每种都学但要明白怎么选很多人一上来就想把所有库学个遍dataframe、numpy、scipy、scikit-learn、pytorch…… 结果每个都只懂皮毛。贪多嚼不烂我的标准就一套pandas负责数据读取、清洗、整理和基础分组计算numpy负责底层数组运算和数学函数scipy提供统计检验和距离矩阵计算scikit-learn负责聚类、降维、特征筛选和常见机器学习模型statsmodels做线性回归、方差分析和更正式的统计建模matplotlib和seaborn负责出版级图表plotly做交互式网页图表方便自己先检查数据networkx做基因调控网络、共表达网络的可视化和拓扑分析。这套组合覆盖了我在多组学项目中九成以上的需求。深度学习模型比如用卷积网络做基因组序列特征识别我偶尔会用PyTorch但那是另一个话题不在日常分析主线里。有一点一定要说清楚pandas虽然好用但它不是大数据计算引擎。当你处理的是几个GB的表达矩阵或者全基因组甲基化数据时pandas会吃得你内存飙升。这个时候需要做一些特殊处理后面我会专门讲在大数据场景下的性能优化。现在先按常规流程走。3. 深度挖掘的标准流程与关键代码片段3.1 数据清洗与预处理读进来说第一件事不是质检拿到多组学数据后我通常先统一基因ID或者代谢物名称。转录组用的是Ensembl ID或Symbol蛋白组可能也用它但代谢组通常是HMDB ID或者KEGG ID甚至有些平台给的是自己的一套编号。要整合第一步就得把ID映射统一否则后面没法对齐。我举个例子转录组和蛋白组有时候会存在一个基因对应多个蛋白亚型的情况这时候你要决定是取最大值、平均值还是保留主亚型。没有统一规矩具体取决于你的生物学问题。如果你关注的是蛋白质功能可能取主要转录本对应的蛋白更合理如果你只想看整体的表达变化趋势取平均值会更平滑。在ID转换这一步我经常用mygene.info的Python接口做批处理映射效率非常高。下面是一个简化的代码示例把Symbol转成Ensembl IDimport mygene mg mygene.MyGeneInfo() genes [TP53, BRCA1, EGFR, MTOR] res mg.querymany(genes, scopessymbol, fieldsensembl.gene, specieshuman) for item in res: if ensembl in item: print(item[query], item[ensembl][gene])数据清洗还有一个大坑是缺失值。不同组学数据缺失的机制不一样不能一概而论。转录组里零表达可能是真的没表达也可能是测序深度不够没检测到代谢组里缺失值更多是因为检测限的问题。所以我会看数据情况决定填充策略低表达基因用“过滤”的方式直接去掉代谢物缺失用最小值填充或者用KNN算法估但不能用全局平均值填充——这会直接破坏数据的分布特征。至于样本层面的质量控制我习惯做一个“三看”一看测序深度或者总强度的分布是否异常二看PCA图或者层级聚类是否有离群样本三看样本间相关性是不是符合实验设计。如果发现某个样本跟所有其他样本都离得很远我会去看原始记录找找是实验问题还是分析问题。这一步偷懒的话后面所有结果都可能是假的。3.2 差异分析与富集分析统计检验不是只跑一次就行差异表达分析是整个流程里“看起来最简单、实际上最容易错”的环节。很多人直接拿ttest或者Wilcoxon跑一遍筛出p值小于0.05的基因就收工。这么做最大的问题是没有正确处理多重假设检验——你测了两万个基因哪怕一个都没有差异纯靠随机也会有一千个基因p值小于0.05。所以我很少用原始p值筛选一般会先做多重检验校正控制FDR错误发现率。Python里statsmodels提供了现成的函数from statsmodels.stats.multitest import multipletests padj multipletests(pvals, methodfdr_bh)[1]但仅仅这样还不够。实际项目中我还会设置一个|log2FC|的最小阈值比如大于1也就是表达量翻倍或减半这是为了排除那种统计学显著但生物学上没啥意义的微小变化。审稿人现在普遍吃这一套你也应该在方法部分写清楚筛选标准。富集分析我一般用gseapy这个库它支持GO、KEGG和多种基因集而且能跑GSEA基因集富集分析比传统的超几何分布检验更能利用表达排序信息。GSEA这个方法的思路很巧妙不设阈值筛选差异基因而是把全部基因按表达变化程度排序再看每个已知功能基因集在排序两端是否显著富集。它对那些“单基因变化不显著但整个通路一致上调”的情况非常敏感特别适合多组学数据这种效应量普遍偏小的场景。import gseapy as gp pre_res gp.prerank(rnkrnk_file.rnk, gene_setsKEGG_2021_Human, min_size5, max_size1000, permutation_num1000)我通常会同时跑ORA超几何分布富集和GSEA两种前者看“有哪些通路被我筛出的差异基因富集了”后者看“哪些通路的基因整体表达趋同”。两个结果交叉印证的分析结论在写论文时会更有底气。3.3 多组学整合先算相关性还是先做聚类多组学整合分析有两种常见的切入方式一种是以“组学对”为核心做相关性分析另一种是先把所有组学数据拼接成一个联合矩阵再做聚类或因子分析。两种我都用过各有适用场景。如果你只有两组学数据比如转录组和蛋白组你想看“基因表达和蛋白表达是否一致”那就直接做相关性分析。但要注意这里的相关计算不能只看Pearson相关系数一个数字我强烈建议你画一张散点图矩阵并且标注每个点的基因名。转录组-蛋白组相关性普遍不高很多时候R只在0.3到0.5之间但这本身就是生物学故事转录后调控、翻译效率、蛋白降解速率都会让mRNA和蛋白丰度解偶联。审稿人看到低相关性不会觉得你分析做得差反而期待你解释背后的机制。如果是三组学以上转录组蛋白组代谢组或者样本量特别大我会先把每个组学分别做标准化然后拼接成一个“宽表”再做多因子分析。Python里有个库叫scikit-learn的FactorAnalysis或者你可以用MOFAMulti-Omics Factor Analysis这个专门做多组学因子分解的工具它有Python版本mofapy2不过安装起来稍微有点麻烦。MOFA的核心思想是找出少数几个“因子”每个因子能解释多个组学中共享或者特有的变异来源这样就能把几十万个特征压缩成几个因子每个因子对应一个生物学过程后续可以跟临床指标或者表型关联。下面这段代码是我经常会用到的一个“数据规范对齐”模板核心是把多个表达矩阵按照基因名对齐到同一个索引上def align_matrices(expr_dict, howinner): common_index None for name, df in expr_dict.items(): if common_index is None: common_index set(df.index) else: common_index common_index.intersection(df.index) common_index sorted(common_index) aligned {} for name, df in expr_dict.items(): aligned[name] df.loc[common_index] return aligned你看看这么一个简单的函数就能避免后面因为索引顺序不一致导致的悄悄错位。我在早期做整合时犯过这个错——两个矩阵的样本ID虽然一样但顺序不一样直接用pandas相加结果全是错位的。那次的教训让我养成了“凡是合并数据必须显式set_index再merge”的习惯。4. 大数据场景下的性能与内存优化4.1 内存爆掉不是机器不行是你处理方式不对多组学数据动辄几个GB我早期用的分析服务器内存有128G本来觉得顶天了结果处理全基因组的甲基化数据时直接OutOfMemory。后来我明白了问题不在于总内存不够而在于你的代码在某一瞬间申请了一个太大且不必要的中介对象。最常见的坑是用pandas读大文件时没有任何节制。默认情况下pandas会把CSV文件全部加载进内存而且会自作主张地把重复的字符串转成category或者推断类型。有些表达式矩阵里的数字都是整数你却明明知道后面要转float算log2。正确的做法是先看一眼文件大小和列数再指定dtype。比如import pandas as pd df pd.read_csv(big_matrix.csv, sep\t, index_col0, dtypenp.float32)指定dtype为float32而不是默认的float64能让内存占用直接砍半。同时如果某一列有很多重复分类值把它转成category类型可以大幅压缩内存。还有很多人不知道read_csv有个usecols参数你可以只读需要的列根本不用把全部列拉到内存里。如果数据确实太大比如几十GB那就别硬扛。我会先把数据转成HDF5或者Parquet格式这两个格式支持按列读取、压缩存储读取速度比CSV快一个数量级。# 读入后储存为parquet格式 df.to_parquet(expression.parquet, compressionzstd) # 使用时直接读回 df pd.read_parquet(expression.parquet)4.2 向量化计算和并行处理把循环扔掉另外一个大坑是你是不是还在写for循环去逐行处理数据。Python的for循环性能天生就慢处理十万行时没什么感觉处理百万行、千万行时就是灾难。我见过太多人用for循环一行一行去计算某个基因在各样本中的均值或p值本来一个groupby就能解决的事。向量化操作的核心思想是“对数组整体操作”尽可能利用底层的C循环而不是Python循环。举个例子你要对表达矩阵每一行做z-score标准化一个高效的写法是from scipy.stats import zscore df_zscore df.apply(zscore, axis1)这个写法底层是C语言实现的处理几万个基因几乎瞬间完成。比你自己写for循环fast 50倍以上。如果确实需要遍历很多东西比如要对一千个基因分别做线性回归那我会用joblib的Parallel来处理from joblib import Parallel, delayed def fit_gene(gene_name, expr_df, meta_df): # 拟合基因表达与表型的回归模型 return gene_name, coef, pvalue results Parallel(n_jobs8)( delayed(fit_gene)(gene, expr_df, meta_df) for gene in gene_list )我现在的建议是脚本里尽量减少显式for循环。凡是对DataFrame整列进行某种函数运算优先查pandas有没有现成的方法凡是涉及矩阵乘法、矩阵分解优先用numpy或者scikit-learn封装好的接口这些接口底层都调用了BLAS/LAPACK效率远超手写循环。5. 论文整理拯救投稿前狂找文件的你5.1 搭建一个能复现的项目目录花两小时省两天说实话论文整理这个事很多课题组根本没当回事全凭个人记性。我读博的时候经常发生的是分析做完两个星期想回头补一张图结果发现当时跑的脚本在哪个文件夹都找不到或者图表的配色跟正文不统一又要重新调。后来我花了一个下午的时间设计了一套自己的项目文件组织法从此再也不慌了。一个标准项目目录长这样project_name/ ├── 00_raw_data/ # 原始数据永远不修改 ├── 01_scripts/ # 所有分析脚本 ├── 02_cleaned_data/ # 中间结果 ├── 03_results/ # 分析结果表格 ├── 04_figures/ # 所有图表 │ ├── main_figs/ # 正文图 │ └── supp_figs/ # 补充图 ├── 05_reports/ # 分析报告和笔记 ├── environment.yml # 环境文件 └── README.md # 项目说明核心原则就一条原始数据只读不写中间结果可再生成最终图表统一出口。这样无论是投出去之后审稿人要求补充分析还是半年后写毕业论文要重新调用都能快速定位。有一次我帮师弟复现他半年前的结果他用了这个目录结构我们两个人当晚就把所有图表的参数、脚本和数据路径全部核对清楚了。还有一个很容易被忽略的细节就是脚本命名。我习惯用“数字序号功能描述”的方式比如“01_preprocess_expression.py”、“02_differential_analysis.py”这样在文件管理器里排序时自然而然就是分析顺序。后期还可以用snakemake或者nextflow这类流程管理工具把各个步骤串成流水线实现完全的自动化。这个建议主要针对长期维护的项目一次性分析就不用这么重了。5.2 图表输出从“能看”到“能投稿”很多期刊的投稿要求里写得很清楚图片分辨率不低于300 dpi推荐TIFF或PDF矢量图。但实际操作时很多人到了投稿前才想起来调dpi结果重新渲染一遍图字体、配色又全不对了。我的做法是最开始在matplotlib里就设置好统一风格。注意保存时的几个关键参数import matplotlib.pyplot as plt plt.rcParams.update({ figure.dpi: 150, savefig.dpi: 300, font.size: 8, axes.titlesize: 9, axes.labelsize: 9, xtick.labelsize: 7, ytick.labelsize: 7, legend.fontsize: 7, font.family: Arial, axes.spines.top: False, axes.spines.right: False, }) fig, ax plt.subplots(figsize(3.5, 2.5)) # ... 绘图代码 fig.savefig(volcano.pdf, formatpdf, bbox_inchestight)这里有个细节你可能没注意不同期刊对字体有要求很多要求Arial或者Helvetica。如果你在matplotlib里没设置font.family默认字体是DejaVu Sans虽然也不是不能投但很多期刊编辑会打回来要求统一字体。与其到时候返工不如一开始就调好。另外图和表一定要分开管理。正文里提到的每张图编号、标题、图例说明、对应的数据和脚本我都在05_reports里维护一份“图表登记表”用Markdown写清楚。这样写paper时照着登记表往外拿图就行不但省时间还能避免图表编号混乱。5.3 可重复性别让任何一步成为“黑箱”论文可重复性这个话题现在越来越受重视很多高分期刊已经开始要求作者提交分析代码和中间数据。你别等到投稿前才准备。我的经验是两条第一代码里所有文件路径必须用相对路径不要用/home/xxx/...这种绝对路径否则别人拿到你的代码根本跑不了第二分析过程中的种子seed要固定包括随机数、降维算法的初始化参数等。如果你做过PCA或者聚类你就知道不固定seed的话同一个脚本不同时间运行聚类结果可能略有不同这在投稿上是致命的。第三步是把核心分析结果自动生成一个HTML报告。我通常用jupyter notebook的转换功能或者自己用markdownrender拼接。这一步看起来麻烦但真到了写论文的时候你只需要打开这个报告把关键结果往文字稿里填效率至少提升一倍。我在做多组学项目时还会额外建一个“conclusion.md”记录每次分析后的生物学发现和下一步计划很多论文里讨论部分的素材都是从这种笔记里抠出来的。6. 常见问题与排查技巧实录6.1 数据处理高频报错与对策速查我把自己和周围朋友常遇到的报错整理成了一个速查表每次报错对号入座就行常见现象真正原因解决方案pandas读入大文件内存爆掉默认dtype占内存过多指定dtype、只读需要的列、转Parquetmerge后行数翻倍关联键有重复值先检查key是否唯一按需求取去重策略相关系数矩阵全是NaN有缺失值或零方差行先过滤低表达/零方差特征再算相关PCA图样本分不开没有去除批次效应用ComBat或者限定高变基因再试GSEA运行报错gene_sets名称不对或用错库检查gseapy版本对应的数据库名先跑内置测试保存图文字乱码中文字体设置问题统一用Arial或者指定中文字体路径这些坑我每一个都亲身踩过。尤其是merge之后行数翻倍这个当时查了一晚上最后发现是一个样本ID在metadata里重复了两次导致一对多关联。现在我做merge之前一定会先检查key的唯一性一条代码就避免了这个隐患assert df.index.is_unique, Index has duplicates!6.2 多组学项目经验从项目设计到投稿的几个建议最后再分享几个我自己项目经验的总结。第一在正式做大规模分析之前先用小样本子集试跑一遍全流程确认每一步的输入输出都对接得上再上全量数据。这个“试运行”机制能节省无数时间尤其当你有一个百G级别的数据要处理时一个报错可能让之前几个小时的计算白费。第二注意保存中间结果。很多人喜欢一条流水线从头跑到尾中间结果全在内存里一旦后面某一步出问题所有东西都要重跑。我现在每跑完一个关键步骤就把中间结果存成parquet或者csv虽然多占点硬盘但心理踏实。第三如果多个项目并行进行记住项目编号要唯一所有脚本和输出文件名里加上项目编号。我试过同时做三个课题有一个月差点把两个项目的样本名搞混后来强制规定所有文件名里带项目编号再没出过这种乱子。第四别只依赖一种数据库。做富集分析时GO和KEGG只是入门不妨再试试Reactome、WikiPathways、MSigDB这些。不同数据库覆盖的功能通路不完全一样有些通路只在特定数据库里有。我在一个免疫相关的课题里用Reactome找到了一个T细胞共刺激信号通路这是GO和KEGG都没有注释到的审稿人对这个发现很感兴趣。回到我开头说的那件事Python在多组学分析里的角色不是一门语言而是一条把数据、统计、可视化和论文写作串联起来的流水线。我花了很多年才明白真正提升科研效率的不是会用某个最新模型而是把整个流程的每个环节都打磨得足够可靠和顺手。你现在看到的这些习惯每一个背后都是踩坑换来的。如果你也是刚开始接触多组学分析建议你先别急着上深度学习方法先把表达矩阵、差异分析、富集分析和相关性分析这套基本功打扎实。遇到报错的时候先读错误信息再想数据结构最后才去网上搜答案。多问自己一句“为什么报错”比直接复制别人代码有意义得多。
RELATED

相关推荐

企业级Monorepo样式规范落地:Stylelint配置与避坑指南

企业级Monorepo样式规范落地:Stylelint配置与避坑指南

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

📅 2026/9/20 2:54:10
解决Cursor“Taking longer than expected”提示的六个实用步骤

解决Cursor“Taking longer than expected”提示的六个实用步骤

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

📅 2026/9/20 2:54:10
macOS 录屏软件 QuickRecorder 使用指南:6 种模式 3 步上手

macOS 录屏软件 QuickRecorder 使用指南:6 种模式 3 步上手

macOS 录屏软件 QuickRecorder 使用指南:6 种模式 3 步上手 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHu…

📅 2026/9/20 2:49:08
MORE NEWS

更多资讯

📰

LibreChat:智能体操作系统与MCP协议实战指南

1. LibreChat不是另一个ChatGPT前端,而是智能体协作的操作系统雏形你点开LibreChat官网,看到熟悉的对话界面,第一反应可能是:“哦,又一个开源版ChatGPT UI?”——我去年也这么想,直到在内部测试…

📰

多模型API聚合网关实战:统一接入、模型路由与容灾策略

我自己在黑客松和各类限时开发赛里泡了几年,最深的感受是:真正让人焦虑的不是想不出点子,而是Demo要上场了,模型还在报错。每次换一家模型服务商,就要重新读一遍文档、重新调一次鉴权、重新适配一遍参数格式&#xff0…

📰

OpenResearch工作流:用版本控制与可复现环境重构研究过程

这两年我在多个研究项目里反复折腾“OpenResearch”这套思路,越用越觉得它不像一个简单的工具或平台,更像是一整套重新组织“研究过程”的方法论。简单说,它把文献管理、实验记录、数据分析、论文写作、版本管理全部拆开,再通过开…

📰

DeepSeek Harness 会话持久化身份绑定:JSONL 存储的 id/cwd 校验与修复前拒绝机制

DeepSeek Harness 会话持久化身份绑定:JSONL 存储的 id/cwd 校验与修复前拒绝机制 【免费下载链接】deepseek-harness DeepSeek Harness: Everything is a Plugin. 项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness 导读:本文围绕 …

📰

Agent Skills实战:跨境电商多平台订单自动化工作流搭建指南

最近圈子里好几个人都在问 Agent Skills 到底怎么落地,尤其是多平台场景下怎么用。这词儿听起来高大上,其实拆开看就是“给智能体配上可复用的技能包”,让它在不同平台之间干活,彻底解放双手。我完整跑通了一套跨境电商多平台订单…

📰

GetQzonehistory:3 步把 QQ 空间历史说说完整导出到本地

GetQzonehistory:3 步把 QQ 空间历史说说完整导出到本地 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 翻手机时看到一张大学时拍的照片,想回 QQ 空间找它当时配…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬