Версия программы: Human Emulator Studio 7.0.44.
Браузер: Chromium.
Логика: Скрипт переходит на доску объявлений Avito.ru. Выбирает нужную категорию в нашем случае это Автомобили, далее ставит галочку только с фото, после чего выбирает Марку и модель. После чего проходит по всей выдачи и сохраняет фотографии из объявлений обрезаю нижнюю часть фотографии. Скрипт легко можно адаптировать под любую категорию объявлений, а также можно добавить код для выбора различных настроек поиска.
Скрипт состоит:
Запускаемый файл - avito_parse_pic.php.
В папке tools находится файл functions.php, в котором содержатся все функции скрипта. В этом же файле находится функция crop, с помощью которой делаем обрезку фотографий.
В папке Log появляются файлы с логами работы скрипта в виде log_03_03_20.txt.
В папку res сохраняем папки с фотографиями.
Скачать скрипт:
Настройки скрипта:
// марка авто $str_marka="Mazda"; // модель $str_model="626"; // папка для сохранения фотографий $img_folder="res/$str_marka/$str_model/"; // файл с индексом страницы в выдаче // которую мы уже обработали скриптом $str_cur_page_path="data/cur_page.txt"; // глубина прохода в поисковые результаты // -1 все результаты // если выдача большая скрипт будет идти до самой последней страницы $cnt_pages = -1; // текущая страница выдачи с которой работает скрипт $crnt_page =1; // //// // режим отладки // если отключить то логи будут сохраняться в файл $dbg = true; // файл с логами, если сделать пустым имя файла логов // логи не будут сохраняться $debug_file = 'log/log_'.date("d_m_y").'.txt';
Скрипт сбора фотографий с доски объявлений:
<?php /* ** // Наш сайт https://xn--80awbbeioodeq4h3a.xn--p1ai // Скрипт добавления объявлений на доску olx. // Обсудить скрипт или задать вопросу на форуме // viewforum.php?f=52 // версия программы: Studio 7.0.45 ** */ $xhe_host = "127.0.0.1:7010"; // The following code is required to properly run XWeb Human Emulator require("../../Templates/xweb_human_emulator.php"); // марка авто $str_marka="Mazda"; // модель $str_model="626"; // папка для фотографий $img_folder="res/$str_marka/$str_model/"; // файл с текущей страницей $str_cur_page_path="data/cur_page.txt"; // глубина прохода в поисковые результаты // -1 все результаты $cnt_pages = -1; // текущая страница $crnt_page =1; // //// // режим отладки $dbg = true; $debug_file = 'log/log_'.date("d_m_y").'.txt'; // //////////////////////// дополнительные модули /////////////// // функции require_once("tools/functions.php"); // /////////////////////// скрипт /////////////////////////////////////////// debug_mess("скрипт запустили"); // закрываем все вкладки $browser->close_all_tabs(); // чистим всё $app->clear(); // добавим новую закладку $browser->add_tab(); // активная первая закладка $browser->set_active_browser(0); // проверить существует ли папка if (!$folder->is_exist($img_folder)) $folder->create($img_folder); // //$browser->enable_proxy("","",false); debug_mess("переходим на авито и выбираем модель и марку"); // переходим на авито $browser->navigate("http://www.avito.ru/"); // переходим на автомобили //$listbox->send_event_by_name("category_id", "onclick"); $listbox->select_text_by_name("category_id","Автомобили"); $listbox->send_event_by_name("category_id", "onchange"); // выбираем только с фото $span->click_by_inner_text("только с фото"); // нажимаем найти $btn->click_by_inner_text("Найти"); // перейти на выбранную марку $anchor->click_by_inner_text($str_marka); // ожидаем результаты для марки $h1->wait_element_exist_by_inner_text("Купить $str_marka в России", true); // перейти на выдачу по моделе авто $anchor->click_by_inner_text($str_model); // ожидаем результаты для модели $h1->wait_element_exist_by_inner_text("Купить $str_marka $str_model в России", true); // ////////////////// перейти на нужную страницу //////////////// debug_mess("проверяем существование файла с индексом"); // проверить существование файла с индексом if($file_os->is_exist($str_cur_page_path)) { $crnt_page = $textfile->read_file($str_cur_page_path); // перелестать до нужной нам страницы $a=10; while($a<$crnt_page) { // кликнем по странице $anchor->click_by_inner_text($a); $a=$a+4; } // $crnt_page=$crnt_page+1; // переходим к странице $anchor->click_by_inner_text($crnt_page); } debug_mess("обработаем выдачу доски объявлений"); // пройдёмся по всем страницам выдачи while(true) { // получить все href объявлений $str_ads=$anchor->get_all_hrefs_by_attribute("class","snippet-link",false,"<br>"); // массив ссылок на объявления $arr_ads = explode("<br>",$str_ads); debug_mess("количество объявлений на странице ".count($arr_ads)); // ссылки на объявления покажем в панели отладки // print_r($arr_ads); // пройдёмся по всем объявлением из выдачи foreach($arr_ads as $href) { // сделать активной $browser->set_active_browser(1); debug_mess("переходим на страницу объявления $href"); // перейти на страницу объявления $browser->navigate("https://www.avito.ru$href"); // получаем все пути к картинкам $data_urls =$div->get_all_attributes_by_attribute("data-url", "class", "gallery-img-frame", false); // print_r($data_urls); debug_mess("нашли ".count($data_urls)." картинок"); // сохраняем все пути в заданную папку foreach($data_urls as $pic_src) { $pic_src_name=$file_os->get_name($pic_src); // если уже есть такая фотография не сохраняем её if($file_os->is_exist($img_folder.$pic_src_name)) { debug_mess("уже есть такая фотография $pic_src_name"); continue; } // сохранить картинку $webpage->save_url_to_file("http:$pic_src",$img_folder.$pic_src_name); // обрезать картинку crop($img_folder.$pic_src_name,$img_folder.$pic_src_name, array(0, 0, 100, 92),true); } debug_mess("обработали объявление $href"); // ставим скрипт на паузу пока не нажём кнопку продолжить // в случае необходимости использовать для отладки //$app->pause(0); } // сделать активной главную страницу $browser->set_active_browser(0); // не перешли на следующую страницу if(!next_page($crnt_page)) break; debug_mess("записываем текущий индекс страницы в файл"); // записать текущую страницу $textfile->write_file($str_cur_page_path,$crnt_page); } debug_mess("удаляем файл с индексом"); // удаляем файл с такими индексами $file_os->delete($str_cur_page_path); debug_mess("скрипт закончил работу"); // Quit $app->quit(); ?>
Функция обрезки фотографий:
function crop($file_input, $file_output, $crop = 'square',$percent = false) { list($w_i, $h_i, $type) = getimagesize($file_input); if( $type=='jpg') $type='jpeg'; if (!$w_i || !$h_i) { echo 'не возможно получить длину и ширину'; return; } $types = array('','gif','jpeg','png'); $ext = $types[$type]; if ($ext) { $func = 'imagecreatefrom'.$ext; $img = $func($file_input); } else { echo 'Некорректный формат'; return; } if ($crop == 'square') { $min = $w_i; if ($w_i > $h_i) $min = $h_i; $w_o = $h_o = $min; } else { list($x_o, $y_o, $w_o, $h_o) = $crop; if ($percent) { $w_o *= $w_i / 100; $h_o *= $h_i / 100; $x_o *= $w_i / 100; $y_o *= $h_i / 100; } if ($w_o < 0) $w_o += $w_i; $w_o -= $x_o; if ($h_o < 0) $h_o += $h_i; $h_o -= $y_o; } //echo "$w_o, $h_o<br>"; $img_o = imagecreatetruecolor($w_o, $h_o); imagecopy($img_o, $img, 0, 0, $x_o, $y_o, $w_o, $h_o); if ($type == 2) { return imagejpeg($img_o,$file_output,100); } else { $func = 'image'.$ext; return $func($img_o,$file_output); } }