Версия программы: Human Emulator Studio 7.0.50.
Браузер: Chromium.
Логика: Получаем поисковые запросы из файла. Вводим их в поиск Google.com, переходим на Google картинки и разбираем полученную выдачу. Картинки складываем в папку с именем запроса, ссылки на картинки в файл с именем запроса.
Скрипт состоит:
Запускаемый файл parser_googl.php. В папке tools в файле functions.php прописаны подключаемые команды.
В папку res записываются папки и файлы с результатами разбора. Имя файла ключевой запрос.txt, содержимое одна строка один url из выдачи. Папка с именем ключевой запрос скаченные полноразмерные картинки.
В папке data лежит файл с запросами для поиска keys.txt в формате одна строка один запрос.
Скачать скрипт:
Настройки скрипта:
// файл с данными для скрипта $keys = file("data/keys.txt"); // папка с результатами $path_to_res = $debug->get_cur_script_folder().'res\\'; // путь к папке для сохранения $path_to_res = "res"; // максимальное количество фотографий, которые надо собрать $max_count=5; // сохранять ли картинки $b_save_image = true; // сохранять ли ссылки в файл $b_save_url = true; // задать фильтры из инструментов гугл // инструменты гугл //Любой,Большой,Средний,Значки $size=""; //Любого цвета,Чёрно-белые,Прозрачные $color="Прозрачные"; //С лицензией на использование и изменение,С лицензией на использование, //С лицензией на использование и изменении в не коммерческий целях, //С лицензией на использование в не коммерческих целях,С любой лицензией. $rights=""; //Все типы,Клип-арт,Рисунки,GIF. $type=""; //За всё время,,За последние 24 часа,За последнюю неделю, //За последний месяц,За последний год $time="";
Сам скрипт:
// /////////////////////// скрипт /////////////////////////////////////////// debug_mess("скрипт запустили"); // кол-во for($ii=0;$ii<count($keys);$ii++) { // получить запрос $key = trim($keys[$ii]); // перейти на гугл $browser->navigate("google.ru"); //Вводим запрос $input->send_keyboard_input_by_name("q",$key."\n", "20:40"); // ждём sleep(1); // Кликаем на картинки $anchor->click_by_inner_text("Картинки"); // ждём sleep(1); debug_mess("вводим фильтры если они заданы"); // Настройки поиска через инструменты гугл // // ////////////////// Заходим в инструменты $div->click_by_inner_text("Инструменты"); //Выбираем размер if($size!="") { $div->click_by_inner_html("Размер"); $span->click_by_inner_text($size); sleep(1); } //Выбираем цвет if($color!="") { $div->click_by_inner_html("Цвет"); $span->click_by_inner_text($color); sleep(1); } //Выбираем права использования if($rights!="") { $div->click_by_inner_html("Права использования"); $div->click_by_inner_text($rights); sleep(1); } //Выбираем тип if($type!="") { $div->click_by_inner_html("Тип"); $span->click_by_inner_text($type); sleep(1); } //Выбираем время if($time!="") { $div->click_by_inner_html("Время"); $span->click_by_inner_text($time); sleep(1); } // ///////////////////////////////////// // если результатов нет переходим к следующему запросу if($anchor->is_exist_by_inner_text("Сбросить настройки и повторить", false)) { debug_mess("под заданные фильтры нет картинок для запроса $key"); continue; } // есть ли нет результатов сбросить фильтры // if($anchor->is_exist_by_inner_text("Сбросить настройки и повторить", false)) //$anchor->click_by_inner_text("Сбросить настройки и повторить", false); // создаём папку для сохранения картинок if(!$folder->is_exist($path_to_res."\\".$key)) $folder->create($path_to_res."\\".$key); // получить все дивы с картинками $images=$div->get_all_by_attribute("class", $div_class, false); $cnt = count($images->elements); $old_cnt=$cnt; // пока меньше чем задано в настройках прокручиваем вниз while($cnt<$max_count) { // опустить скролл в самый низ страницы $browser->set_vertical_scroll_pos($browser->get_page_height()+100); sleep(1); // проверяем есть ли ещё результаты if($button->is_exist_by_attribute("value", "Ещё результаты")) { $button->click_by_value("Ещё результаты"); sleep(1); } // получить все дивы с картинками $images=$div->get_all_by_attribute("class",$div_class, false); // $cnt = count($images->elements); //echo $cnt."<br>"; if($cnt==$old_cnt) break; $old_cnt = $cnt; } // print_r($images->elements); $count_get =0; foreach($images->elements as $img) { // задать фокус $img->focus(); // кликнуть по картинке что бы открыть большую картинку $img->send_mouse_click(30,30); sleep(1); // по xpath получить див с картинкой $dv = $div->get_by_xpath($xpath_parent); // получить источник картинки внутри дива $src = $dv->get_child_by_attribute("src","",false,true)->get_src(); // вывод в панель отладки debug_mess("ссылка на картинку : ".$src); // если пустой переходим к следующему if(trim($src)=="") continue; // не обрабатывать data:image/jpeg;base64 if(strpos($src,"data:image/jpeg;base64")!==false) continue; // получить названия файла $file = basename($src); //echo "имя картинки2".$src."<br>"; // сохранить картинку if($b_save_image) $webpage->save_url_to_file($src,"$path_to_res/$key/$file"); // сохранить в файл ссылку на картинку if($b_save_url) $textfile->add_string_to_file($path_to_res."//".$key.".txt", trim($src)."\r\n", 60); //$app->pause(0); // собрали нужное количество картинок if($count_get>=$max_count) break; $count_get++; } }
Сам разбор работает следующим образом :
Сначала мы получаем нужное количество картинок в выдаче ориентируясь на класс div-а, в котором содержится картинка в выдаче:
Мы вынесли его отдельно в настройках программы:
// настройки для разбора // префикс для определения div c картинкой // по которому получаем их для клика $div_class="isv-r"; // xpath для открытой картинки через которую получаем src $xpath_parent="/html/body/div[2]/c-wiz/div[3]/div[2]/div[3]/div/div/div[3]/div[2]/c-wiz/div[1]/div[1]/div/div[2]";
Код для получения этих элементов:
// получить все дивы с картинками $images=$div->get_all_by_attribute("class", $div_class, false); $cnt = count($images->elements); $old_cnt=$cnt; // пока меньше чем задано в настройках прокручиваем вниз while($cnt<$max_count) { // опустить скролл в самый низ страницы $browser->set_vertical_scroll_pos($browser->get_page_height()+100); sleep(1); // проверяем есть ли ещё результаты if($button->is_exist_by_attribute("value", "Ещё результаты")) { $button->click_by_value("Ещё результаты"); sleep(1); } // получить все дивы с картинками $images=$div->get_all_by_attribute("class",$div_class, false); // $cnt = count($images->elements); //echo $cnt."<br>"; if($cnt==$old_cnt) break; $old_cnt = $cnt; }После того как у нас получилось нужно количество этих дивов с картинками мы кликаем на каждый что бы открыть картинку для просмотра. Из этого просмотра по xpath содержащего картинку div мы и получаем src картинки, которая содержит ссылку на её полно размерный источник.
хpath определяем с помощью Инспектора элементов
Код для получения src будет следующий:
// по xpath получить див с картинкой $dv = $div->get_by_xpath($xpath_parent); // получить источник картинки внутри дива $src = $dv->get_child_by_attribute("src","",false,true)->get_src();