从 http 目录递归获取所有文件名(不是内容)

从 http 目录递归获取所有文件名(不是内容)

某大型生物研究项目选择通过 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无法开始搜索的文件(这是您在问题中给出的服务器的情况)。
  • 如果您使用的是wget1.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

    Apache 的 ss 呈现列排序器

这些允许您按不同列(名称、创建日期等)对页面进行排序。这些显示为页面,我只是将它们从输出中过滤掉。

相关内容