Проблемы в парсере

Тема в разделе "PHP", создана пользователем Mxnrl, 5 янв 2011.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Mxnrl

    Mxnrl Постоялец

    Заблокирован
    Регистр.:
    29 апр 2010
    Сообщения:
    50
    Симпатии:
    1
    Пока тут разыскиваю парсер, написал аналог:)
    В принципе проблема следующая - у человека есть какой-то платный парсер, который отлавливает свежие объявления на авто.ру через 5-10 минут после того как они туда попадают.. Данный скрипт парсит все верно.. Но почему-то свежие объявления парсит с задержкой в ~55 минут. Скрипт весит на кроне и запускается каждые 5 минут..
    Посмотрите пожалуйста - в пхп не слишком силен - возможно есть какие-то откровенные ляпы в коде?
    PHP:
    <?php
    ini_set
    ("max_execution_time""9999999999");
    ini_set("memory_limit""512M");
    defined('HOSTPATH') ? null define("HOSTPATH"dirname(__FILE__) . "/");
    //класс для работы с базой
    include_once HOSTPATH 'engine/class/db.php';
    //класс для парсинга
    include_once HOSTPATH 'engine/class/simplehtmldom.php';
    //класс с инфой про машину
    include_once HOSTPATH 'engine/class/auto.php';
    //разнообразные мелкие полезные функции
    include_once HOSTPATH 'engine/class/functions.php';
    //вытаскиваем из базы линк для парсинга (что-то вроде category_id=15&section_id=1&currency_key=RUR&country_id=1&sort_by=1&output_format=1&extras[4]=22&extras[11]=27&extras[16]=32&extras[17]=21&submit=%C4%EE%E1%E0%E2%E8%F2%FC+%F8%E0%E1%EB%EE%ED&op=sale&act=searchResult
    $tasks $db->loadRows($db->query("SELECT id, task, user_cr FROM tasks"));
    $xtasks 0;
    while (isset(
    $tasks[$xtasks])) {
        
    $nextlink "list/?" $tasks[$xtasks]["task"];
        
    $parse true;
        
    $usernew false;
        while (
    $parse) {
            
    $nextlink str_replace("amp;"""$nextlink);
            
    $shtml file_get_html("http://all.auto.ru/" $nextlink);
            
    $nextlink $shtml->find('a[title=' $func->utf8_to_cp1251("Следующая") . ']'0)->href;
            if (
    $nextlink == null) {
                
    $parse false;
            }
            foreach (
    $shtml->find('a.offer-list') as $link) {
                
    $id array_reverse(explode("/"$link->href));
                
    $id substr($id[0], 0, -5);
                if (
    $db->countRows($db->query("SELECT id FROM autos WHERE unikid = '{$id}' LIMIT 1")) < 1) {
                    
    $html file_get_html($link->href);
                    
    $auto = new auto();
                    
    $auto->unikid $id;
                    
    $auto->auto_name $func->clean_up($func->cp1251_to_utf8($html->find("h2.auto-model"0)->plaintext));
                    
    $auto->sale_info $func->cp1251_to_utf8($html->find("dl.sale-info"0)->innertext);
                    
    $auto->sale_package $func->cp1251_to_utf8($html->find("div[id=sale-package]"0)->innertext);
                    
    $x 1;
                    foreach (
    $html->find("div[id=sale-contact] strong") as $strong) {
                        switch (
    $x) {
                            case 
    1:
                                
    $auto->name $func->cp1251_to_utf8($strong->plaintext);
                                break;
                            case 
    2:
                                
    $auto->town $func->cp1251_to_utf8($strong->plaintext);
                                break;
                            case 
    3:
                                
    $auto->number $func->cp1251_to_utf8($strong->plaintext);
                                break;
                        }
                        
    $x++;
                        unset(
    $strong);
                    }
                    foreach (
    $html->find("div[id=sale-details]") as $info) {
                        if (
    $auto->info != "") {
                            
    $auto->info .= "<br/>";
                        }
                        
    $auto->info .= $func->cp1251_to_utf8($info->innertext);
                        unset(
    $info);
                    }
                    
    $auto->userid $tasks[$xtasks]["user_cr"];
                    
    $auto->fltrid $tasks[$xtasks]["id"];
                    
    $auto->cost str_replace("руб."''ereg_replace(" """$func->cp1251_to_utf8($html->find("p.cost strong"0)->innertext)));
                    
    $auto->other_cost $html->find("p.cost span"0)->innertext;
                    if (
    $auto->auto_name != "" && $auto->cost != "") {
                        
    $auto->save();
                        
    $usernew true;
                    }
                    unset(
    $auto);
                    unset(
    $html);
                }
                unset(
    $link);
            }
            unset(
    $shtml);
        }
        if (
    $usernew) {
            if (
    $tasks[$xtasks]["user_cr"] != 0) {
                
    $db->query("INSERT INTO logs (operation, user_id) VALUES ('1', '{$tasks[$xtasks]["user_cr"]}')");
            }
        }
        
    $xtasks++;
    }
    Если что-то в коде не понятно - пишите объясню
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    Ну, код выглядит хорошо- так держать !:az:
    Первое что бросилось в глаза
    PHP:
                if ($db->countRows($db->query("SELECT id FROM autos WHERE unikid = '{$id}' LIMIT 1")) < 1) { 
    Как я понял- это проверка есть ли машина в базе. Если там идёт сортировка по времени и старое объявление не может попасть в начало, например, после редактирования, то лучше при отрицательном условии прервать скрипт.

    А вот по проблеме 2 совета:
    - в первый час поступления возможно класс у ссылок другой напр "new-offer-list"
    -посмотрите функцию сохранения, возможно она просто ставит будущую\прошлую дату.
    - добавить функцию дебага. На каждый запуск создайте папку с датой в имени, туда сохраните саму страницу и информацию, сколько ссылок на ней нашли.
     
  3. Mxnrl

    Mxnrl Постоялец

    Заблокирован
    Регистр.:
    29 апр 2010
    Сообщения:
    50
    Симпатии:
    1
    Сенкс:)

    Верно, проверяем есть авто с таким айди в базе. Прерывать к сожалению нельзя(( там тупая система - нет фильтрации по дате..

    проверял, но вроде все такое же.. хотя в принципе у меня свежак именно на авто.ру отловить так и не получилось. нет фильтрации по дате, а визуально - фиг запомнишь)


    Не, там просто инсерт

    Ага, сейчас сделаю посмотрю что получится
     
Статус темы:
Закрыта.