测序文件原始数据下载

fastq,SRR等数据下载

fastq download

1. 背景

美国国立生物技术信息中心(National Center for BiotechnologyInformation),即我们所熟知的NCBI是由美国国立卫生研究院(NIH)于1988年创办。创办NCBI的初衷是为了给分子生物学家提供一个信息储存和处理的系统。

除了建有GenBank核酸序列数据库(该数据库的数据资源来自全球几大DNA数据库,其中包括日本DNA数据库DDBJ、欧洲分子生物学实验室数据库EMBL以及其它几个知名科研机构)之外,NCBI还可以提供众多功能强大的数据检索与分析工具。目前,NCBI提供的资源有Entrez、Entrez Programming Utilities、MyNCBI、PubMed、PubMed Central、EntrezGene、NCBI Taxonomy Browser、BLAST、BLAST Link (BLink)、ElectronicPCR等共计36种功能.

NCBI

NCBI

上述的界面主要包含下面的部分

  • 下拉列表,可以查询相对应的数据库
  • 输入关键词进行相关检索
  • 资源库导航栏,位于左侧未知,点击后可查看资源库涵盖的数据库
  • 数据提交、下载、分析工具和帮助指南等

1.1 GEO数据库

GEO数据库全称Gene Expression Omnibus database,是由美国国立生物技术信息中心NCBI创建并维护的基因表达数据库。

它创建于2000年,收录了世界各国研究机构提交的高通量基因表达数据,也就是说只要是目前已经发表的论文,论文中涉及到的基因表达检测的数据都可以通过这个数据库中找到。

Tip

数据库中的数据都是免费的!

GEO

GEO

NCBI 官网选择GEO database进行搜索或者在GEO官网上进行搜索,跳转到数据库界面GEO进行检索

1.2 GEO数据类型

在下载数据之前需要了解GEO数据库的存放类型

  • GSE数据编号(Series)
  • GPL数据编号(GEO platforms)
  • GSM数据编号(Samples)
  • GDS数据编号(Datasets)

一篇文章可以有一个或者多个GSE(Series)数据集

一个GSE里面可以有一个或者多个GSM(Samples)样本,而每个数据集都有着自己对应的芯片平台,就是GPL(GEO platforms)。

GSE编号一般为作者提交时生成的原始数据编号,后续NCBI中的工作人员会根据研究目的、样品类型等信息归纳整合为一个GDS(Datasets),整理后的数据还会有GEO profile数据

2. ASCP下载

ASCP是用来大数据下载的神器,但是无法下载,下面记录了一部分,等解决了再补充

如果已经获取到 SRR 号,我们还可以通过脚本直接下载对应的数据,无需访问 EBI 网站以获取链接。


ascp -v -QT -l 300m -P33001 -k 1 -i /home/erwin/micromamba/envs/SC/etc/asperaweb_id_dsa.openssh era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR113/062/SRR11396162/SRR11396162_1.fastq.gz .

2.1 问题排查

Tip
  1. 问题排除

将命令行输入到bash之后,不报错也不进行下载

  1. 第一步

先确定是否网址是正确的


curl -I https://ftp.sra.ebi.ac.uk/vol1/fastq/SRR113/062/SRR11396162/SRR11396162_1.fastq.gz

返回的结果是

HTTP/1.1 200 OK 
Date: Fri, 05 Dec 2025 14:06:36 GMT 
Server: Apache 
Last-Modified: Sat, 27 Jun 2020 20:05:36 GMT 
ETag: "1434079ea-5a916594ac400" 
Accept-Ranges: bytes 
Content-Length: 5423266282 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET,OPTIONS 
Access-Control-Allow-Headers: Authorization,Origin,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Accept Content-Type: application/x-gzip
  1. 第二步

ascp不下载,不是文件或路径问题,基本上是处在Aspera通道本身

nc -zv fasp.sra.ebi.ac.uk 33001

