Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2014, 22:08   #1
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
Смущение Спайдер, имитация работы браузера

Доброго времени суток! Появилась задачка написать спайдер, который будет залезать в подкатегории и считывать информацию(минимальную цену, айди) c 'этогоhttp://www.pricegrabber.com/cameras/ сайта. Возникла следующая проблема. Страничка с товаром отображает ассортимент постранично, а урл этих страничек генерируется где то на сайте(выцеплял запрос на переход странички, один из параметров генерируется динамически). Отсюда пришел к выводу, что проще сымитировать работу браузера и тогда в командной строке будет достаточно просто указать номер страницы...однако как это сделать? для подключения использую curl, настройки использую следующие:
PHP код:
        function getContent($url '')
        {
            
$uagent "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36";
            if(
$url == '')
            {
                
$ch curl_init($this->m_url);
            }
            else
            {
                
$ch curl_init$url );    
            }
            
$url_1 '/analytics.php?page=home_photo&topcat=11';
            
$headers = array(
                
//'GET ' . $url_1 . ' HTTP/1.1',
                
'Host' 'www.pricegrabber.com',
                
'Accept: */*',
                
'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4'
            
);
            
curl_setopt($chCURLOPT_RETURNTRANSFER1); // возвращает веб-страницу
            
curl_setopt($chCURLOPT_USERAGENT$uagent);
            
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
            
curl_setopt($chCURLOPT_SSL_VERIFYHOST1);
            
curl_setopt($chCURLOPT_HEADER0); // не возвращает заголовки   
            
curl_setopt($chCURLOPT_HTTPHEADER$headers);
            
curl_setopt($chCURLOPT_FOLLOWLOCATION1); // переходит по редиректам
            
curl_setopt($chCURLOPT_ENCODING""); // обрабатывает все кодировки
            
curl_setopt($chCURLOPT_MAXREDIRS10); // останавливаться после 10-ого редиректа
            
curl_setopt($chCURLOPT_COOKIEFILE,  $GLOBALS['cookie_file']);
            
curl_setopt($chCURLOPT_COOKIEJAR,  $GLOBALS['cookie_file']);
            
curl_setopt($chCURLOPT_AUTOREFERER1);
            
curl_setopt($chCURLOPT_REFERER"http://www.pricegrabber.com/cameras/");
            
curl_setopt($chCURLOPT_TIMEOUT30);

            
$content curl_exec$ch );
            
$err curl_errno$ch );
            
$errmsg curl_error$ch );
            
$header curl_getinfo$ch );
            
curl_close$ch );
            
sleeprand(2,10) );
            
$header['errno'] = $err;
            
$header['errmsg'] = $errmsg;
            
$header['content'] = $content;
            return 
$content;
        } 
Но ему и этого недостаточно. Прошу вашей помощи
Yoh вне форума Ответить с цитированием
Старый 30.03.2014, 14:00   #2
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Радость

Вот как у меня получилось, сначала заходим на первую страницу категории, получаем все необходимые данные и дальше уже можем свободно перемещатся по страницам, просто указывая номер.

