วิธีค้นหาลิงค์ / เพจทั้งหมดบนเว็บไซต์


100

เป็นไปได้ไหมที่จะค้นหาหน้าและลิงค์ทั้งหมดในเว็บไซต์ใด ๆ ฉันต้องการป้อน URL และสร้างแผนผังไดเรกทอรีของลิงก์ทั้งหมดจากไซต์นั้นหรือไม่

ฉันดู HTTrack แล้ว แต่มันดาวน์โหลดทั้งไซต์และฉันแค่ต้องการแผนผังไดเรกทอรี


2
crawlmysite.in - ไม่มีไซต์
Sarah Trees

คำตอบ:


70

ตรวจสอบตัวตรวจสอบลิงก์ - จะรวบรวมข้อมูลเว็บไซต์ (ขณะที่เชื่อฟังrobots.txt) และสร้างรายงาน จากนั้นคุณสามารถเขียนสคริปต์โซลูชันสำหรับสร้างแผนผังไดเร็กทอรี


ขอบคุณมากแฮงค์! สมบูรณ์แบบ - สิ่งที่ฉันต้องการ ชื่นชมมาก.
Jonathan Lyon

2
เครื่องมือที่ดี ฉันใช้ "XENU link นักสืบมาก่อน" Linkchecker นั้นละเอียดกว่ามาก
Mateng

ฉันจะทำอย่างไร และจะเกิดอะไรขึ้นถ้าไม่มี robots.txt ในเว็บไซต์
Alan Coromano

1
@MariusKavansky คุณรวบรวมข้อมูลเว็บไซต์ด้วยตนเองได้อย่างไร? หรือคุณสร้างโปรแกรมรวบรวมข้อมูลได้อย่างไร ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณ หากไม่มีrobots.txtไฟล์นั่นหมายความว่าคุณสามารถรวบรวมข้อมูลไปยังเนื้อหาของหัวใจได้
Hank Gay

8
สวัสดีทุกคน linkchecker ไม่ได้ผลสำหรับฉันเมื่อฉันสแกนไซต์มันจะส่งคืนรายงานของลิงก์ที่เสียเท่านั้น รายงานขนาดเล็กมาก แม้ว่าจะตรวจสอบลิงก์หลายพันรายการ แต่ฉันไม่เห็นว่ามีการรายงานไว้ที่ใด ใช้เวอร์ชัน 9.3 ช่วยหน่อยได้ไหม
JayPex

46

หากคุณมีคอนโซลนักพัฒนาซอฟต์แวร์ (JavaScript) ในเบราว์เซอร์คุณสามารถพิมพ์รหัสนี้ใน:

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

สั้นลง:

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

1
แล้ว URL "Javascript-ed" ล่ะ
Pacerier

เช่นอะไร? คุณหมายถึงอะไร?
ElectroBit

2
ฉันหมายถึงลิงค์ที่ทำโดยใช้ Javascript โซลูชันของคุณจะไม่แสดง
Pacerier

2
@ElectroBit ฉันชอบมันมาก แต่ฉันไม่แน่ใจว่ากำลังดูอะไรอยู่? ตัว$$ดำเนินการคืออะไร? หรือว่าเป็นเพียงชื่อฟังก์ชันที่กำหนดเองเหมือนกับn=ABC(''a'); ฉันไม่เข้าใจว่าurlsจะรับองค์ประกอบที่ติดแท็ก 'a' ทั้งหมดได้อย่างไร คุณสามารถอธิบาย? ฉันคิดว่ามันไม่ใช่ jQuery เรากำลังพูดถึงฟังก์ชันไลบรารีต้นแบบอะไร
zipzit

1
@zipzit ในเบราว์เซอร์ไม่กี่แห่ง$$()โดยพื้นฐานแล้วจะมีการจดชวเลขสำหรับdocument.querySelectorAll(). ข้อมูลเพิ่มเติมที่ลิงค์นี้: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit

2

ทางเลือกอื่นอาจเป็น

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

ของคุณ$$(ยิ่งสั้นลง

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

บวก 1 - เหมือนกับว่าคุณใช้ JS สมัยใหม่ ฉันรันโปรแกรมนี้และแม้ว่าจะส่งคืนลิงก์สองสามลิงก์ แต่ก็ไม่ได้ส่งคืนหน้า. html ทั้งหมดที่อยู่ในระดับบนสุด มีสาเหตุหรือไม่ที่ทำให้หน้าทั้งหมดไม่กลับมาในรายการอาร์เรย์ ขอบคุณ
Chris22

0

หากนี่เป็นคำถามเกี่ยวกับการเขียนโปรแกรมฉันขอแนะนำให้คุณเขียนนิพจน์ทั่วไปของคุณเองเพื่อแยกวิเคราะห์เนื้อหาที่ดึงมาทั้งหมด แท็กเป้าหมายคือ IMG และ A สำหรับ HTML มาตรฐาน สำหรับ JAVA

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

สิ่งนี้พร้อมกับคลาส Pattern และ Matcher ควรตรวจพบจุดเริ่มต้นของแท็ก เพิ่มแท็ก LINK หากคุณต้องการ CSS

อย่างไรก็ตามมันไม่ง่ายอย่างที่คุณคิดในใจ หน้าเว็บหลายหน้ามีรูปแบบไม่ถูกต้อง การแยกลิงก์ทั้งหมดโดยใช้โปรแกรมที่มนุษย์สามารถ "รับรู้" นั้นเป็นเรื่องยากมากหากคุณต้องคำนึงถึงนิพจน์ที่ผิดปกติทั้งหมด

โชคดี!


19
ไม่ไม่ไม่ไม่แยก HTML ด้วย regexมันทำให้ Baby Jesus ร้องไห้!
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;
}

ลองใช้รหัสนี้ ....


10
แม้ว่าคำตอบนี้อาจจะถูกต้องและมีประโยชน์ แต่ก็เป็นที่ต้องการหากคุณใส่คำอธิบายไว้ด้วยเพื่ออธิบายว่าจะช่วยแก้ปัญหาได้อย่างไร สิ่งนี้จะมีประโยชน์อย่างยิ่งในอนาคตหากมีการเปลี่ยนแปลง (อาจไม่เกี่ยวข้อง) ที่ทำให้หยุดทำงานและผู้ใช้ต้องเข้าใจว่าครั้งหนึ่งเคยทำงานอย่างไร
Kevin Brown

2
เอ๊ะมันยาวไป
ElectroBit

1
ไม่จำเป็นอย่างยิ่งที่จะแยกวิเคราะห์ html ในลักษณะนี้ใน php php.net/manual/en/class.domdocument.php PHP มีความสามารถในการทำความเข้าใจ DOM!
JamesH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.