Парсер Title и URL

Тема в разделе "Коммерческие", создана пользователем Gelik, 6 окт 2010.

Информация :
Публиковать (для всех) нуленые версии, особенно от modulesgarden КАТЕГОРИЧЕСКИ не стоит. Тема мониторится оным разработчиком, а к нам приходят абузы которые нельзя игнорировать.
Статус темы:
Закрыта.
Модераторы: Amazko, Aste
  1. Gelik

    Gelik Постоялец

    Регистр.:
    27 май 2009
    Сообщения:
    54
    Симпатии:
    2
    Подскажите решение для парсинга Title страниц сайта + что бы URL тоже спарсивал, нужно это для составление анкор листов да и еще много для чего пригодится.
    Хочется, что бы было так - Запускаешь парсер, указываешь ему адрес сайта, или страницу с xml картой сайта и парсер формирует текстовый файл со всеми ссылками + Title страниц сайта в таком виде -
    Title1|url страницы1
    Title2|url страницы2
    Title3|url страницы3
    Title4|url страницы4
    ...
    Я нашел одно решение на PHP, но он так тормозит сайт, когда его парсит, что сервер не выдерживает и ложится (хотя может это было случайное совпадение, но мне так не показалось)
    Вот его код -
    Код:
    <?php
        $url = "сюда пишем адрес на XML карту сайта";
        function FetchUrl($url, $postvars, $timeout, $ref, $blank){
        sleep($timeout);
        echo @date("r")." fetching $url \r\n";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT,30);
        curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_URL, trim($url));
        curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
        $result = curl_exec($ch);
        if($blank == "1"){
        $result = preg_replace("/\n/", "", $result);
        $result = preg_replace("/\r/", "", $result);
        }
        curl_close($ch);
        return $result;
        }
        $page = FetchUrl($url, NULL, NULL, NULL, NULL);
        preg_match_all("!<loc>(.*?)<\/loc>!si", $page, $out);
        foreach($out[1] as $link){
        $page = FetchUrl($link, NULL, NULL, NULL, NULL);
        preg_match("!<title>(.*?)<\/title>!si", $page, $tit);
        exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt");
        }
        ?>
    
    Подскажите, может код нужно както поправить, или у кого-нибудь есть уже готовое, нормально работающее решение?
     
  2. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    нормальное решение

    только непонятно какой сайт тормозит. Ты куда этот скрипт засунул?

    Если собираешься выполнять его при каждой загрузке страницы твоего сайта - конечно будет тормозить
     
  3. Gelik

    Gelik Постоялец

    Регистр.:
    27 май 2009
    Сообщения:
    54
    Симпатии:
    2
    Ну смотри, я этот скрипт запускаю на Денвере, он начинает работать, пока он работает, я захожу на свой сайт, который парсит скрипт, сайт жутко тормозит, потом смотрю, вроде скрипт подвис, захожу на сайт, который он парсил, а сайт уже не открывается )))
    Сам скрипт, как я понял, работает по такому принципу:
    - Скрипт идет по первой ссылке из XML карты, записывает (в кешь, или еще куда, я так и понял куда) Title и url
    - Идет по второй ссылке из XML карты, записывает Title и url
    - Идет по третьей ссылке из XML карты, записывает Title и url
    - И только в конце, когда прошел все страницы, он записывает спарсенные Title и url в файл.
    То есть срок выполнения скрипта очень долгий, приходится в php.ini денвера прописывать огромное значение в max_execution_time. Все это на мой взгляд не есть хорошо.
    Мне кажется, нужно доработать этот скрипт, что бы он работал так -
    - Скрипт идет по первой ссылке из XML карты, записывает Title и url сразу в файл, заканчивет работу.
    - Идет по второй ссылке из XML карты, записывает Title и url сразу в файл, заканчивет работу.
    - Идет по третьей ссылке из XML карты, записывает Title и url сразу в файл, заканчивет работу.
    .....
    Тогда наверное нагрузки такой не будет......
     
  4. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    в начале скрипта пропиши set_time_limit(0)

    На счет второго варианта -- можно и так, а разница?
    Если хостинг вешается от такого - это даже не говнохостинг, а фигня какая-то

    может у тебя просто узкий канал? Какой интернет ?

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

    подумай над этим

    Если уж очень надо - после того как подумаешь и отпишешь - можно сделать и твой вариант
     
  5. Gelik

    Gelik Постоялец

    Регистр.:
    27 май 2009
    Сообщения:
    54
    Симпатии:
    2
    По поводу
    Код:
    set_time_limit(0)
    - прописываю его после
    Код:
    $url =
    и вылазит ошибка
    Код:
    Parse error: syntax error, unexpected T_VARIABLE in
    - после in пишет следующий номер строки, тобишь в следующей строке ошибка эта. Вобщем в какую бы строку я не вставил
    Код:
    set_time_limit(0)
    , сразу вылазит эта ошибка и после in пишет следующий номер строки.

    Хостинг у меня Агава, тариф профи (типо самый мощный из виртуальных), короче, хостинг более чем хороший. Думаю не в хостинге дело.

    Инет широкий - 20 mbit/s

    Может, конечно, до сайта я не смог вчера достучаться из-за того, что были какиенить профилактические работы у Агавы, хрен знает.
    Но в любом случае, скрипт этот когда начинает работать, он очень медленно работает, хотя хрен знает.......блин, мне кажется, всетаки правильно бы было, что бы он работал по второму варианту, мне кажется проблемма как раз в том, что скрипт постоянно шлет запросы, может половину из них сервер банит, думает, что спам какой-нить или еще что, а скрипт опять их шлет.......как то так ))) а еслиб он послал запрос - записал результат - закончил работу(и т.д.), то былоб как то правильнее в любом случае..........кстати, попробуй плз. сам этот скрипт использовать на какомнить сайте.....мне кажется, ты сразу поймешь о чем я, как то он не правильно работает.....
     
  6. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    PHP:
    <?php
        set_time_limit
    (0);
        
    $url "сюда пишем адрес на XML карту сайта";
        function 
    FetchUrl($url$postvars$timeout$ref$blank){
        
    sleep($timeout);
        echo @
    date("r")." fetching $url \r\n";
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE);
        
    curl_setopt($chCURLOPT_HEADERfalse);
        
    curl_setopt($chCURLOPT_TIMEOUT,30);
        
    curl_setopt($chCURLOPT_ENCODING'gzip');
        
    curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
        
    curl_setopt($chCURLOPT_URLtrim($url));
        
    curl_setopt($chCURLOPT_AUTOREFERERTRUE);
        
    $result curl_exec($ch);
        if(
    $blank == "1"){
        
    $result preg_replace("/\n/"""$result);
        
    $result preg_replace("/\r/"""$result);
        }
        
    curl_close($ch);
        return 
    $result;
        }
        
    $page FetchUrl($urlNULLNULLNULLNULL);
        
    preg_match_all("!<loc>(.*?)<\/loc>!si"$page$out);
        foreach(
    $out[1] as $link){
        
    $page FetchUrl($linkNULLNULLNULLNULL);
        
    preg_match("!<title>(.*?)<\/title>!si"$page$tit);
        
    exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt");
        }
        
    ?>
    вообще одна только стрчока exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt"); порадовала )))
    кто писал ?
     
  7. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    после
    точку с запятой поставь
    PHP:
    set_time_limit(0);
     
  8. Gelik

    Gelik Постоялец

    Регистр.:
    27 май 2009
    Сообщения:
    54
    Симпатии:
    2
    Писал добрый человек, вот источник - http://www.zarabotay-s-nami.info/parsim-tajtly-sajta/

    Добавлено через 11 минут
    Вот блин, совсем уже съезжаю, спасибо ))))

    Добавлено через 46 минут
     
  9. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    попробуй так
    PHP:
    <?php 
        set_time_limit
    (0); 
        
    $url "сюда пишем адрес на XML карту сайта"
        function 
    FetchUrl($url$postvars$timeout$ref$blank){ 
        
    sleep($timeout); 
        echo @
    date("r")." fetching $url \r\n"
        
    $ch curl_init(); 
        
    curl_setopt($chCURLOPT_FOLLOWLOCATIONTRUE); 
        
    curl_setopt($chCURLOPT_HEADERfalse); 
        
    curl_setopt($chCURLOPT_TIMEOUT,30); 
        
    curl_setopt($chCURLOPT_ENCODING'gzip'); 
        
    curl_setopt($chCURLOPT_RETURNTRANSFERTRUE); 
        
    curl_setopt($chCURLOPT_URLtrim($url)); 
        
    curl_setopt($chCURLOPT_AUTOREFERERTRUE); 
        
    $result curl_exec($ch); 
        if(
    $blank == "1"){ 
        
    $result preg_replace("/\n/"""$result); 
        
    $result preg_replace("/\r/"""$result); 
        } 
        
    curl_close($ch); 
        return 
    $result
        } 
        
    $page FetchUrl($urlNULLNULLNULLNULL); 
        
    preg_match_all("!<loc>(.*?)<\/loc>!si"$page$out); 

        
    $fp=fopen("pars_title.txt","w");

        foreach(
    $out[1] as $link){ 
        
    $page FetchUrl($linkNULLNULLNULLNULL); 
        
    preg_match("!<title>(.*?)<\/title>!si"$page$tit); 
        
    //exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt"); 
        
    fwrite($fp,$link."|".trim($tit[1])."\r\n");
        } 
        
    fclose($fp);
        
    ?>
    вообще своеобразный стиль )))
     
    Gelik нравится это.
  10. Gelik

    Gelik Постоялец

    Регистр.:
    27 май 2009
    Сообщения:
    54
    Симпатии:
    2
    Спасибо, работает, как часы
     
Статус темы:
Закрыта.