Extraia e imprima todos os links (não para baixar o conteúdo) de um site arquivado

1

Desejo extrair e imprimir todos os links (não para baixar o conteúdo) de um site arquivado, por exemplo, www.foosite.com/archive percorrendo todas as pastas e subpastas.

cenário

: Eu estou em um arquivo web como este %código% que tem diretórios e subdiretórios com arquivos para download, como

%código% Eu vou (recursivamente) percorrer todos os diretórios e obter todos os caminhos de arquivo (downloadable) (urls) como %código%

Mas meu shell script, onde tentei simular uma técnica simples de navegação na Web com www.foosite.com/archive , a saída fica presa em uma recursão infinita (pense que o problema é mais sintático que a implementação).

Código:

#!/bin/bash

links='/usr/bin/lynx -dump -listonly -nonumbers $1'

function dump_primary_links() {

        for link in $links 
        do
            echo "$link" | grep -P "\/$" > /dev/null
            # if link ends with "/" that's a directory 

            if [  $? -eq 0  ]; then
                echo "primary link:$link"
                print_directory_items $link
                 # now recursively traverse the directory 
            else
                echo "$link" # else a normal link

            fi

        done


    }



function print_directory_items() {
    # get contents of directory 
    lst='/usr/bin/lynx -dump -listonly -nonumbers $link'


     for lnk in $lst 
        do
            echo "$lnk" | grep -P "\/$" > /dev/null 
            # if there is a directory in $lst then travel directory recursively 

            if [  $? -eq 0  ]; then

                link=$lnk
                print_directory_items $link
            else
                echo "$lnk" # directory contents
            fi
       done

    }


get_link

NB: Eu sei que python (requests e Beautifulsoup ou Scrapy) seria uma boa solução nesse caso, mas eu só quero uma simulação unix simples de navegação ou "diretório da web"

    
por faquir 19.12.2017 / 11:18

2 respostas

1

Você pode espelhar um site usando wget , mas também pode dizer que ele age como um web-spider, por isso não baixará nada.

Então você pode fazer isso, mas lembre-se de salvar o log:

wget --no-directories --mirror --spider "$url" 2>&1 | tee "$log"

No meu caso, no log eu encontrei algo assim:

Spider mode enabled. Check if remote file exists.
--2017-12-19 07:19:23--  URL

Então usei grep para recuperar as URLs:

grep -P -o -e '(?<=^--....-..-.. ..:..:..--  )(.*)' "$log"

Exemplo:

$ wget --no-directories --mirror --spider https://utw.me/file/scripts/ 2>&1 | tee log.txt
...
$ grep -P -o -e '(?<=^--....-..-.. ..:..:..--  )(.*)' log.txt
...
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2001.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2002.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2003.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2004.ass
https://utw.me/file/scripts/Fate%20Zero/%5BUTW%5D%20Fate%20Zero%20-%2005.ass
...
    
por 19.12.2017 / 14:42
1

Acho que você fez uma pesquisa procurando o link (de link ) e link (de um dos subdir).

wget , curl e lynx tem opções para descer / buscar itens em várias condições (não saia do site inicial, a profundidade máxima é X, use ftp e assim por diante).

em uma nota lateral:

  • você não exibiu o código completo.
  • você chama print_directory_items com um argumento, mas não o pega (seria localmente conhecido como $1 )
  • prefira $( ) over backquote
por 19.12.2017 / 13:03