СКРИПТ: Парсер картинок из выдачи Google картинки

Сбор и анализ всего что можно собрать из сети.
Ответить
Аватара пользователя
XwebDeveloper
Сообщения: 51
Зарегистрирован: 13 ноя 2017, 12:53

СКРИПТ: Парсер картинок из выдачи Google картинки

Сообщение XwebDeveloper » 08 июн 2020, 16:09

Сборщик картинок и ссылок на картинки из поисковой выдачи Google картинки по заданным ключевым запросам.

Версия программы: Human Emulator Studio 7.0.50.

Браузер: Chromium.

Логика: Получаем поисковые запросы из файла. Вводим их в поиск Google.com, переходим на Google картинки и разбираем полученную выдачу. Картинки складываем в папку с именем запроса, ссылки на картинки в файл с именем запроса.

Скрипт состоит:
Запускаемый файл parser_googl.php. В папке tools в файле functions.php прописаны подключаемые команды.
В папку res записываются папки и файлы с результатами разбора. Имя файла ключевой запрос.txt, содержимое одна строка один url из выдачи. Папка с именем ключевой запрос скаченные полноразмерные картинки.
В папке data лежит файл с запросами для поиска keys.txt в формате одна строка один запрос.

Скачать скрипт:
parser_google_pictures.zip
(4.94 КБ) 157 скачиваний

Настройки скрипта:
// файл с данными для скрипта
$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_is_vr.jpg
div_is_vr.jpg (172.37 КБ) 1609 просмотров

Мы вынесли его отдельно в настройках программы:
// настройки для разбора
// префикс для определения 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 картинки, которая содержит ссылку на её полно размерный источник.
xpath1.jpg
xpath1.jpg (129.29 КБ) 1609 просмотров
хpath определяем с помощью Инспектора элементов

Код для получения src будет следующий:
// по xpath получить див с картинкой 
$dv = $div->get_by_xpath($xpath_parent);
// получить источник картинки внутри дива
$src = $dv->get_child_by_attribute("src","",false,true)->get_src();
Запрос на создание скриптов viewforum.php?f=61

funtik
Сообщения: 8
Зарегистрирован: 22 мар 2019, 07:42

Re: СКРИПТ: Парсер картинок из выдачи Google картинки

Сообщение funtik » 11 янв 2021, 13:12

Привет. Перестал скрипт работать, не парсятся картинки, не могу понять почему. Помогите пожалуйста

Аватара пользователя
Support
Site Admin
Сообщения: 1000
Зарегистрирован: 10 апр 2009, 17:45
Контактная информация:

Re: СКРИПТ: Парсер картинок из выдачи Google картинки

Сообщение Support » 12 янв 2021, 19:55

funtik писал(а):
11 янв 2021, 13:12
Привет. Перестал скрипт работать, не парсятся картинки, не могу понять почему. Помогите пожалуйста
Скорее всего изменились класс и xpath путь к картинкам

Ответить