Парсер Title и URL

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

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");
    }
    ?>
Подскажите, может код нужно както поправить, или у кого-нибудь есть уже готовое, нормально работающее решение?
 
нормальное решение

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

Если собираешься выполнять его при каждой загрузке страницы твоего сайта - конечно будет тормозить
 
нормальное решение
только непонятно какой сайт тормозит. Ты куда этот скрипт засунул?
Если собираешься выполнять его при каждой загрузке страницы твоего сайта - конечно будет тормозить
Ну смотри, я этот скрипт запускаю на Денвере, он начинает работать, пока он работает, я захожу на свой сайт, который парсит скрипт, сайт жутко тормозит, потом смотрю, вроде скрипт подвис, захожу на сайт, который он парсил, а сайт уже не открывается )))
Сам скрипт, как я понял, работает по такому принципу:
- Скрипт идет по первой ссылке из 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 сразу в файл, заканчивет работу.
.....
Тогда наверное нагрузки такой не будет......
 
прописывать огромное значение в max_execution_time

в начале скрипта пропиши set_time_limit(0)

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

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

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

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

Если уж очень надо - после того как подумаешь и отпишешь - можно сделать и твой вариант
 
в начале скрипта пропиши set_time_limit(0)
На счет второго варианта -- можно и так, а разница?
Если хостинг вешается от такого - это даже не говнохостинг, а фигня какая-то
может у тебя просто узкий канал? Какой интернет ?
потому что вешать такой скрипт тот сайт который парсит не может, а тормоза как вариан из-за того что твой канал забивается - и то вариант если ты на диалапе сидишь
подумай над этим
Если уж очень надо - после того как подумаешь и отпишешь - можно сделать и твой вариант

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

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

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

Может, конечно, до сайта я не смог вчера достучаться из-за того, что были какиенить профилактические работы у Агавы, хрен знает.
Но в любом случае, скрипт этот когда начинает работать, он очень медленно работает, хотя хрен знает.......блин, мне кажется, всетаки правильно бы было, что бы он работал по второму варианту, мне кажется проблемма как раз в том, что скрипт постоянно шлет запросы, может половину из них сервер банит, думает, что спам какой-нить или еще что, а скрипт опять их шлет.......как то так ))) а еслиб он послал запрос - записал результат - закончил работу(и т.д.), то былоб как то правильнее в любом случае..........кстати, попробуй плз. сам этот скрипт использовать на какомнить сайте.....мне кажется, ты сразу поймешь о чем я, как то он не правильно работает.....
 
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($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");
    }
    ?>

вообще одна только стрчока exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt"); порадовала )))
кто писал ?
 
вообще одна только стрчока exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt"); порадовала )))
кто писал ?

Писал добрый человек, вот источник - Для просмотра ссылки Войди или Зарегистрируйся

Добавлено через 11 минут
точку с запятой поставь

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

Добавлено через 46 минут
PHP:
вообще одна только стрчока  exec("echo '".$link."|".trim($tit[1])."' >> pars_title.txt"); порадовала ))) 
кто писал ?[/QUOTE]

C set_time_limit(0); скрипт первый раз смог полностью спарсить всю карту сайта, но вот блин, опять незадача ))) скрипт не сохранил результаты в файл, тоесть файл то он создал и создал его прям в начале своей работы, а вот результаты, после завершения работы, в него не записал......
 
попробуй так
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($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); 

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

    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"); 
    fwrite($fp,$link."|".trim($tit[1])."\r\n");
    } 
    fclose($fp);
    ?>

вообще своеобразный стиль )))
 
попробуй так
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($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); 
    $fp=fopen("pars_title.txt","w");
    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"); 
    fwrite($fp,$link."|".trim($tit[1])."\r\n");
    } 
    fclose($fp);
    ?>
вообще своеобразный стиль )))

Спасибо, работает, как часы
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху