Слежка за сайтом

Статус
В этой теме нельзя размещать новые ответы.

MavriK

Местный житель
Регистрация
24 Мар 2006
Сообщения
156
Реакции
20
Вот понадобилось, что-то вроде "слежки" за сайтом, а именно, надо скачивать с определённого сайта, в определённое время (ежедневного) определённые страницы, т.е. всю информацию и текст которые на этих страницах расположены.

Может кто посоветует как это лучше сделать? Просто каждый день в определённое время заходить и самому смотреть нету возможности. Так же нету возможно использования какого-нибудь софта, так что новерное подойдёт только скрипт.
 
настрой под себя NewsGrabber
Для просмотра ссылки Войди или Зарегистрируйся
По крону запусти нужное тебе время, в шаблонах укажи старинцы с которых брать контент и что именно.
Как я понял это именно то, что тебе нужно ;)
 
Воспользовавшись советом SainT.v2 выкладываю небольшой скрипт для PHP4,5. Для его работы необходимо, чтобы сокеты в PHP были включены (по умолчанию включено). Лучше всего положить скрипт в отдельную папку (месторасположение не имеет значения).

В начале скрипта указываются страницы, которые желаете получить (массив $pages). Запускается скрипт коммандной строкой
Код:
php -f файл_этого_скрипта

После своей работы создает лог-файл с наименованием страниц, которые изменились с прошлой проверкой. А также создает директорию "pages", в которую копируются изменившиеся страницы, с почасовой разбивкой.

PHP:
<?
// НАСТРОЙКИ: какие страницы требуется проверить
$pages = array();
$pages[] = 'http://cms/';
$pages[] = 'http://cms/home/';
$utf = false; // поставьте true, если сайт в кодировке utf8 (в PHP должен быть подключен модуль mb_string)
$no_tags = true; // удалять все HTML-теги. Поставьте false, если не требуется


// ---------------------------------
// ЗАПУСКАЕМ ПРОВЕРКУ
$cur_path = dirname(__FILE__).'/';
set_time_limit(0); // скрипт живет вечно
$last_data = array();
$last_data_file = $cur_path.'last_data.dat';

//возьмем предыдущую информацию, если она есть 
if (is_file($last_data_file)) {
  
  $file = file_get_contents($last_data_file);
  if ($file && ($k = @unserialize($file))) 
    $last_data = $k;
}

// создадим папку логов
if (!is_dir($cur_path.'pages') && !mkdir($cur_path.'pages'))
  die ('Не удается создать директорию: '.$cur_path.'pages');

// пройдемся по страницам и попробуем их получить
foreach($pages as $url) {
  $url = (string) $url;
  $content = file_get_contents($url); // получаем
  if ($utf) $content = mb_convert_encoding($content, 'cp1251', 'utf8');
  if ($no_tags) $content = strip_tags($content); // убираем теги
  
  if (!isset($last_data[$url]) || $last_data[$url] != $content) { // нашли различие
    $fp = fopen($cur_path.'differences.log', 'a+');
    $log = date('Y.m.d H:i:s') . " Изменилась страница $url \r\n";
    fwrite($fp, $log);
    fclose($fp);
    
    // сохраним эту страницу
    $dirsave = $cur_path.'pages/'.date('Y.m.d H-00-00').'/';
    if (!is_dir($dirsave)) mkdir($dirsave); 
    $replacements = array();
    $replacements[] = '\\';
    $replacements[] = '/';
    $replacements[] = '&';
    $replacements[] = '?';
    $replacements[] = ':';
    $filename = str_replace($replacements, '_', $url);
    
    $fp = fopen($dirsave . $filename, 'w');
    fwrite($fp, $content);
    fclose($fp);
  }
    
  $last_data[$url] = $content; // запоминаем текущее состояние страницы
}

// сохраним текущее состояние
$fp = fopen($last_data_file, 'w');
fwrite($fp, serialize($last_data));
fclose($fp);
?>
 
Код:
$pages = array();
$pages[] = 'http://cms/';
$pages[] = 'http://cms/home/';
Массив заполняется из всех страниц в промежутке между Для просмотра ссылки Войди или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся
Или нужно вводить вручную?
Что нужно дописать что-бы скрипт брал страницы с сайта Для просмотра ссылки Войди или Зарегистрируйся на глубину вхождения 1, т.е. Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся...
 
