Программа: обнаружение устаревших сылок

Программа stale-links.php выдает список ссылок на странице и их статус. Она сообщает, действительны ли ссылки, не перемещены ли они куда-нибудь, или они уже недействительны. Запустите программу, передав ей URL для сканирования ссылок:

% stale-links.php http://www.oreilly.com/
http://www.oreilly.com/index.html: OK
http://www.oreillynet.com: OK
http://conferences.oreilly.com: OK
http://international.oreilly.com: OK
http://safari.oreilly.com: MOVED: mainhom.asp?home
...

Для получения страниц программа stale-links.php использует расширение cURL. Сначала она извлекает содержимое URL, указанного в командной строке. После получения страницы программа извлекает ссылки, имеющиеся на этой странице, с помощью функции pc_link_extractor() из рецепта 11.8. Затем, после присоединения базового URL
в начало каждой ссылки, если это необходимо, запрашивается содержимое ссылки. Нам нужны лишь заголовки ответа, поэтому мы выбираем метод HEAD вместо метода GET, устанавливая параметрCURLOPT_NOBODY. Если установить параметр CURLOPT_HEADER, то функция curl_exec() включит заголовки ответа в возвращаемую ею строку. На
основании кода ответа выводится статус ссылки вместе с новым местоположением, если оно было изменено.

Пример 11.5.


stale-links.php
function_exists('curl_exec') or die('CURL extension required');
function pc_link_extractor($s) {
$a = array();
if (preg_match_all(
'/]*)[\"\']?[^>]*>(.*?)<\/A>/i',
$s,$matches,PREG_SET_ORDER)) {
foreach($matches as $match) {
array_push($a,array($match[1],$match[2]));
}
}
return $a;
}
$url = $_SERVER['argv'][1];
// извлекаем содержимое URL
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_FOLLOWLOCATION,1);
$page = curl_exec($c);
$info = curl_getinfo($c);
curl_close($c);
// определяем базовый url из url
// при этом не обращаем внимания на тег на этой странице
$url_parts = parse_url($info['url']);
if ('' == $url_parts['path']) { $url_parts['path'] = '/'; }
$base_path = preg_replace('<^(.*/)([^/]*)$>','\\1',$url_parts['path']);
$base_url = sprintf('%s://%s%s%s',
$url_parts['scheme'],
($url_parts['username'] || $url_parts['password']) ?
"$url_parts[username]:$url_parts[password]@" : '',
$url_parts['host'],
$url_parts['path']);
// запоминаем ссылки, которые мы посетили, чтобы не посещать
// их более одного раза
$seen_links = array();
if ($page) {
$links = pc_link_extractor($page);
foreach ($links as $link) {
// вычисляем относительные ссылки
if (! (preg_match('{^(http|https|mailto):}',$link[0]))) {
$link[0] = $base_url.$link[0];
}// пропускаем данную ссылку, если мы ее уже видели
if ($seen_links[$link[0]]) {
continue;
}
// отмечаем данную ссылку как просмотренную
$seen_links[$link[0]] = true;
// выводим содержимое ссылки, на которой находимся
print $link[0].': ';
flush();
// посещаем ссылку
$c = curl_init($link[0]);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_NOBODY, 1);
curl_setopt($c, CURLOPT_HEADER, 1);
$link_headers = curl_exec($c);
$curl_info = curl_getinfo($c);
curl_close($c);
switch (intval($curl_info['http_code']/100)) {
case 2:
// коды ответа 2xx означают, что со страницей все в порядке
$status = 'OK';
break;
case 3:
// коды ответа 3xx означают переадресацию
$status = 'MOVED';
if (preg_match('/^Location: (.*)$/m',$link_headers,$matches)) {
$location = trim($matches[1]);
$status .= ": $location";
}
break;
default:
// остальные коды ответа означают ошибки
$status = "ERROR: $curl_info[http_code]";
break;
}
print "$status\n";
}
}.



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ файла протокола веб-сервера
Выделение информации на веб-странице
Извлечение содержимого URL с помощью метода POST
Извлечение ссылок из HTML-файла
Использование шаблонов системы Smarty

Вернуться в раздел: PHP / 11. Автоматизация работы с Web