PDA

Просмотр полной версии : PHP парсер + демон


[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 ключевых слов и обрабатывать их паралельно ... Зарание благодарю за помошь ...

ЗЫ За код прошу сильно не бить , только учусь :)

mailbrush
15.06.2009, 15:59
Код не смотрел, но скажу - многопоточности, как таковой, в ПХП нету.

mr.The
15.06.2009, 16:27
Код не смотрел, но скажу - многопоточности, как таковой, в ПХП нету.
Код не смотрел, но скажу - можно много потоков(запросов) обработать самим курлом. Ну а потом уже, в один поток отпарсить результаты. Правда поисковики нелюбят много запросов. Гугл особенно.

[NiGHT]DarkAngel
15.06.2009, 16:33
ну для этого в курле есть параметр прокси ... и при каждом запросе страничке можно подменить ип... сообственно говоря так это и работает

[NiGHT]DarkAngel
15.06.2009, 16:46
Если использовать мулти курл ... то получится такая ситуация ... я сгенерю пать страничек ... он их все получит ~ 250 Кб ... а нужный мне домен находиться на первой странничке .... получается все остальное он зря грузил ...

login999
15.06.2009, 16:59
Ты сам то понял, чего хочешь ?
Вот тебе код на Python, надеюсь поймёшь

import urllib
def Telepat(domain):
data = urllib.urlopen("http://mind.yandex.ru").read()
page_number = get_domain_postion_page(data)
return page_number

Pos = Get_Postion(page_number)
print Pos

Вот то что тебе нужно

mr.The
15.06.2009, 17:03
я сгенерю пать страничек ... он их все получит ~ 250 Кб ... а нужный мне домен находиться на первой странничке .... получается все остальное он зря грузил ...
тебе настолько жалко трафа? тогда либо юзай сторонние сервисы, либо другие языки.