[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: CRON и парсер
Dinaris
Доброе время суток уважаемые гуру. Помогите кому не лень! Суть проблемы такова.
У меня есть файл parser.php вот его код:


<?php
include "parser_class.php";
$start=time();
$Parser = new Parser();
$Parser->connect_db();


$links_array = $Parser->get_links();

foreach($links_array as $row)
{
$temp_arr = explode(',',$row);
$Parser->get_advert_content($temp_arr[0],$temp_arr[1]);
}


$duration = time() - $start;
echo "Время выполнения: ".$duration." сек.";
$sql="INSERT INTO `ParserInfo` (`duration`) VALUES ('".$duration."')";
mysql_query($sql);

?>


вот код файла parser_class.php :


<?php
class
Parser
{
// Функция получения контента с помощью curl
public function http_request($url)

{

$curl_handler = curl_init($url);

curl_setopt($curl_handler, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($curl_handler);

curl_close($curl_handler);

return $response;

}

// Получет массив прокси серверов
public function get_proxy_list()
{
$content = $this->http_request('http://spys.ru/free-proxy-list/RU/');
var_dump($content);
exit();
preg_match_all("^<script type=\"text/javascript\">[.\t\v\r\n\s\w\W]{1,500}?;</script>^",$content,$result_array);
$arr = str_split(str_replace(';',';$',strip_tags($result_array[0][0])));
unset($arr[count($arr)-1]);
array_unshift($arr,'$');
$var_str='';
for($i=0;$i<count($arr);$i++)
{
$var_str.=$arr[$i];
}
$var_str = str_replace('^','^$',$var_str);
//echo $var_str;
eval ($var_str);

preg_match_all("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}<script[.\t\v\r\n\s\w\W]{1,500}\)</script>^",$content,$result_array);
for($i=0;$i<count($result_array[0]);$i++)
{
$str = str_replace("document.write(\":\"+","(",strip_tags($result_array[0][$i]));
$all_arr[] = $str;
}

foreach($all_arr as $row)
{
preg_match_all("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}^",$row,$temp_arr);
$ip_arr[] = $temp_arr[0][0];
}


foreach($all_arr as $index=>$value)
{
$str = str_replace($ip_arr[$index],'',$all_arr[$index]).';';
$str = str_replace('(','($',$str);
$str = str_replace('($(','((',$str);
$str = str_replace('+','.',$str);
$port_arr[] = str_replace('^','^$',$str);
}

//var_dump($ip_arr);
//var_dump($port_arr);
//exit();


foreach($ip_arr as $index=>$value)
{
// $proxy_arr[] = $ip_arr[$index].':'.eval('echo '.$port_arr[$index]);
eval('$temp_str = '.$port_arr[$index]);
$proxy_arr[] = $ip_arr[$index].':'.$temp_str;
//$proxy_arr[] = $temp_str;
}

return $proxy_arr;

}

// Возвращает стороку из подстроки от $from до $to
public function substr2($str,$from,$to)
{
$beg=strpos($str,$from);
$str=substr($str,$beg);
$end=strpos($str,$to);
$str=substr($str,0,$end+strlen($to));
if (!$beg&&!$end)
{
return false;
}
return $str;
}

// Получает контент через прокси сервер
public function get_content_with_proxy($url)
{

$proxy = '83.172.0.119:3128';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
curl_setopt($ch, CURLOPT_PROXY, "$proxy");
$ss=curl_exec($ch);
curl_close($ch);

return $ss;
}

// Преобразует телефоны в читаемый формат
public function make_tel($str)
{
$str=str_replace("(0552)","",$str);
$str=str_replace("(","",$str);
$str=str_replace(")","",$str);
$str=str_replace("-","",$str);
$str=str_replace("+","",$str);
$str=str_replace(" ","",$str);
$str=str_replace("O","0",$str);
$str=str_replace("o","0",$str);
$str=str_replace("?","0",$str);
$str=str_replace("О","0",$str);
$str=str_replace("о","0",$str);
$result = explode(',',$str);
foreach($result as $index=>$row)
{
if (preg_match("/^[3][8][0-9]{10}$/",$row)!=0)
{
$result[$index]=substr($row,2);
}
if (preg_match("/^[8][0-9]{10}$/",$row)!=0)
{
$result[$index]=substr($row,1);
}
if (!is_numeric($row))
{
unset($result[$index]);
}
}

return implode(',',$result);
}

// Функция для соединения с базой данных
public function connect_db()
{
$dbuser="Irr";
$dbpass="E5Q7zTwx";
$dbname="Irr";
$dbhost="localhost";
if (!@mysql_connect($dbhost, $dbuser, $dbpass)){
$this->errors[] = "Unable connect to database";
return false;
}
if (!@mysql_select_db($dbname)){
$this->errors[] = "Invalid database name";
return false;
}
mysql_query("SET NAMES utf8");
return true;
}
// Получает массив ссылок на объявления за сегодня
public function get_links()
{
$link_array=array("http://irr.ks.ua/126/","http://irr.ks.ua/127/","http://irr.ks.ua/125/","http://irr.ks.ua/128/",
"http://irr.ks.ua/129/","http://irr.ks.ua/117/","http://irr.ks.ua/118/","http://irr.ks.ua/119/",
"http://irr.ks.ua/120/","http://irr.ks.ua/121/","http://irr.ks.ua/122/","http://irr.ks.ua/123/",
"http://irr.ks.ua/135/","http://irr.ks.ua/136/","http://irr.ks.ua/137/","http://irr.ks.ua/141/",
"http://irr.ks.ua/140/","http://irr.ks.ua/139/","http://irr.ks.ua/143/","http://irr.ks.ua/144/",
"http://irr.ks.ua/145/","http://irr.ks.ua/146/","http://irr.ks.ua/147/","http://irr.ks.ua/199/",
"http://irr.ks.ua/201/");

// $link_array = array("http://irr.ks.ua/117/");
foreach($link_array as $value)
{

for ($i=1;$i<=100;$i++)
{
$link = $value.'page'.$i.'/size40/';
$content = $this->get_content_with_proxy($link);

preg_match_all("^<a class=\"advertHref\"[.\t\v\r\n\s\w\W]{1,500}?today^",$content,$result_array);

if (count($result_array[0])>0)
{

for($j=0;$j<count($result_array[0]);$j++)
{
preg_match("^href=\"/advert/[0-9]{7}/^",$result_array[0][$j],$href);
$hrefs_array[] = str_replace('href="/','http://irr.ks.ua/',$href[0]).','.$value;
}


}

else
{
preg_match_all("^<img src=\"http://irr.ks.ua/images/pushup_on.gif\" alt=\"Это объявление поднято. Узнайте больше об этой возможности.\" />^",$content,$result_array);
if (count($result_array[0])==0)
{
break;
}
}




}

}


return $hrefs_array;

}

// Функция парсит объявление и забивает данными базу
public function get_advert_content($url,$parent_url)
{
//-----------------------------------------Распределение по разделам и рубрикам-----------------------------------------------------------------//
switch($parent_url)
{
case "http://irr.ks.ua/125/":$razdel="Квартиры аренда";$rubrika="Однакомнатные";break;
case "http://irr.ks.ua/126/":$razdel="Квартиры аренда";$rubrika="Двухкомнатные";break;
case "http://irr.ks.ua/127/":$razdel="Квартиры аренда";$rubrika="Трёхкомнатные";break;
case "http://irr.ks.ua/128/":$razdel="Квартиры аренда";$rubrika="Четырёх и болеее комнатные";break;
case "http://irr.ks.ua/129/":$razdel="Квартиры аренда";$rubrika="Комнаты в Херсоне";break;
case "http://irr.ks.ua/117/":$razdel="Квартиры продажа";$rubrika="Однакомнатные";break;
case "http://irr.ks.ua/118/":$razdel="Квартиры продажа";$rubrika="Двухкомнатные";break;
case "http://irr.ks.ua/119/":$razdel="Квартиры продажа";$rubrika="Трёхкомнатные";break;
case "http://irr.ks.ua/120/":$razdel="Квартиры продажа";$rubrika="Четырёхкомнатные";break;
case "http://irr.ks.ua/121/":$razdel="Квартиры продажа";$rubrika="Другие";break;
case "http://irr.ks.ua/122/":$razdel="Квартиры продажа";$rubrika="В Херсонской области";break;
case "http://irr.ks.ua/123/":$razdel="Квартиры продажа";$rubrika="В других регионах";break;
case "http://irr.ks.ua/135/":$razdel="Коммерческая недвижимость";$rubrika="В Херсоне";break;
case "http://irr.ks.ua/136/":$razdel="Коммерческая недвижимость";$rubrika="В Херсонской области";break;
case "http://irr.ks.ua/137/":$razdel="Коммерческая недвижимость";$rubrika="В других регионах";break;
case "http://irr.ks.ua/141/":$razdel="Коммерческая недвижимость аренда";$rubrika="В Херсоне";break;
case "http://irr.ks.ua/140/":$razdel="Коммерческая недвижимость аренда";$rubrika="В Херсонской области";break;
case "http://irr.ks.ua/139/":$razdel="Коммерческая недвижимость аренда";$rubrika="В других регионах";break;
case "http://irr.ks.ua/143/":$razdel="Дома, дачи, участки продажа";$rubrika="Дома в Херсоне";break;
case "http://irr.ks.ua/144/":$razdel="Дома, дачи, участки продажа";$rubrika="Дома в Херсонской области";break;
case "http://irr.ks.ua/145/":$razdel="Дома, дачи, участки продажа";$rubrika="Участки";break;
case "http://irr.ks.ua/146/":$razdel="Дома, дачи, участки продажа";$rubrika="Дачи";break;
case "http://irr.ks.ua/147/":$razdel="Дома, дачи, участки продажа";$rubrika="В других регионах";break;
case "http://irr.ks.ua/199/":$razdel="Дома, дачи, участки аренда";$rubrika="В Херсоне и Херсонской области";break;
case "http://irr.ks.ua/201/":$razdel="Дома, дачи, участки аренда";$rubrika="В других регионах";break;
}

$content = $this->get_content_with_proxy($url);
preg_match_all("^<table class=\"renamed.customfields\"[.\t\v\r\n\s\w\W]{1,}?</table>^",$content,$result_array);
//var_dump($result_array);
//exit();

for($i=0;$i<count($result_array[0]);$i++)
{
//--------------------------------------- Район--------------------------------------------------------------//
preg_match_all("^<td align=\"left\" valign=\"middle\">[.\t\v\r\n\s\w\W]{1,100}</td>^",$result_array[0][$i],$temp);
// echo count($temp[0]).'<br>';
if (count($temp[0])>0)
{
//var_dump($temp);
//exit();

for($j=0;$j<count($temp[0]);$j++)
{
preg_match_all("^:^",$temp[0][$j],$temp2);
if (count($temp2[0])==0)
{
$rayon = strip_tags($temp[0][$j]);
}
}
}

//------------------------Текст--------------------------------------------------------------------- ---//
preg_match_all("^<p class=\"description\"[.\t\v\r\n\s\w\W\*]{1,5000}</div>^",$result_array[0][$i],$temp);
if (count($temp[0])>0)
{
$text = strip_tags($temp[0][0]);
}
//--------------------------------------Цена-------------------------------------------------------- ---//
preg_match_all("^<strong>Цена:</strong>[.\t\v\r\n\s\w\W]{1,50}</p>^",$result_array[0][$i],$temp);
if (count($temp[0])>0)
{
$price = strip_tags(str_replace('Цена:','',$temp[0][0]));
//echo $price;
}
//--------------------------------------Email------------------------------------------------------- ----//
preg_match_all("^<strong>E-mail:</strong>[.\t\v\r\n\s\w\W]{1,100}</a>^",$result_array[0][$i],$temp);
if (count($temp[0])>0)
{
$email = strip_tags(str_replace('E-mail:','',$temp[0][0]));
// echo $email;
}
}


if (!isset($rayon))
{
$rayon=null;
}
if (!isset($text))
{
$text=null;
}
if (!isset($price))
{
$price=null;
}
if (!isset($email))
{
$email=null;
}
if (!isset($contacts))
{
$contacts=null;
}

for($i=0;$i<count($result_array[0]);$i++)
{
//--------------------------------------Телефон----------------------------------------------------- ------//
if ($email==!null)
{
preg_match_all("^<strong>Тел:</strong>[.\t\v\r\n\s\w\W]{1,100}</p>^",$result_array[0][$i],$temp);
}
else
{
preg_match_all("^<strong>Тел:</strong>[.\t\v\r\n\s\w\W]{1,100}<br^",$result_array[0][$i],$temp);
}


if (count($temp[0])>0)
{
$contacts = strip_tags(str_replace('Тел:','',$temp[0][0]));
$contacts = str_replace(' ',',',$contacts);
$contacts = $this->make_tel($contacts);
}
}


if ($contacts==null)
{
for($i=0;$i<count($result_array[0]);$i++)
{
//--------------------------------------Телефон----------------------------------------------------- ------//

preg_match_all("^<strong>Тел:</strong>[.\t\v\r\n\s\w\W]{1,100}<br^",$result_array[0][$i],$temp);

if (count($temp[0])>0)
{
$contacts = strip_tags(str_replace('Тел:','',$temp[0][0]));
$contacts = str_replace(' ',',',$contacts);
$contacts = $this->make_tel($contacts);
}
}
}


if ($contacts==null)
{
for($i=0;$i<count($result_array[0]);$i++)
{
//--------------------------------------Телефон----------------------------------------------------- ------//

preg_match_all("^<strong>Тел:</strong>[.\t\v\r\n\s\w\W]{1,100}</p>^",$result_array[0][$i],$temp);

if (count($temp[0])>0)
{
$contacts = strip_tags(str_replace('Тел:','',$temp[0][0]));
$contacts = str_replace(' ',',',$contacts);
$contacts = $this->make_tel($contacts);
}
}
}


echo '<hr>';
echo "URL - ".$url.'<br>';
echo "Раздел - ".$razdel.'<br>';
echo "Рубрика - ".$rubrika.'<br>';
echo "Район - ".$rayon.'<br>';
echo "Текст - ".$text.'<br>';
echo "Цена - ".$price.'<br>';
echo "E-mail-".$email.'<br>';
echo "Контакты - ".$contacts.'<br>';
echo '<hr>';

$sql="SELECT * FROM `adverts` WHERE `razdel`='".$razdel."' AND `rubrika`='".$rubrika."' AND `rayon`='".$rayon."'
AND `text`='"
.$text."' AND `email`='".$email."' AND `contacts`='".$contacts."' AND `url`='".$url."'";


if ((mysql_num_rows(mysql_query($sql))==0) and ($razdel!=null) and ($text!=null) and ($contacts!=null))
{

$sql="INSERT INTO `adverts` (`razdel`,`rubrika`,`rayon`,`text`,`price`,`email`,`contacts`,`date`,`url`) VALUES ('".$razdel."',
'"
.$rubrika."',
'"
.$rayon."',
'"
.$text."',
'"
.$price."',
'"
.$email."',
'"
.$contacts."',
'"
.date("Y-m-d",time())."',
'"
.$url."')";

mysql_query($sql);

}

//var_dump($result_array);
}
}


?>


Я ставлю файл parser.php в задание для CRON. Задание запускается, парсер работает корректно но вот одна проблема при завершении работы я вставляю в таблицу 'ParserInfo'
длительность работы моего парсера и казалось бы это действие должно произойти один раз при завершении работы скрипта в файле parser.php, но судя по записям в таблице оно выполняется каждую минуту.
Я пробовал запустить парсер в браузере - он работает и в конце один раз пишет результат о длительности своей работы. Я пробовал закоментировать в файле parser.php строки, которые отвечают за сам парсинг и опять всё рабоатет как надо. В чём может быть проблема?
Извените за возможную тавталогию...



Спустя 46 минут, 26 секунд (20.12.2011 - 21:28) inpost написал(а):
Первое, что пришло в голову - крон у тебя дёргает этот файл раз в минуту smile.gif
Установи таймер на период, который тебе надо. Крон - это задачник, допустим каждое N-времени запускать...

Спустя 1 час, 16 минут, 8 секунд (20.12.2011 - 22:45) Dinaris написал(а):
Нет CRON настроен верно. Я в этом уже убедился вешеупомянутым способом.

Спустя 4 часа, 21 минута, 52 секунды (21.12.2011 - 03:06) vital написал(а):
Нафига нужен крон, если скрипт надо запустить один раз?
Если скрипт надо запускать по расписанию, то что не так?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.