Obtendo todos os nomes de arquivos (não conteúdo) recursivamente a partir de um diretório http

8

Um grande projeto de pesquisa biológica escolheu disponibilizar seu arquivo via https aqui:

link

Infelizmente, parece que não há manifesto do conteúdo desses diretórios, então eu simplesmente quero construir um. Eu gostaria de pegar os nomes de arquivos para toda a árvore de diretórios. Há alguma sugestão de como fazer isso? Eu posso escrever algo em perl / python / R / etc. para raspar os arquivos index.html de forma recursiva, mas achei que pode haver algum encantamento com o wget que pode obter os nomes dos arquivos, mas ainda não encontrei isso.

    
por seandavi 02.02.2013 / 00:14

3 respostas

4

Na verdade, eu tive o exatamente o mesmo problema . Ambas as soluções não funcionaram para mim. No entanto, isso aconteceu:

Instale o lftp e faça

lftp https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/
du -a > manifest.txt

e isso lhe dará todos os diretórios e nomes de arquivos.

    
por 14.11.2014 / 01:37
4

Em oposição ao protocolo FTP, o HTTP não conhece o conceito de uma listagem de diretórios. Assim, wget só pode procurar por links e segui-los de acordo com certas regras definidas pelo usuário.

Dito isso, se você realmente quiser, poderá usar o modo de depuração wget s para coletar uma lista dos links encontrados ao analisar as páginas HTML. Certamente não é beleza, mas aqui vai:

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/.* -> //"

Alguns sidenotes:

  • Isso produzirá uma lista que ainda contém duplicatas (de diretórios), portanto, é necessário redirecionar a saída para um arquivo e usar uniq para uma lista limpa.
  • --spider faz com que wget não faça o download de nada, mas ainda fará uma solicitação HTTP HEAD em cada um dos arquivos que considera para enfileirar . Isso causará muito mais tráfego do que é realmente necessário / pretendido e fará com que a coisa toda seja bem lenta.
  • -e robots=off é necessário para ignorar um arquivo robots.txt que pode fazer com que wget não inicie a pesquisa (que é o caso do servidor que você forneceu na sua pergunta).
  • Se você tiver wget 1.14 ou mais recente, poderá usar --reject-regex="\?C=" para reduzir o número de solicitações desnecessárias (para os links de "classificação por" já mencionados por @slm). Isso também elimina a necessidade da etapa grep -Ev "\/\?C=" depois.
por 05.02.2013 / 13:16
2

Eu pensei que haveria uma maneira de fazer isso facilmente com o wget / curl também, mas também não consegui fazer nada funcionar. Você pode usar essa jóia Ruby, anêmona , para fazê-lo com bastante facilidade.

Instalando gema anêmona

% 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...

Exemplo de script de anêmona

#! /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

Exemplo de execução

% ./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/
...
...

NOTA: O bit grep -v '?C=' está filtrando os cabeçalhos padrão que o Apache está gerando através de sua diretiva de Indexação, ou seja:

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable

Estes permitem ordenar as páginas pelas diferentes colunas (Nome, Criar Data, etc.). Eles aparecem como páginas e eu estou apenas filtrando-os da saída.

    
por 02.02.2013 / 02:31

Tags