Como encontrar todos os links / páginas em um site

97

É possível encontrar todas as páginas e links em QUALQUER site? Gostaria de inserir um URL e produzir uma árvore de diretórios com todos os links desse site?

Eu olhei para HTTrack, mas ele baixa todo o site e eu simplesmente preciso da árvore de diretórios.

Jonathan Lyon
fonte
2
crawlmysite.in - site não existe
Sarah Trees

Respostas:

70

Confira o verificador de links - ele rastreará o site (obedecendo robots.txt) e gerará um relatório. A partir daí, você pode criar um script de solução para criar a árvore de diretórios.

Hank Gay
fonte
muito obrigado Hank! Perfeito - exatamente o que eu precisava. Muito apreciado.
Jonathan Lyon,
2
Uma boa ferramenta. Eu estava usando o "detetive de links XENU antes". Linkchecker é muito mais prolixo.
Mateng
como faço isso sozinho? e se não houver um arquivo robots.txt em um site?
Alan Coromano
1
@MariusKavansky Como você rastreia manualmente um site? Ou como você constrói um rastreador? Não tenho certeza se entendi sua pergunta. Se não houver nenhum robots.txtarquivo, isso significa apenas que você pode rastrear o quanto quiser.
Hank Gay
8
oi pessoal, o linkchecker não funcionou para mim quando eu examino o site ele só retorna um relatório de links quebrados. Relatório muito pequeno. Enquanto isso, eles verificaram milhares de links, mas não consigo ver onde eles estão relatados. Usando a versão 9.3, você pode ajudar?
JayPex
42

Se você tiver o console do desenvolvedor (JavaScript) em seu navegador, poderá digitar este código em:

urls = document.querySelectorAll('a'); for (url in urls) console.log(urls[url].href);

Abreviado:

n=$$('a');for(u in n)console.log(n[u].href)
ElectroBit
fonte
1
E quanto aos urls "Javascript-ed"?
Pacerier
Como o quê? O que você quer dizer?
ElectroBit
2
Quero dizer um link feito usando Javascript. Sua solução não mostraria isso.
Pacerier
2
@ElectroBit Eu realmente gosto, mas não tenho certeza do que estou olhando. Qual é a $$operadora? Ou isso é apenas um nome de função arbitrário, mesmo que n=ABC(''a'); eu não esteja entendendo como urlsobtém todos os elementos marcados com 'a'. Você pode explicar? Estou assumindo que não é jQuery. De qual função de biblioteca de protótipo estamos falando?
zipzit
1
@zipzit Em alguns navegadores, $$()é basicamente uma abreviação de document.querySelectorAll(). Mais informações neste link: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
1

Outra alternativa pode ser

Array.from(document.querySelectorAll("a")).map(x => x.href)

Com o $$(seu é ainda mais curto

Array.from($$("a")).map(x => x.href)
Sebastian
fonte
mais 1 - assim, você está usando JS moderno. Eu executei este programa e, embora ele tenha retornado alguns links, ele não retornou todas as páginas .html que estão no nível superior. Existe uma razão pela qual todas as páginas não retornam na lista de array? Obrigado
Chris
0

Se esta for uma questão de programação, eu sugiro que você escreva sua própria expressão regular para analisar todos os conteúdos recuperados. As tags de destino são IMG e A para HTML padrão. Para JAVA,

final String openingTags = "(<a [^>]*href=['\"]?|<img[^> ]* src=['\"]?)";

isso, junto com as classes Pattern e Matcher, deve detectar o início das tags. Adicione a tag LINK se você também quiser CSS.

No entanto, não é tão fácil quanto você pode ter pensado inicialmente. Muitas páginas da web não são bem formadas. Extrair todos os links de forma programática que o ser humano pode "reconhecer" é realmente difícil se você precisa levar em conta todas as expressões irregulares.

Boa sorte!

mizubasho
fonte
18
Não não não não, não analise HTML com regex , isso faz o Menino Jesus chorar!
dimo414
-2
function getalllinks($url) {
    $links = array();
    if ($fp = fopen($url, 'r')) {
        $content = '';
        while ($line = fread($fp, 1024)) {
            $content. = $line;
        }
    }
    $textLen = strlen($content);
    if ($textLen > 10) {
        $startPos = 0;
        $valid = true;
        while ($valid) {
            $spos = strpos($content, '<a ', $startPos);
            if ($spos < $startPos) $valid = false;
            $spos = strpos($content, 'href', $spos);
            $spos = strpos($content, '"', $spos) + 1;
            $epos = strpos($content, '"', $spos);
            $startPos = $epos;
            $link = substr($content, $spos, $epos - $spos);
            if (strpos($link, 'http://') !== false) $links[] = $link;
        }
    }
    return $links;
}

tente este código ....

user4318981
fonte
10
Embora essa resposta seja provavelmente correta e útil, é preferível incluir alguma explicação com ela para explicar como ela ajuda a resolver o problema. Isso se torna especialmente útil no futuro, se houver uma alteração (possivelmente não relacionada) que faça com que ele pare de funcionar e os usuários precisem entender como funcionava antes.
Kevin Brown,
2
Eh, é um pouco longo.
ElectroBit
1
Completamente desnecessário analisar o html dessa maneira no php. php.net/manual/en/class.domdocument.php PHP tem a habilidade de entender o DOM!
JamesH