Bir web sitesindeki tüm bağlantılar / sayfalar nasıl bulunur


102

Herhangi bir web sitesinde tüm sayfaları ve bağlantıları bulmak mümkün mü? Bir URL girmek ve bu siteden gelen tüm bağlantıların bir dizin ağacını oluşturmak istiyorum?

HTTrack'e baktım, ancak bu tüm siteyi indiriyor ve sadece dizin ağacına ihtiyacım var.


2
crawlmysite.in - site yok
Sarah Trees

Yanıtlar:


72

Linkchecker'a göz atın — siteyi tarar (itaat ederken robots.txt) ve bir rapor oluşturur. Oradan, dizin ağacını oluşturmak için bir çözüm yazabilirsiniz.


çok teşekkür ederim Hank! Mükemmel - tam da ihtiyacım olan şey. Çok müteşekkirim.
Jonathan Lyon

2
Güzel bir alet. "Daha önce XENU link sleuth" kullanıyordum. Linkchecker çok daha ayrıntılı.
Mateng

bunu kendim nasıl yaparım? ve ya bir web sitesinde robots.txt yoksa?
Alan Coromano

1
@MariusKavansky Bir web sitesini manuel olarak nasıl tararsınız? Veya bir tarayıcıyı nasıl inşa edersiniz? Sorunuzu anladığımdan emin değilim. robots.txtDosya yoksa , bu sadece kalbinizin içeriğine girebileceğiniz anlamına gelir.
Hank Gay

8
merhaba arkadaşlar, siteyi taradığımda linkchecker benim için işe yaramadı, sadece kırık bağlantılar raporu veriyor. Çok küçük bir rapor. onlar bunu yaparken binlerce bağlantıyı kontrol etti ancak bunların nerede rapor edildiğini göremiyorum. 9.3 sürümünü kullanarak yardım edebilir misiniz?
JayPex

47

Tarayıcınızda geliştirici konsolu (JavaScript) varsa, bu kodu şuraya yazabilirsiniz:

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

Kısaltılmış:

n=$$('a');for(u in n)console.log(n[u].href)

1
Ya "Javascript-ed" url'leri?
Pacerier

Ne gibi? Ne demek istiyorsun?
ElectroBit

2
Javascript kullanılarak yapılan bir bağlantı demek istiyorum. Çözümünüz bunu göstermez.
Pacerier

2
@ElectroBit Gerçekten beğendim ama neye baktığımdan emin değilim? Nedir $$santral? Ya da bu sadece rastgele bir işlev adı mıdır, aynı 'a' etiketli tüm öğeleri n=ABC(''a'); nasıl urlselde ettiğini anlamadığım gibi . Açıklayabilir misin? JQuery olmadığını varsayıyorum. Hangi prototip kitaplık işlevinden bahsediyoruz?
zipzit

1
@zipzit Bir avuç tarayıcıda $$()temelde kısaltmasıdır document.querySelectorAll(). Bu bağlantıda daha fazla bilgi: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit

2

Başka bir alternatif olabilir

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

Seninle $$(daha da kısa

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

artı 1 - aynen modern JS kullanıyorsunuz. Bu programı çalıştırdım ve birkaç bağlantı döndürmesine rağmen, üst düzeydeki tüm .html sayfalarını döndürmedi. Dizi listesinde tüm sayfaların dönmemesinin bir nedeni var mı? Teşekkürler
Chris22

0

Bu bir programlama sorusuysa, alınan tüm içeriği ayrıştırmak için kendi normal ifadenizi yazmanızı öneririm. Hedef etiketler, standart HTML için IMG ve A'dır. JAVA için,

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

bu, Pattern ve Matcher sınıfları ile birlikte etiketlerin başlangıcını algılamalıdır. CSS de istiyorsanız LINK etiketi ekleyin.

Ancak, ilk başta düşündüğünüz kadar kolay değildir. Birçok web sayfası iyi biçimlendirilmemiş. Tüm düzensiz ifadeleri hesaba katmanız gerekiyorsa, insanoğlunun "tanıyabileceği" tüm bağlantıları programatik olarak çıkarmak gerçekten zordur.

İyi şanslar!


19
Hayır, hayır, hayır, HTML'yi normal ifadeyle ayrıştırma , Bebek İsa'yı ağlatır!
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;
}

bu kodu deneyin ....


10
Bu cevap muhtemelen doğru ve yararlı olsa da, sorunun çözülmesine nasıl yardımcı olduğunu açıklamak için bazı açıklamalara yer vermeniz tercih edilir. Çalışmayı durduran bir değişiklik (muhtemelen ilgisiz) varsa ve kullanıcıların bir zamanlar nasıl çalıştığını anlamaları gerekiyorsa, bu özellikle gelecekte yararlı olur.
Kevin Brown

2
Eh, biraz uzun.
ElectroBit

1
Html'yi php'de bu şekilde ayrıştırmak tamamen gereksizdir. php.net/manual/en/class.domdocument.php PHP'nin DOM'u anlama yeteneği vardır!
JamesH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.