PHP код:
<?php
function getContent($url ''

    
$uagent "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36"
    
    if(
$url == ''
    { 
        
$ch curl_init($this->m_url); 
    } 
    else 
    { 
        
$ch curl_init($url);     
    }
    
    
$url_1 '/analytics.php?page=home_photo&topcat=11';
    
    
$headers = array( 
        
//'GET ' . $url_1 . ' HTTP/1.1', 
        
'Host' 'www.pricegrabber.com'
        
'Accept: */*'
        
'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4' 
    
);
    
    
$cookie_file 'cook.txt';
    
    
curl_setopt($chCURLOPT_RETURNTRANSFER1); // возвращает веб-страницу 
    
curl_setopt($chCURLOPT_USERAGENT$uagent); 
    
curl_setopt($chCURLOPT_SSL_VERIFYPEER0); 
    
curl_setopt($chCURLOPT_SSL_VERIFYHOST2); 
    
curl_setopt($chCURLOPT_HEADER0); // не возвращает заголовки    
    
curl_setopt($chCURLOPT_HTTPHEADER$headers); 
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1); // переходит по редиректам 
    
curl_setopt($chCURLOPT_ENCODING""); // обрабатывает все кодировки 
    
curl_setopt($chCURLOPT_MAXREDIRS10); // останавливаться после 10-ого редиректа 
    
curl_setopt($chCURLOPT_COOKIEFILE,  $cookie_file); 
    
curl_setopt($chCURLOPT_COOKIEJAR,  $cookie_file); 
    
curl_setopt($chCURLOPT_AUTOREFERER1); 
    
curl_setopt($chCURLOPT_REFERER"http://www.pricegrabber.com/cameras/"); 
    
curl_setopt($chCURLOPT_TIMEOUT30); 

    
$content curl_exec($ch);
    
$err curl_errno($ch);
    
$errmsg curl_error($ch);
    
$header curl_getinfo($ch);
    
    
curl_close($ch);
    
    
//sleep( rand(2,10) );
    
    
$header['errno'] = $err
    
$header['errmsg'] = $errmsg
    
$header['content'] = $content;
    
    return 
$content
}
if(!
file_exists('cat.html')){
    
$data getContent('http://www.pricegrabber.com/cameras/digital/p-48');
    
file_put_contents('cat.html'$data);
}else{
    
$data file_get_contents('cat.html');
}
if(!empty(
$data)){
    
// шаблон для поиска ID страницы
    
$page_id "/page_id=(\d+)/";
    
    
// шаблон для поиска cat_id
    
$cat_id "/\"cat_id\":(\d+)/";
    
    
// шаблон для поиска topcat_id
    
$topcat_id "/topcat_id=(\d+)/";
    
    
// шаблон для поиска catzero_id
    
$catzero_id "/catzero_id=(\d+)/";
    
    
// шаблон для поиска filters_sid
    
$filters_sid "/\"filters_sid\":\"(\w+)\"/";
    
    
// шаблон для поиска search_id
    
$search_id "/search_id=(\w+);/";
    
    
// шаблон для поиска количества доступных страниц
    
$count "/paginate\((\d+)\)/";
    
    
// производим поиск page_id
    
preg_match($page_id$data$maches);
    
    if(isset(
$maches[1])){
        
$page_id $maches[1];
    }else{
        return 
false;
    }
    
    echo 
"ID: ".$page_id."\n";
    
    
// производим поиск cat_id
    
preg_match($cat_id$data$maches);
    
    if(isset(
$maches[1])){
        
$cat_id $maches[1];
    }else{
        return 
false;
    }
    
    
// производим поиск topcat_id
    
preg_match($topcat_id$data$maches);
    
    if(isset(
$maches[1])){
        
$topcat_id $maches[1];
    }else{
        return 
false;
    }
    
    
// производим поиск catzero_id
    
preg_match($catzero_id$data$maches);
    
    if(isset(
$maches[1])){
        
$catzero_id $maches[1];
    }else{
        return 
false;
    }

    
// производим поиск filters_sid
    
preg_match($filters_sid$data$maches);
    
    if(isset(
$maches[1])){
        
$filters_sid $maches[1];
    }else{
        return 
false;
    }
    
    
// производим поиск filters_sid
    
preg_match($search_id$data$maches);
    
    if(isset(
$maches[1])){
        
$search_id $maches[1];
    }else{
        return 
false;
    }
    
    
// производим поиск count
    
preg_match_all($count$data$maches);
    
    if(isset(
$maches[1])){
        
$count $maches[1];
        
$count array_unique($count);
        
$count array_pop($count);
    }else{
        return 
false;
    }
    
    echo 
"COUNT: ".$count."\n";
    
    
//Указываем номер страницы
    
$page 3;
    
    
$url "http://www.pricegrabber.com/ajax_product_search.php?action=setPage&page=".$page."&request_offset=24&filters_sid=".$filters_sid."&layout=grid&cat_id=".$cat_id."&search_id=".$search_id."&endcap_results=0&tls=3&page_id=".$page_id."&0iv=10&view=pglean&topcat_id=".$topcat_id."&catzero_id=".$catzero_id."";
    
    
$data getContent($url);
    
    
file_put_contents('page-'.$page.'.html'$data);
    
    
//Указываем номер страницы
    
$page 4;
    
    
$url "http://www.pricegrabber.com/ajax_product_search.php?action=setPage&page=".$page."&request_offset=24&filters_sid=".$filters_sid."&layout=grid&cat_id=".$cat_id."&search_id=".$search_id."&endcap_results=0&tls=3&page_id=".$page_id."&0iv=10&view=pglean&topcat_id=".$topcat_id."&catzero_id=".$catzero_id."";
    
    
$data getContent($url);
    
    
file_put_contents('page-'.$page.'.html'$data);
}
dem66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитация интерфейсов в С++ Diablero Общие вопросы C/C++ 7 25.09.2013 15:28
Имитация(!) asteits JavaScript, Ajax 4 27.10.2011 17:42
Имитация работы на компьютере Pavk Операционные системы общие вопросы 5 17.07.2011 16:59
Интерактивный учебник, имитация работы приложений(Delphi) VDGamma Фриланс 2 23.03.2011 23:08