<?php
//*************************************************************************
// base_web_api.php : implementation file
// Version : 1.0
// Date : December 2013
// Author : Andre Dolenko
// Email : bigfozzy@gmail.com
// Latest Version : http://x-datas.com/
//*************************************************************************
//////////////////////////////////////////////////// BasedWebPAI /////////////////////////////////////////////////////////////////////////
class CBaseWebAPI
{
///////////////////////////////////////////////////
// запрашиваемый урл с параметрами
var $requested_url = null ;
// путь для записи результатов
var $out_path="out/results.txt";
// пауза после удачного запроса
var $pause_per_request=2;
// пауза после наудачных запросов
var $pause_bad_request=7;
// использовать ли прокси при запросе
var $use_proxy=true;
// максимальное время запроса через прокси
var $proxy_timeout=10;
// параметр - текущий запрос
var $current_query;
// дополнительный параметр - сайт
var $site="localhost";
// прокси через который было получение
var $proxy=null;
// промежуточные результаты 1
var $body;
///////////////////////////////////////////////////
// конструктор
function CBaseWebAPI($out_path,$pause_per_request,$pause_bad_request,$use_proxy,$proxy_timeout)
{
// файл для записи выходных результатов
$this->out_path=$out_path;
// пауза между запросами
$this->pause_per_request=$pause_per_request;
// пауза если наш запрос был забанен или прокси не справился
$this->pause_bad_request=$pause_bad_request;
// использовать ли пркоси
$this->use_proxy=$use_proxy;
// максимальнео время работы через прокси
$this->proxy_timeout=$proxy_timeout;
}
///////////////////////////////////////////////////
// зададим прокси
protected function set_proxy($ch)
{
// зададим прокси в запрос
if ($this->use_proxy)
{
// получим прокси от поставщика проксей
global $proxies;
$this->proxy=$proxies->get_current_proxy();
// зададим прокси
curl_setopt($ch, CURLOPT_PROXY, $this->proxy->get());
// таймаут (время за котрое прокси должно справится)
curl_setopt($ch, CURLOPT_TIMEOUT, $this->proxy_timeout);
// лог
global $log;
$log->event_add(" [ ".$this->proxy->get()." ] ");
}
}
// выполним запрос
protected function init_query($query)
{
// текущий запрос
$this->current_query=$query;
// API url
$url=$this->requested_url.urlencode(iconv("windows-1251","utf-8//IGNORE",$this->current_query));
// запрос
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $this->site);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
// вернем подготовленный запрос
return $ch;
}
// выполним запрос
protected function run_query($ch)
{
// зададим прокси
$this->set_proxy($ch);
// выполниить запрос
$this->body = curl_exec($ch);
// убрать из запроса лишнее
$this->body=str_replace("\t","",$this->body);
$this->body=str_replace("\r","",$this->body);
$this->body=str_replace("\n","",$this->body);
// преобработать запрос
$this->pre_procced_results();
}
// убрать из запроса лишнее
protected function pre_procced_results()
{
}
// проверить правильно ли прошел запрос
protected function is_query_good()
{
$res = ($this->body=="")==0;
return $res;
}
// лог плохого запроса
protected function log_bad_query()
{
// событие статуса неудачи
global $log;
if ($this->body=="")
$log->event_add(" E ");
else
$log->event_add(" B ");
}
///////////////////////////////////////////////////
// сделать запрос поисковых результатов через Google API
function get($query)
{
// начало события
global $log;
$log->event_begin("обрабатываем $query : ");
// инициализируем запрос
$ch=$this->init_query($query);
// выполним запрос
$this->run_query($ch);
// цикл пока не достучимся - с заданной паузой
$num_bad=0;
while ( !$this->is_query_good() )
{
// лог
$this->log_bad_query();
// прокси не сработал
if ($this->proxy)
$this->proxy->report(0);
// пауза
sleep($this->pause_bad_request);
// условие выхода
$num_bad++;
if ($num_bad>50)
die("Превышено число плохих запросов");
// перезапрос
$this->run_query($ch);
}
// прокси сработал
if ($this->proxy)
$this->proxy->report(1);
// закроем запрос
curl_close($ch);
// отработали успешно
return true;
}
///////////////////////////////////////////////////
// сохранить обработанные поисковые результаты в файл
function save()
{
return true;
}
// сохранить обработанные поисковые результаты в файл
function run()
{
// пройдемся по всем запросам
$queries_proceeded=1;
while (true)
{
// получим запрос
global $queries;
$query=$queries->get_next();
if ($query===null)
break;
// получим поисковые результаты для запроса через Google API (используя прокси)
if ($this->get($query))
{
// добавим поисковые результаты по заданному запросу в файл
$this->save();
}
// укажем что данные обработаны
$queries->step_complete();
// укажем общее количество обработанных данных
$queries_proceeded++;
// пауза между запросами
sleep($this->pause_per_request);
}
// конец
global $log;
$log->event("Получено поисковых результатов по ".$queries_proceeded." запросам ");
}
///////////////////////////////////////////////////
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?>