Как обновлять турнирную таблицу?

Тема в разделе "NewsGrabber", создана пользователем seryoga, 27 ноя 2011.

  1. seryoga

    seryoga Создатель

    Регистр.:
    12 сен 2006
    Сообщения:
    17
    Симпатии:
    33
    Подскажите пожалуйста каким готовым бесплатным скриптом я могут воспользоваться для решения следующей задачи.

    Мне нужно создать страницу, которая постоянно обновляется автоматически, забирая контент с другого сайта.

    Поясню конкретней. Мне нужно, чтобы у меня все время была свежая хоккейная турнирная таблица, обновляемая автоматом. Разумеется, старая таблица при этом должна удаляться. В первую очередь интересует можно ли это реализовать для WP, если нет то можно ли для других движков?
     
  2. drozden

    drozden Писатель

    Регистр.:
    14 фев 2007
    Сообщения:
    5
    Симпатии:
    0
    У меня когда-то такой стоял, работал хорошо.
    PHP:
    <?
    function 
    get_URL_by_socket ($host,$path) {
    //Получает URL $path с хоста $host через сокеты.
    $fp fsockopen($host80);
    if (!
    $fp) {
      die (
    "Не могу получить данные с url http://$host/$path");
    }
    else {
      
    $out "GET $path HTTP/1.0\r\n";
      
    $out .= "Accept: image/gif, application/xhtml+xml, */*\r\n";
      
    $out .= "Accept-Language: ru\r\n";
      
    $out .= "Host: $host\r\n";
      
    //Имитируем браузер Opera Mini:
      
    $out .= "User-Agent: Opera/8.01 (J2ME/MIDP; ".
      
    "Opera Mini/2.0.4509/1716; ru; U; ssr)\r\n";
      
    $out .= "Cache-Control: no-cache\r\n"//Не кэшировать
      
    $out .= "Connection: Close\r\n\r\n";
      
    fwrite($fp$out);
      
    $headers "";
      while (
    $str trim(fgets($fp)))
      
    $headers .= "$str\n";
      
    $body "";
      while (!
    feof($fp))
      
    $body .= fgets($fp);
      
    fclose($fp);
    }
    return 
    $body;
    }
    function 
    process($str,$start,$end,$include) {
    //Парсит полученный файл - здесь-то и пишется главное
    //У нас это извлечение содержимого от $start до $end
    $str1=strpos ($str,$start);
    $str2=strpos ($str,$end);
    if (!
    is_integer($str1)) {
      return 
    "Не найден начальный сегмент: ".htmlspecialchars($start);
    }
    if (!
    is_integer($str2)) {
      return 
    "Не найден конечный сегмент: ".htmlspecialchars($end);
    }
    if (
    $str1>$str2) {
      return 
    "Конечный сегмент предшествует начальному";
    }
    if (
    $include) { //Включать начало и конец
      
    return substr ($str,$str1,$str2-$str1+strlen($end));
    }
    else { 
    //Исключить начало и конец
      
    $str1+=strlen($start);
    return 
    substr ($str,$str1,$str2-$str1);
    }
    }
    function 
    parser ($host,$path,$start,$end,$include) {
    //Основной вызов парсера:
    //$host, $path - хост без http://www. и путь к файлу, начиная с /
    //$start, $end - строки начала и конца извлекаемого содержимого
    //$include - если true, включать в вывод строки $start и $end
    static $first=true;
    $strget_URL_by_socket ($host,$path);
    if (
    $first) {  //Заголовок посылается только при 1-м вызове
    }
    return 
    process($str,$start,$end,$include);
    }
    $str=parser ("fc-elets.ru","/index.php/tournament/ranking/1-chernozemje",
    "<!-- content -->","<!-- matchdays pageNav -->",false);
    $str iconv("UTF-8""CP1251" $str);
    echo(
    '<table width=500 border=1><th><td>')  ;
    print 
    $str;
    echo (
    '</td></th></table>')
    ?>
     
  3. idimka

    idimka

    Регистр.:
    31 авг 2007
    Сообщения:
    218
    Симпатии:
    51
    PHP:
    <?php
    function getPage$url )
      {global 
    $id;
      
    $ch curl_init();
      
    curl_setopt ($chCURLOPT_URL,$url);
      
    curl_setopt ($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); //агент которым мы представимся
      
    curl_setopt ($chCURLOPT_TIMEOUT15 ); // таймаут
      
    curl_setopt ($chCURLOPT_FOLLOWLOCATION0);
      
    curl_setopt ($chCURLOPT_RETURNTRANSFER1);
      
    $result curl_exec ($ch);
      
    curl_close($ch);
      
    //если с кодировкой проблемы
        
    if (preg_match('//u'$result))//проверяем кодировку файла, если utf-8 то меняем кодировку
        
    {$result=iconv("utf-8""cp1251"$result);
        
    $result str_replace ('charset=windows-1251','',$result);}
     
      return 
    $result//возвращаем  полученную страницу
      
    }
    $getPage getPage ($id);
     
    ?>
    дальше искать позиции элементов С которых и ДО которых вывести данные, например:
    PHP:
    $pos1 strpos ($getPage,'<div id="12345">');//все что до него оставить
    $pos2 strpos ($getPage,'</div>',$pos1);//все что после него - вырезать
    echo substr ($getPage,$pos1,$pos2);//вывести результат
     
    drozden нравится это.
  4. drozden

    drozden Писатель

    Регистр.:
    14 фев 2007
    Сообщения:
    5
    Симпатии:
    0
    Спасибо за интересный вариант, а каким образом можно всё это награбленое сохранять в файл, откуда информацию (турнирную таблицу ту же) будет брать другой простенький скрипт уже со странички сайта, хотя бы даже через include?
    Чтобы при наличии cron не перегружать сайт.
     
  5. idimka

    idimka

    Регистр.:
    31 авг 2007
    Сообщения:
    218
    Симпатии:
    51
    В предыдущем коде строчку:
    PHP:
    echo substr ($getPage,$pos1,$pos2);//вывести результат
    на:
    PHP:
    $getPage substr ($getPage,$pos1,$pos2);
    потом добавить:
    PHP:
      $file fopen ("table.txt","r+");//открыть для чтения и записи file.txt
      
    if ( !$file )
      {
        echo(
    "Ошибка открытия файла");
      }
      else
      {
        
    fwrite $file$getPage);//запись того, что спарсено
      
    }
      
    fclose ($file);
    можно дополнительно и этот скрипт поставить на крон, а не инкулидить, чтобы каждый раз при перезагрузки страницы файл "table.txt" не обновлялся.
    Либо добавить проверку на дату создания файла и обновлять тока раз в день...
     
    drozden нравится это.