Connection to fasp.sra.ebi.ac.uk 33001 port [tcp/*] succeeded! 提示连接成功

  1. 第三步

修改文件之后也无法进行下载,可能ascp已经被放弃使用了,考虑别的方向

2.2 ASCP更新4.20.0

ascp更新到4.20.0进行尝试

  1. 第一步 创建全新的环境之后进行安装,避免不必要的冲突

#安装asper
mamba install -c conda-forge -c bioconda asper-cli=4.20.0

# 寻找路径
which ascli
  1. 第二步

下载sdk


# 下载
wget https://production-transfer-sdk.s3.us-west-2.amazonaws.com/1.1.2/linux-amd64-1.1.2-753f662.tar.gz

# 解压
tar -zxvf linux-amd64-1.1.2-753f662.tar.gz

# 安装 ascp,注意:命令需在与linux-amd64-1.1.2-753f662.tar.gz文件同级目录下运行
ascli config ascp install --sdk-url=file:///linux-amd64-1.1.2-753f662.tar.gz

# 寻找 ascp 路径
ascli config ascp show
# /path/to/your/ascp
  1. 第三步

寻找密钥

在下载的路径中寻找新版的密钥


# 找到秘钥,主要使用pem
find $HOME -name aspera_bypass_dsa.pem

# 下载
ascp -QT -l 300m -P33001 -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh anonftp@ftp.ncbi.nlm.nih.gov:/sra/sra instant/reads/ByRun/sra/SRR/SRR123/SRR1234567/SRR1234567.sra .

最终找不到密钥更换本地下载,有博文说可以更换原来的密钥,但是尝试了也无反应

2.3 本地安装

aspera-cli 是一个由 Ruby 编写的命令行工具,它提供了一个统一的接口 (ascli) 来与 IBM Aspera 传输平台进行交互。

ascli 和 ascp 之间的关系是 上层工具和底层核心协议执行程序 的关系。简单来说,所有的 Aspera 高速文件传输最终都是由 ascp(或其继任者 ascp4)执行的,而 ascli 是一个更高级、更智能的命令行前端,用于简化和自动化复杂的传输任务,尤其是与 Aspera 平台产品(如 Aspera on Cloud, Faspex 等)交互时。

按照ascli的教程安装

  1. 第一步

更换镜像源,国外连接的太慢了

gem sources --remove https://rubygems.org/

# 更换china
gem sources -a https://gems.ruby-china.com/

# 检验
gem sources -l

# 安装
sudo gem install aspera-cli
Note

网络限制导致Ruby 无法下载和更新,新版的ascp-cli需要Ruby > 3.1,原始安装的版本太低,最终放弃此方法

3. Kingfisher下载

kingfisher是一款专门用于高通量测序数据下载的工具。支持从公共数据库(ENA、NCBI、SRA、Amazon AWS 和 Google Cloud)获取序列文件及其元数据注释。

  1. 第一步.

使用conda 或者mamba 进行kingfisher进行


mamba install -c conda-forge -c bioconda kingfisher
  1. 第二步.

选择合适的平台去合理的下载

Method 描述 (Description) 速度 (Speed) 格式 (Format) 工具依赖 (Tool Dependency) 账户/费用 (Account/Cost)
ena-ascp 通过 Aspera (FASP) 协议从 ENA 下载预先生成的 .fastq.gz 文件 最快(利用 Aspera 高速传输) .fastq.gz aspera-cli (ascp)
ena-ftp 通过 cURL 或类似工具从 ENA 下载预先生成的 .fastq.gz 文件 较快(无需 fasterq-dump) .fastq.gz curl 或 wget
prefetch 使用 NCBI 的 prefetch 下载 .SRA 文件,然后用 fasterq-dump 提取 FASTQ 中等(需额外 fasterq-dump 步骤) .SRA prefetch, fasterq-dump
aws-http 使用 aria2c (多线程 HTTP) 从 AWS Open Data 下载 .SRA 文件,然后用 fasterq-dump 提取 中等(需额外 fasterq-dump 步骤) .SRA aria2c, fasterq-dump 通常无
aws-cp 使用 aws s3 cp 从 AWS Open Data 下载 .SRA 文件,然后用 fasterq-dump 提取 中等(需额外 fasterq-dump 步骤) .SRA aws-cli, fasterq-dump 通常不需要支付费用或 AWS 账户
gcp-cp 使用 Google Cloud gsutil 下载 .SRA 文件,然后用 fasterq-dump 提取 中等(需额外 fasterq-dump 步骤) .SRA gsutil, fasterq-dump 需要支付费用和 Google Cloud 账户
# 下载整个bioproject
kingfisher get -p PRJNA614539 -m ena-ascp ena-ftp prefetch aws-http 1>download.log 2>&1

# 下载单个样本
kingfisher get -r SRR11396159 -m  prefetch aws-http

# 下载多个样本
kingfisher get --run-identifiers-list SRR_list.csv -m ena-ascp ena-ftp prefetch --download-threads 10 --check-md5sums 1>down_srr_list.log 2>&1
  • -p :批量下载BioProject IDs 中的所有数据
  • -m :指定下载源 ena-ascp、ena-ftp、prefetch、aws-http、aws-cp、gcp-cp 等
  • -r :下载某个确定的SRA数据
  • –run-identifiers-list :SRR样本列表文件,单列SRR号
  • –download-threads -t : 指定线程数

3.1 Kingfisher使用

  1. 使用annoteat查询SRR数据.

# 全部信息
kingfisher annotate -r SRR11396159 --all-column -f tsv -o ./SRR11396159.srr.list

# 简要信息
kingfisher annotate -r SRR11396159 -f tsv -o ./SRR11396159.srr.list
  1. 使用get 进行下载
  • ena-asc 通过Aspera从ENA下载.fastq.gz文件
  • ena-ftp 通过curl从ENA下载.fastq.gz文件
  • prefetch 使用NCBI的prefetch从sra-tools下载.SRA文件,然后用fasterq-dump提取
  • aws-http 使用aria2c通过多个连接线程从AWS Open Data Program下载.SRA文件,之后用fasterq-dump提取

# 单个样本 ftp调用arias2
kingfisher get -r SRR11396174 -m ena-ftp --download-threads 8 --check-md5 

# 单个样本 调用ascp
kingfisher get -r SRR11396174 -m ena-ascp --download-threads 5
Note

ena-ftp 非常容易ftp被ENA拒绝,然后断开下载,甚至无法恢复

Kingfisher更像是一个整合的工具,其实就是调用ascp,prefetch,aria2c等工具进行相关的下载,但是因为是整合工具所以自定义的性能自然变差,最后还是要回归到原始的下载工具,小的文件是可以使用的,非常方便。

4. aria2下载

Aria2是一款轻量级、多协议、跨平台命令行下载工具,支持HTTP/HTTPS、FTP、BitTorrent和Metalink等协议。它通过多线程、多源下载来提高下载速度,占用资源少,且支持多种操作系统,包括Windows、macOS、Linux等。

aria2 是一款轻量且高效命令行下载工具,它提供了对多协议和多源地址的支持,并尝试将下载带宽利用率最大化,目前支持的协议包括HTTP(S)、FTP、BitTorrent(DHT, PEX, MSE/PE) 和 Metalink。通过 Metalink 的分块检查,aria2 可以在下载过程中自动的进行数据校验。

4.1 aria2安装

Mac安装

# Mac
brew install aria2

# Ubuntu
sudo apt-install aria2

4.2 aria2使用

aria2本身没有问题,主要是下载来源的封禁

aria2c -x 8 -s 8 -c -m 5 --retry-wait 10 ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR113/059/SRR11396159/SRR11396159_1.fastq.gz
  • x 8个线程同时下载。
  • s 分为8段下载
  • c 断点下载
  • m 试探下载5次
  • -retry-wait 10 等待10秒

下载开始后,会形成 SRR11396173_1.fastq.gz.aria2 是aria2的下载控制/临时文件,用来记录当前文件的下载速度和状态,支持断点续传

  • 已经下载了多少字节
  • 文件被分成了多少块
  • 每块下载到哪
  • 校验信息(hash)
  • 下载 URL / 状态信息

4.3 自动重新下载

  1. 第一步
    在ENA中得到ftp的文件,开始进行信息提取与筛选

使用awk 进行文本的操作~

awk -F'\t' 'NR>1{
    n=split($3,a,";");      # 按分号拆分每行的 fastq_ftp
    for(i=1;i<=n;i++)       # 遍历每个文件
        print "ftp://" a[i] # 输出并加 ftp:// 前缀
}' aria2.txt > links.txt

将文件中的下载地址全部按行排列,排列好的下载链接用来做循环

  1. 第二步

写一个脚本,因为aria2c经常被ENA发送EOF拒绝,然后导致下载结束

写个循环强制进行重新下载,直到下载成功为止!!!

为了防止文件的冲突,添加了将下载好的文件移动到文件夹中


#!/bin/bash

# --- 脚本配置 ---
# 包含所有 FTP/HTTPS 链接的文件路径
LINKS_FILE="links.txt"

# 目标存放文件
TARGET_DIR="dataSRR"

# 文件夹不存在创建
mkdir -p "$TARGET_DIR"

# aria2c 下载参数
# -c: 启用断点续传(必须)
# -x 5 -s 5: 并发连接数和分块数(推荐值,您可以根据网络情况调整)
# --retry-wait 60: 失败后等待 60 秒再重试
# --max-tries 0: 设置为 0,让 aria2c 内部无限重试
ARIA2_OPTIONS="-c -x 5 -s 5 --retry-wait 15"

# 如果下载彻底失败(达到 aria2c 的最大重试次数后退出),外部脚本等待的秒数
# 只有当 aria2c 内部重试机制失效时,外部脚本才会在等待后进行下一次尝试
EXTERNAL_SLEEP_SECONDS=15

echo "--- 批处理下载任务开始 ---"
echo "链接文件: ${LINKS_FILE}"
echo "aria2c 参数: ${ARIA2_OPTIONS}"
echo "--------------------------"

# 检查链接文件是否存在
if [ ! -f "$LINKS_FILE" ]; then
    echo "❌ 错误: 链接文件 ${LINKS_FILE} 不存在。"
    exit 1
fi

# 1. 逐行读取 links.txt 文件中的链接
while IFS= read -r DOWNLOAD_URL; do
    
    # 清理行首尾空格,并跳过空行
    DOWNLOAD_URL=$(echo "$DOWNLOAD_URL" | xargs)
    if [ -z "$DOWNLOAD_URL" ]; then
        continue
    fi
    
    FILE_NAME=$(basename "$DOWNLOAD_URL")
    
    echo ""
    echo "=========================================================="
    echo "🚀 正在处理文件: ${FILE_NAME}"
    echo "=========================================================="
    
    # 2. 无限循环:直到下载成功为止
    while true; do
        
        echo "$(date): 尝试下载/续传..."
        
        # 运行 aria2c
        aria2c ${ARIA2_OPTIONS} "$DOWNLOAD_URL"
        
        # 检查 aria2c 的退出状态码
        EXIT_CODE=$?
        
        if [ ${EXIT_CODE} -eq 0 ]; then
            # 退出码为 0,表示下载成功
            echo "✅ $(date): 文件 ${FILE_NAME} 下载成功!"
            mv -v "$FILE_NAME" "$TARGET_DIR"
            break # 跳出内部循环,处理下一个链接
        else
            # 退出码不为 0,表示彻底失败(达到内部最大重试次数)
            echo "❌ $(date): 下载失败 (退出码: ${EXIT_CODE}),等待 ${EXTERNAL_SLEEP_SECONDS} 秒后重试..."
            sleep ${EXTERNAL_SLEEP_SECONDS}
            # 脚本会再次进入循环,重新执行 aria2c 进行续传
        fi
    done

done < "$LINKS_FILE"

echo ""
echo "--- 批处理下载任务全部完成! ---"

5. md5sum检验文件

使用bash脚本进行文件的检验,核心就是对比提供的MD5和文件校验的MD5比较

Note

自己设置的话主要是文件的命名和位置

还有就是md5的文件格式,内容也要注意,核心就是提取每个文件的md5进行比较~


#!/bin/bash

# ======================================
# 🚀 批量 FASTQ 文件 MD5 校验脚本
# ======================================

# --- 配置 ---
# 请将你的元数据文件命名为 md5sum.txt,或修改这里的路径
METADATA_FILE="md5sum.txt"
# --- 配置结束 ---

echo "--- 🚀 开始批量 FASTQ MD5 校验 ---"
echo "--- 校验结果: [文件名称] [校验结果] ---"

# 检查元数据文件是否存在
if [ ! -f "$METADATA_FILE" ]; then
    echo "错误: 元数据文件 '$METADATA_FILE' 未找到。请检查文件名或路径。"
    exit 1
fi

# 使用 awk 解析元数据并进行 MD5 校验
awk '
{
    # 跳过空行或注释行
    if ($1 == "" || $1 ~ /^#/ || $1 == "run_accession") next

    # 提取 SRR ID 和预期的 MD5 校验码
    srr_id = $1
    split($2, expected_md5s, ";")  # 以分号分隔 MD5

    # 构造本地文件名
    file1_name = srr_id "_1.fastq.gz"
    file2_name = srr_id "_2.fastq.gz"

    # ---------- 校验文件 1 ----------
    if (system("test -f " file1_name) != 0) {
        print file1_name, "FILE_MISSING"
    } else {
        # 计算本地文件的 MD5
        cmd = "md5sum " file1_name
        cmd | getline calculated_md5_output
        close(cmd)
        split(calculated_md5_output, calculated_md5_array, " ")
        calculated_md5 = calculated_md5_array[1]

        # 比较 MD5
        expected_md5 = expected_md5s[1]
        if (calculated_md5 == expected_md5) {
            print file1_name, "OK"
        } else {
            print file1_name, "FAILED!"
            print "  预设值: " expected_md5
            print "  计算值: " calculated_md5
        }
    }

    # ---------- 校验文件 2 ----------
    if (system("test -f " file2_name) != 0) {
        print file2_name, "FILE_MISSING"
    } else {
        # 计算本地文件的 MD5
        cmd = "md5sum " file2_name
        cmd | getline calculated_md5_output
        close(cmd)
        split(calculated_md5_output, calculated_md5_array, " ")
        calculated_md5 = calculated_md5_array[1]

        # 比较 MD5
        expected_md5 = expected_md5s[2]
        if (calculated_md5 == expected_md5) {
            print file2_name, "OK"
        } else {
            print file2_name, "FAILED!"
            print "  预设值: " expected_md5
            print "  计算值: " calculated_md5
        }
    }
}
' "$METADATA_FILE"

echo -e "\n--- ✅ MD5 校验完成 ---"