Cách tìm tất cả các liên kết / trang trên một trang web


98

Có thể tìm thấy tất cả các trang và liên kết trên BẤT KỲ trang web nào không? Tôi muốn nhập một URL và tạo một cây thư mục gồm tất cả các liên kết từ trang web đó?

Tôi đã xem xét HTTrack nhưng nó tải xuống toàn bộ trang web và tôi chỉ cần cây thư mục.


2
crawlmysite.in - trang web không tồn tại
Sarah Trees

Câu trả lời:


70

Kiểm tra linkchecker — nó sẽ thu thập dữ liệu trang web (trong khi tuân theo robots.txt) và tạo báo cáo. Từ đó, bạn có thể lập kịch bản cho một giải pháp để tạo cây thư mục.


cảm ơn bạn rất nhiều Hank! Hoàn hảo - chính xác những gì tôi cần. Rất nhiều đánh giá cao.
Jonathan Lyon

2
Một công cụ tốt. Tôi đã sử dụng "XENU link sluth trước đây". Linkchecker dài dòng hơn nhiều.
Mateng

làm cách nào để tự làm điều đó? và điều gì xảy ra nếu không có tệp robots.txt trong một trang web?
Alan Coromano,

1
@MariusKavansky Làm cách nào để bạn thu thập thông tin một trang web theo cách thủ công? Hoặc làm thế nào để bạn xây dựng một trình thu thập thông tin? Tôi không chắc mình hiểu câu hỏi của bạn. Nếu không có robots.txttệp, điều đó chỉ có nghĩa là bạn có thể thu thập thông tin về nội dung trái tim của mình.
Hank gay

8
chào các bạn, linkchecker đã không hoạt động với tôi khi tôi quét trang web nó chỉ trả về một báo cáo về các liên kết bị hỏng. Báo cáo rất nhỏ. trong khi đó họ đã kiểm tra hàng nghìn liên kết nhưng tôi không thể thấy chúng được báo cáo ở đâu. Sử dụng phiên bản 9.3, bạn có thể vui lòng giúp đỡ?
JayPex

43

Nếu bạn có bảng điều khiển dành cho nhà phát triển (JavaScript) trong trình duyệt của mình, bạn có thể nhập mã này vào:

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

Rút gọn:

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

1
Còn về url "Javascript-ed" thì sao?
Pacerier

Như thế nào? Ý anh là gì?
ElectroBit

2
Ý tôi là một liên kết được thực hiện bằng Javascript. Giải pháp của bạn sẽ không hiển thị nó.
Pacerier

2
@ElectroBit Tôi thực sự thích nó, nhưng tôi không chắc mình đang xem gì? Là gì $$điều hành? Hay đó chỉ là một tên hàm tùy ý, giống như n=ABC(''a'); tôi không hiểu làm thế nào để urlsnhận được tất cả các phần tử được gắn thẻ 'a'. Bạn có thể giải thích? Tôi giả sử nó không phải là jQuery. Chúng ta đang nói đến chức năng thư viện nguyên mẫu nào?
zipzit

1
@zipzit Trong một số ít trình duyệt, $$()về cơ bản là viết tắt cho document.querySelectorAll(). Thông tin thêm tại liên kết này: developer.mozilla.org/en-US/docs/Web/API/Document/…
ElectroBit

1

Một thay thế khác có thể là

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

Với của bạn $$(nó thậm chí còn ngắn hơn

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

cộng với 1 - như vậy là bạn đang sử dụng JS hiện đại. Tôi đã chạy chương trình này và trong khi nó trả về một vài liên kết, nó không trả về tất cả các trang .html ở cấp cao nhất. Có lý do gì khiến tất cả các trang không trả về trong danh sách mảng không? Cảm ơn
Chris 22

0

Nếu đây là một câu hỏi về lập trình, thì tôi khuyên bạn nên viết biểu thức chính quy của riêng mình để phân tích cú pháp tất cả các nội dung được truy xuất. Các thẻ mục tiêu là IMG và A cho HTML tiêu chuẩn. Đối với JAVA,

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

điều này cùng với các lớp Mẫu và Đối sánh sẽ phát hiện phần đầu của các thẻ. Thêm thẻ LINK nếu bạn cũng muốn CSS.

Tuy nhiên, nó không dễ dàng như bạn có thể nghĩ. Nhiều trang web không được định hình tốt. Việc trích xuất tất cả các liên kết theo chương trình mà con người có thể "nhận ra" thực sự khó khăn nếu bạn cần tính đến tất cả các biểu thức bất thường.

Chúc may mắn!


18
Không không không không, đừng phân tích cú pháp HTML bằng regex , nó khiến Baby Jesus khóc!
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;
}

hãy thử mã này ...


10
Mặc dù câu trả lời này có thể đúng và hữu ích, nhưng sẽ được ưu tiên hơn nếu bạn bao gồm một số lời giải thích cùng với nó để giải thích cách nó giúp giải quyết vấn đề. Điều này trở nên đặc biệt hữu ích trong tương lai, nếu có một thay đổi (có thể không liên quan) khiến nó ngừng hoạt động và người dùng cần hiểu nó đã từng hoạt động như thế nào.
Kevin Brown,

2
Ơ, hơi lâu.
ElectroBit

1
Hoàn toàn không cần thiết phải phân tích cú pháp html theo cách này trong php. php.net/manual/en/class.domdocument.php PHP có khả năng hiểu DOM!
JamesH
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.