2009-09-17 72 views
68

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

Tôi đã xem HTTrack nhưng 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 –

Trả lời

56

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ể tạo một giải pháp để tạo cây thư mục.

+0

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. –

+2

Một công cụ tuyệt vời. Tôi đã sử dụng "XENU liên kết sleuth trước". Linkchecker là chi tiết hơn. – Mateng

+0

Tôi tự làm như thế nào? và điều gì sẽ xảy ra nếu không có robots.txt trong trang web? –

1

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

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

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

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

Chúc may mắn!

+13

Không không không không, [không phân tích cú pháp HTML với regex] (http://stackoverflow.com/a/1732454/113632), nó làm cho Bé Jesus khóc! – dimo414

24

Hoặc bạn có thể sử dụng Google để hiển thị tất cả các trang mà nó đã lập chỉ mục cho tên miền này. Ví dụ: site:www.bbc.co.uk

+5

nhưng nếu bạn sử dụng các tính năng tìm kiếm bổ sung trong google chẳng hạn như trang web, bạn sẽ nhận được giới hạn 700 mục nhập. evenif trên đầu trang kết quả cho biết cách xa 700 ex: Khoảng 87,300 kết quả (0,73 giây) – Mbarry

+1

@Mbarry, Và làm thế nào để bạn biết điều đó? – Pacerier

+0

Thật dễ dàng để biết. Hãy thử để có được 30-50 trang kết quả tìm kiếm phía trước và bạn sẽ sớm tìm thấy kết thúc, thay vì hàng ngàn kết quả trên "site: www.bbc.co.uk". – Zon

-1
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; 
} 
try this code.... 
+6

Trong khi câu trả lời này có lẽ là chính xác và hữu ích, nó được ưu tiên nếu bạn đưa ra một số 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ó thay đổi (có thể không liên quan) khiến nó ngừng hoạt động và người dùng cần phải hiểu nó đã hoạt động như thế nào. –

+1

Eh, nó dài một chút ** ** – ElectroBit

+1

Hoàn toàn không cần thiết để phân tích cú pháp html theo cách này trong php. http://php.net/manual/en/class.domdocument.php PHP không có khả năng hiểu DOM! – JamesH

23

Nếu bạn có các nhà phát triển giao diện điều khiển (JavaScript) trong trình duyệt của bạn, bạn có thể gõ mã này trong:

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

rút ngắn:

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

Điều gì về url "Javascript-ed"? – Pacerier

+0

Như cái gì? Ý anh là gì? – ElectroBit

+1

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

Các vấn đề liên quan