Вот понадобилось, что-то вроде "слежки" за сайтом, а именно, надо скачивать с определённого сайта, в определённое время (ежедневного) определённые страницы, т.е. всю информацию и текст которые на этих страницах расположены.

Может кто посоветует как это лучше сделать? Просто каждый день в определённое время заходить и самому смотреть нету возможности. Так же нету возможно использования какого-нибудь софта, так что новерное подойдёт только скрипт.
А можно и при помощи софта - Website-Watcher
Возможности можно посмотреть в обзоре на Для просмотра ссылки Войди или Зарегистрируйся, который, правда, несколько устарел
 
Так же нету возможно использования какого-нибудь софта, так что новерное подойдёт только скрипт.
Поэтому Website-Watcher не подойдет. Сам ищу скрипт с подобным функционалом.
 
Что нужно дописать что-бы скрипт брал страницы с сайта Для просмотра ссылки Войди или Зарегистрируйся на глубину вхождения 1, т.е. Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся...

Изменил. Указываете домен и скрипт парсит первую страницу на предмет ссылок, а затем обрабатывает найденные ссылки на первой странице.

PHP:
<?

// НАСТРОЙКИ: 
$domain = 'site.ru'; // домен сайта
$utf = false; // поставьте true, если сайт в кодировке utf8 (в PHP должен быть подключен модуль mb_string)
$no_tags = true; // удалять все HTML-теги. Поставьте false, если не требуется

// ---------------------------------
// ЗАПУСКАЕМ ПРОВЕРКУ

$pages = array();
$cur_path = dirname(__FILE__).'/';
set_time_limit(0); // скрипт живет вечно
$last_data = array();
$last_data_file = $cur_path.'last_data.dat';

// возьмем первую страницу
$first_page = file_get_contents('http://'.$domain.'/');

// парсим на предмет ссылок
$matches = array();
if (!$first_page || !preg_match_all('#<a[^>]+href=["\']?([^\'" >]+)["\' >]?#sim', $first_page, $matches))
  die('Connection refused!');

$pages[] = 'http://'.$domain.'/';  
foreach($matches[1] as $link) {
  
  if (strpos($link, 'mailto:')!==false)
    continue;
    
  if (($k=strpos($link, '#'))!==false)
    $link = substr($link, 0, $k);
  
  if (strpos($link, 'http://')===false)
    $pages[] = 'http://'.$domain. '/' . ltrim($link, '/');  
  elseif(strpos($link, $domain)!==false)
    $pages[] = $link; 
}

$pages = array_unique($pages);

//возьмем предыдущую информацию, если она есть 
if (is_file($last_data_file)) {
  
  $file = file_get_contents($last_data_file);
  if ($file && ($k = @unserialize($file))) 
    $last_data = $k;
}

// создадим папку логов
if (!is_dir($cur_path.'pages') && !mkdir($cur_path.'pages'))
  die ('Не удается создать директорию: '.$cur_path.'pages');

// пройдемся по страницам и попробуем их получить
foreach($pages as $url) {
  $url = (string) $url;
  $content = file_get_contents($url); // получаем
  if ($utf) $content = mb_convert_encoding($content, 'cp1251', 'utf8');
  if ($no_tags) $content = strip_tags($content); // убираем теги
  
  if (!isset($last_data[$url]) || $last_data[$url] != $content) { // нашли различие
    $fp = fopen($cur_path.'differences.log', 'a+');
    $log = date('Y.m.d H:i:s') . " Изменилась страница $url \r\n";
    fwrite($fp, $log);
    fclose($fp);
    
    // сохраним эту страницу
    $dirsave = $cur_path.'pages/'.date('Y.m.d H-00-00').'/';
    if (!is_dir($dirsave)) mkdir($dirsave); 
    $replacements = array();
    $replacements[] = '\\';
    $replacements[] = '/';
    $replacements[] = '&';
    $replacements[] = '?';
    $replacements[] = ':';
    $filename = str_replace($replacements, '_', $url);
    
    $fp = fopen($dirsave . $filename, 'w');
    fwrite($fp, $content);
    fclose($fp);
  }
    
  $last_data[$url] = $content; // запоминаем текущее состояние страницы
}

// сохраним текущее состояние
$fp = fopen($last_data_file, 'w');
fwrite($fp, serialize($last_data));
fclose($fp);
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху