[NiGHT]DarkAngel
15.06.2009, 15:55
Есть парсер на php
{
/*Сколько страниц парсим*/
$max_str=5;
/*Начальная позиция*/
$cur_str=0;
/*Флаг о том что ненайдена позиция*/
$found=false;
//Преобразуем ключевик для яндекса
$keyword_enc = urlencode($key_word);
//Инициализируем счетчик
$position = 0;
/*Список прокси серверов для парсинга*/
$proxy=Array();
//Формируем Cookie для региона
$cookie="";
while(($cur_str<$max_str) && ($found!=true))
{
$i_proxy = rand(0,5)+1;
$content="";
$ch = curl_init("http://yandex.ru/yandsearch?p=$cur_str&text=$keyword_enc");
$curlOptions = array(CURLOPT_HEADER => 0,
CURLOPT_NOBODY => 0,
CURLOPT_VERBOSE => 1,
CURLOPT_RETURNTRANSFER => 0,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_POST => 0,
CURLOPT_PROXY=>$proxy[$i_proxy],
CURLOPT_COOKIE => $cookie,
CURLOPT_POSTFIELDS => $queryBody);
$content = position::curl_connect($curlOptions,$ch);
if($content!="")
{
$total=preg_match_all('#.*<a tabindex="(.*?)" onmousedown="(.*?)" href="(.*?)" target="(.*?)">.#i', $content, $forms );
$cur_match=0;
//echo $content."<br>";
//echo "Total = ".$total."<br>";
while($cur_match!=$total)
{
$position++;
$tmp=preg_match('#http://(.*?)/#i',$forms[3][$cur_match],$domains);
if(substr($domains[1],0,4) == "www.")
{
$cur_domain = substr($domains[1],4,strlen($domains[1]));
}
else
{
$cur_domain = $domains[1];
}
if($cur_domain==$site_domain)
{
$found=true;
break;
}
$cur_match++;
}
}
$cur_str++;
}
if($found==false)
{
$position = 0;
}
return $position;
}
Функция curl_connect
function curl_connect($curlOptions,$ch)
{
/*Устанавливаем опции для curl*/
curl_setopt_array($ch, $curlOptions);
/*Инициализируем буфер вывода*/
ob_start();
/*Получаем страничку*/
curl_exec($ch);
/*Заносим значения буфера в переменную*/
$content = ob_get_contents();
/*Закрываем соединение curl'a*/
curl_close($ch);
/*Очищаем буфер*/
ob_end_clean();
return $content;
}
Бегает он получает странички,собирает позиции :) работает вообщем как надо... но одно НО , уж слишком медленно все и долго занимается время парсить допустим около 1000 слов ... хотелось бы узнать есть какие-то способы сделать многопоточным этот процесс и демонизировать ... ну про демонизацию я нашел инфу, читаю ... а вот с многопоточностью не ясно ... вариант это делать или нет ... на данный момент он берет из базы по 1 слову и ишет в яндексе его , если поставить например 5 слов за раз ... то это уже получается большая нагрузка на сервер и скрипт не успевает обработаться и вываливается ошибка о времени выполнения скрипта,set_time_limit(0) не помогает ... да и все равно это будет очень и очень долго ... соответственно задача вот в чем ... хотелось бы например брать сразу по 10-20 ключевых слов и обрабатывать их паралельно ... Зарание благодарю за помошь ...
ЗЫ За код прошу сильно не бить , только учусь :)
{
/*Сколько страниц парсим*/
$max_str=5;
/*Начальная позиция*/
$cur_str=0;
/*Флаг о том что ненайдена позиция*/
$found=false;
//Преобразуем ключевик для яндекса
$keyword_enc = urlencode($key_word);
//Инициализируем счетчик
$position = 0;
/*Список прокси серверов для парсинга*/
$proxy=Array();
//Формируем Cookie для региона
$cookie="";
while(($cur_str<$max_str) && ($found!=true))
{
$i_proxy = rand(0,5)+1;
$content="";
$ch = curl_init("http://yandex.ru/yandsearch?p=$cur_str&text=$keyword_enc");
$curlOptions = array(CURLOPT_HEADER => 0,
CURLOPT_NOBODY => 0,
CURLOPT_VERBOSE => 1,
CURLOPT_RETURNTRANSFER => 0,
CURLOPT_FOLLOWLOCATION => 0,
CURLOPT_POST => 0,
CURLOPT_PROXY=>$proxy[$i_proxy],
CURLOPT_COOKIE => $cookie,
CURLOPT_POSTFIELDS => $queryBody);
$content = position::curl_connect($curlOptions,$ch);
if($content!="")
{
$total=preg_match_all('#.*<a tabindex="(.*?)" onmousedown="(.*?)" href="(.*?)" target="(.*?)">.#i', $content, $forms );
$cur_match=0;
//echo $content."<br>";
//echo "Total = ".$total."<br>";
while($cur_match!=$total)
{
$position++;
$tmp=preg_match('#http://(.*?)/#i',$forms[3][$cur_match],$domains);
if(substr($domains[1],0,4) == "www.")
{
$cur_domain = substr($domains[1],4,strlen($domains[1]));
}
else
{
$cur_domain = $domains[1];
}
if($cur_domain==$site_domain)
{
$found=true;
break;
}
$cur_match++;
}
}
$cur_str++;
}
if($found==false)
{
$position = 0;
}
return $position;
}
Функция curl_connect
function curl_connect($curlOptions,$ch)
{
/*Устанавливаем опции для curl*/
curl_setopt_array($ch, $curlOptions);
/*Инициализируем буфер вывода*/
ob_start();
/*Получаем страничку*/
curl_exec($ch);
/*Заносим значения буфера в переменную*/
$content = ob_get_contents();
/*Закрываем соединение curl'a*/
curl_close($ch);
/*Очищаем буфер*/
ob_end_clean();
return $content;
}
Бегает он получает странички,собирает позиции :) работает вообщем как надо... но одно НО , уж слишком медленно все и долго занимается время парсить допустим около 1000 слов ... хотелось бы узнать есть какие-то способы сделать многопоточным этот процесс и демонизировать ... ну про демонизацию я нашел инфу, читаю ... а вот с многопоточностью не ясно ... вариант это делать или нет ... на данный момент он берет из базы по 1 слову и ишет в яндексе его , если поставить например 5 слов за раз ... то это уже получается большая нагрузка на сервер и скрипт не успевает обработаться и вываливается ошибка о времени выполнения скрипта,set_time_limit(0) не помогает ... да и все равно это будет очень и очень долго ... соответственно задача вот в чем ... хотелось бы например брать сразу по 10-20 ключевых слов и обрабатывать их паралельно ... Зарание благодарю за помошь ...
ЗЫ За код прошу сильно не бить , только учусь :)