Bagaimana menemukan semua link / halaman di situs web

100

Apakah mungkin untuk menemukan semua halaman dan tautan di situs web mana pun? Saya ingin memasukkan URL dan membuat pohon direktori dari semua tautan dari situs itu?

Saya telah melihat HTTrack tetapi itu mengunduh seluruh situs dan saya hanya membutuhkan pohon direktori.

Jonathan Lyon
sumber
2
crawlmysite.in - situs tidak ada
Sarah Trees

Jawaban:

70

Periksa pemeriksa tautan —itu akan merayapi situs (sambil mematuhi robots.txt) dan menghasilkan laporan. Dari sana, Anda dapat membuat skrip solusi untuk membuat pohon direktori.

Hank Gay
sumber
terima kasih banyak Hank! Sempurna - persis seperti yang saya butuhkan. Sangat dihargai.
Jonathan Lyon
2
Alat yang bagus. Saya menggunakan "XENU link sleuth before". Linkchecker jauh lebih bertele-tele.
Mateng
bagaimana cara melakukannya sendiri? dan bagaimana jika tidak ada robots.txt di situs web?
Alan Coromano
1
@MariusKavansky Bagaimana Anda merayapi situs web secara manual? Atau bagaimana Anda membangun crawler? Saya tidak yakin saya mengerti pertanyaan Anda. Jika tidak ada robots.txtfile, itu berarti Anda dapat merangkak sesuka hati.
Hank Gay
8
hai teman-teman, pemeriksa tautan tidak berfungsi untuk saya ketika saya memindai situs itu hanya mengembalikan laporan tautan rusak. Laporan yang sangat kecil. sementara itu mereka memeriksa ribuan tautan tetapi saya tidak dapat melihat di mana itu dilaporkan. Menggunakan versi 9.3 dapatkah Anda membantu?
JayPex
46

Jika Anda memiliki konsol pengembang (JavaScript) di browser Anda, Anda dapat mengetikkan kode ini di:

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

Dipersingkat:

n=$$('a');for(u in n)console.log(n[u].href)
ElectroBit
sumber
1
Bagaimana dengan url "Javascript-ed"?
Pacerier
Seperti apa? Apa maksudmu?
ElectroBit
2
Maksud saya, tautan dilakukan menggunakan Javascript. Solusi Anda tidak akan menunjukkannya.
Pacerier
2
@ElectroBit Saya sangat menyukainya, tetapi saya tidak yakin apa yang saya lihat? Apa $$operatornya? Atau itu hanya nama fungsi sewenang-wenang, sama seperti n=ABC(''a'); saya tidak mengerti bagaimana urlsmendapatkan semua elemen bertanda 'a'. Bisakah Anda menjelaskan? Saya berasumsi itu bukan jQuery. Apa fungsi perpustakaan prototipe yang sedang kita bicarakan?
zipzit
1
@zipzit Di beberapa browser, $$()pada dasarnya adalah singkatan dari document.querySelectorAll(). Info lebih lanjut di tautan ini: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit
2

Alternatif lain mungkin

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

Dengan Anda $$(bahkan lebih pendek

Array.from($$("a")).map(x => x.href)
Sebastian
sumber
plus 1 - seperti itu Anda menggunakan JS modern. Saya menjalankan program ini, dan meskipun mengembalikan beberapa tautan, program ini tidak mengembalikan semua halaman .html yang ada di tingkat teratas. Apakah ada alasan mengapa semua halaman tidak kembali dalam daftar array? Terima kasih
Chris22
0

Jika ini adalah pertanyaan pemrograman, saya sarankan Anda menulis ekspresi reguler Anda sendiri untuk mengurai semua konten yang diambil. Tag target adalah IMG dan A untuk HTML standar. Untuk JAWA,

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

ini bersama dengan kelas Pattern dan Matcher harus mendeteksi awal dari tag. Tambahkan tag LINK jika Anda juga menginginkan CSS.

Namun, ini tidak semudah yang mungkin Anda pikirkan sebelumnya. Banyak halaman web tidak berformat baik. Mengekstrak semua tautan secara terprogram yang dapat "dikenali" oleh manusia sangatlah sulit jika Anda perlu memperhitungkan semua ekspresi tidak beraturan.

Semoga berhasil!

mizubasho
sumber
19
Tidak, tidak, tidak, jangan parsing HTML dengan regex , Baby Jesus akan menangis!
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;
}

coba kode ini ....

pengguna4318981
sumber
10
Meskipun jawaban ini mungkin benar dan berguna, akan lebih disukai jika Anda menyertakan beberapa penjelasan bersama dengan penjelasan bagaimana hal itu membantu memecahkan masalah. Ini menjadi sangat berguna di masa mendatang, jika ada perubahan (mungkin tidak terkait) yang menyebabkannya berhenti bekerja dan pengguna perlu memahami cara kerjanya dulu.
Kevin Brown
2
Eh, agak lama.
ElectroBit
1
Sama sekali tidak perlu mengurai html dengan cara ini di php. php.net/manual/en/class.domdocument.php PHP memang memiliki kemampuan untuk memahami DOM!
JamesH