某大型生物研究项目选择通过 https 提供其档案:
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/
不幸的是,似乎没有这些目录内容的清单,所以我只想构建一个。我想获取整个目录树的文件名。有什么建议吗?我可以在 perl/python/R/etc 中编写一些内容来递归抓取 index.html 文件,但我认为 wget 中可能有一些咒语可以让我获取文件名,但我还没有找到。
答案1
我确实有完全相同的问题。这两种解决方案对我来说都不起作用。但是,这个确实有效:
安装 lftp,然后执行
lftp https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/
du -a > manifest.txt
这将为您提供所有目录和文件名。
答案2
与 FTP 协议相反,HTTP 不知道目录列表的概念。因此,wget
只能根据用户定义的某些规则查找链接并跟踪它们。
话虽如此,如果您确实想要,您可以滥用wget
调试模式来收集它在分析 HTML 页面时遇到的链接列表。这当然不是什么好事,但可以这样做:
wget -d -r -np -N --spider -e robots=off --no-check-certificate \
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/ \
2>&1 | grep " -> " | grep -Ev "\/\?C=" | sed "s/.* -> //"
一些旁注:
- 这将生成一个仍然包含重复项(目录)的列表,因此您需要将输出重定向到文件并用于
uniq
修剪列表。 --spider
导致wget
不下载任何内容,但它仍将对每个它认为需要入队的文件执行 HTTP HEAD 请求。这将导致比实际需要/预期更多的流量,并导致整个过程非常缓慢。-e robots=off
需要忽略robots.txt
可能导致wget
无法开始搜索的文件(这是您在问题中给出的服务器的情况)。- 如果您使用的是
wget
1.14 或更新版本,您可以使用它--reject-regex="\?C="
来减少不必要的请求数量(对于@slm 已经提到的那些“排序”链接)。这也消除了grep -Ev "\/\?C="
后续步骤的需要。
答案3
我以为也可以用 wget/curl 轻松实现这一点,但也没用。你可以使用这个 Ruby 库,银莲花,但做起来相当容易。
安装 anemone gem
% gem install anemone
Fetching: robotex-1.0.0.gem (100%)
Fetching: anemone-0.7.2.gem (100%)
Successfully installed robotex-1.0.0
Successfully installed anemone-0.7.2
2 gems installed
Installing ri documentation for robotex-1.0.0...
Installing ri documentation for anemone-0.7.2...
Installing RDoc documentation for robotex-1.0.0...
Installing RDoc documentation for anemone-0.7.2...
海葵脚本示例
#! /usr/bin/env ruby
require 'anemone'
Anemone.crawl("https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/") do |anemone|
anemone.on_every_page do |page|
puts page.url
end
end
示例运行
% ./anemone.rb | grep -v '?C='
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/README_BCR.txt
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/README_MAF.txt
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/acc/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/brca/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/blca/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/cesc/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/cntl/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/dlbc/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/coad/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/esca/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/gbm/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/hnsc/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/kich/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/kirc/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/kirp/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/lcll/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/laml/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/lcml/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/lihc/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/lgg/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/lnnh/
https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/lost+found/
...
...
笔记:该位grep -v '?C='
正在过滤 Apache 通过其索引指令生成的样板标头,即:
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable
这些允许您按不同列(名称、创建日期等)对页面进行排序。这些显示为页面,我只是将它们从输出中过滤掉。