Чем собрать исходящие ссылки с сайта?

Shellenberg
На сайте с 30.05.2008
Offline
47
1046

Задача.

Есть список страниц - вид http://site.ru/раздел/?page=столько-то

Страницы отличаются только номером в конце строки.

На всех этих страницах есть множество исходящих ссылок.

Нужно

1. Собрать все ссылки в списки по маскам, например - http://*.site.*/ и занести в отдельные списки.

2. Проследовать по каждой найденой на странице ссылке и вывести результаты. Например - not_found, timeout и т.д.

3. Вывести результаты в какой-либо удобочитаемый формат.

Камрады, реально помощь нужна. Помогите советом.

Всем заранее спасибо.

[Удален]
#1

Сто лет назад писал проверяльщик линков и картинок страниц. При желании, можно его переделать под Ваши нужды.

Переделывать не возьмусь, а сам скрипт берите:

<?php

define('TIME_LIMIT', 0);
$is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0;
if (!$is_safe_mode && function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);

header("Expires: Tue, 1 Jul 2003 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");

if( !isSet($_GET['test']) )$_GET['test'] = "";
list($usec, $sec) = explode(" ", microtime());
$timer_start = ((float)$usec + (float)$sec);
if($_GET['test'] == "")$output = "<h2 align=\"center\">Поиск &quot;битых&quot; линков:</h2>".first_form();
else
{
$output = "<h2 align=\"center\">Результаты поиска:</h2>";
if($_GET['who']=="1")
{
$links = get_objects($_GET['test'], 2);
$output .= implode( "<br>", check_curl($links) );
}
else
{
$first_pass = get_objects($_GET['test'], 1);
error_reporting(0);
$output .= "Проверка страницы ".$_GET['test']." :<ul>";
$links = get_objects($_GET['test'], 2);
$output .= implode( "<br>", check_curl($links) );
$output .= "</ul>";
foreach($first_pass as $url)
{
if( $url!=$_GET['test'] and $url!=$_GET['test']."/" and stristr($url,$_GET['test']) )
{
$output .= "Проверка страницы ".$url." :<ul>";
$links = get_objects($_GET['test'], 2);
if($links == "0")$output .= "Страница недоступна!";
else $output .= implode( "<br>", check_curl($links) );
$output .= "</ul>";
}
}
}
list($usec, $sec) = explode(" ", microtime());
$timer_end = ((float)$usec + (float)$sec);
$output .= "<div align=center>Поиск занял ".($timer_end-$timer_start)." секунд.</div>";
$output .= "<h2 align=\"center\">Новый поиск:</h2>".first_form();
}


echo '<html>
<head>
<title>Поиск &quot;битых&quot; линков и потерянных имиджей</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
</head>
<body>
'.$output.'
</body>
</html>';


function first_form()
{
if($_GET['test'] == "")$test_URL = "http://";
else $test_URL = $_GET['test'];
return '<form action=""><div align="center">
<strong>URL проверяемой страницы</strong>:&nbsp;<input type="text" name="test" id="test" value="'.$test_URL.'" size="37" maxlength="128">
<input type="submit" value="Проверить!">
<br><br><nobr><strong>Проверить</strong>: <input type="radio" name="who" checked=checked value="1">&nbsp;только одну страницу;
&nbsp;&nbsp;&nbsp;<input type="radio" name="who" value="2">&nbsp;и все связанные с этой страницей на этом сайте.</nobr>
<br><br>(URL должен заканчиваться знаком "/" или именем файла)</div></form>';
}

function get_objects($url, $pass)
{
$text = file_get_contents($url);
$text = preg_replace( "#<!--(.+?)-->#is", "", $text );
if(strlen($text)==0) return "0";
$text = str_replace("''","",$text);
$text = str_replace("\"\"","",$text);
$links = array();

if($pass==2)
{
// Поиск для конструкций src="..."
preg_match_all("/src=\"(.+?)\"/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]); // добавляем свеженайденые URL в список
$text = str_replace($tmp_links[0],$tmp_links[1],$text); // убираем найденые URL из текста
$text = str_replace("src=\"\"","",$text);
preg_match_all("/src=\"(.+?)\"/is",$text,$tmp_links); // продолжаем поиск
}
// Повторяем поиск для конструкций src='...'
preg_match_all("/src='(.+?)'/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]);
$text = str_replace($tmp_links[0],$tmp_links[1],$text);
$text = str_replace("src=''","",$text);
preg_match_all("/src='(.+?)'/is",$text,$tmp_links);
}
}
// Повторяем поиск для конструкций href="..."
preg_match_all("/href=\"(.+?)\"/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]); // добавляем свеженайденые URL в список
$text = str_replace($tmp_links[0],$tmp_links[1],$text); // убираем найденые URL из текста
$text = str_replace("src=\"\"","",$text);
preg_match_all("/href=\"(.+?)\"/is",$text,$tmp_links); // продолжаем поиск
}
// Повторяем поиск для конструкций href='...'
preg_match_all("/href='(.+?)'/is",$text,$tmp_links);
while(count($tmp_links[0]))
{
$links = array_merge($links,$tmp_links[1]);
$text = str_replace($tmp_links[0],$tmp_links[1],$text);
$text = str_replace("src=''","",$text);
preg_match_all("/href='(.+?)'/is",$text,$tmp_links);
}

$base_href = explode("/",$_GET['test']);
$base_href[(count($base_href)-1)] = "";
$base_href = implode("/",$base_href);

$links_cleaned = Array();
foreach($links as $link)
{
$href = $base_href;
while( substr($link,0,3)=="../" )
{
$link = substr($link,3);
$href = substr($base_href,0,-1);

$href = explode("/",$href);
$href[(count($href)-1)] = "";
$href = implode("/",$href);
}
if(substr($link,0,7)!="http://")$link = $href.
$link = str_replace("/./","/",$link);
if(
!stristr($link,"javascript:")
and !stristr($link,"(")
and !stristr($link,"+")
and !stristr($link,"mailto:")
)
$links_cleaned[] = $link;
}
$links_cleaned = array_unique($links_cleaned);
return $links_cleaned;
}

function check_curl($linksz){
$links = array();
foreach($linksz as $link)
{
$kode = hget($link);
if( intval($kode)<400 and intval($kode)>99 )$links[] = "<font color=\"#008000\">".$link." (код ".$kode.")</font>";
else $links[] = "<font color=\"#FF0000\"><strong>".$link."</strong> (ошибка ".$kode.")</font>";
}
return $links;
}

function hget($in){
usleep(50);
$in=str_replace(" ",'',$in);
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, $in); // что чекаем
curl_setopt($ch, CURLOPT_HEADER, 1); // нам _нужен_ заголовок
curl_setopt($ch, CURLOPT_NOBODY, 1); // нам _НЕ_ нужно мертвое тело ответа
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $in);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_USERAGENT, "User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14");
$result=curl_exec($ch);// загрузка страницы
return curl_getinfo($ch,CURLINFO_HTTP_CODE);
curl_close($ch);
}

?>
Shellenberg
На сайте с 30.05.2008
Offline
47
#2

Огромное спасибо!

Только скрипт нужно отлаживать, с ходу ошибки полезли (строка 167)

К сожалению, у меня в php знания = 0.😎

Может кто поможет?

S
На сайте с 14.04.2010
Offline
5
#3

Если ничего подходящего не найдёте, могу добавить такой функционал в программу iCombine URL InfoCollector

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий