СКРИПТ: Парсер фотографий с Авито.

Подача, публикация, рассылка объявлений на доски. Удаление и редактирование старых объявлений. Нюансы работы с различными досками объявлений.
Ответить
Аватара пользователя
XwebDeveloper
Сообщения: 51
Зарегистрирован: 13 ноя 2017, 12:53

СКРИПТ: Парсер фотографий с Авито.

Сообщение XwebDeveloper » 03 мар 2020, 16:13

Скрипт парсер фотографий с онлайн доски объявлений Авито.

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

Браузер: Chromium.

Логика: Скрипт переходит на доску объявлений Avito.ru. Выбирает нужную категорию в нашем случае это Автомобили, далее ставит галочку только с фото, после чего выбирает Марку и модель. После чего проходит по всей выдачи и сохраняет фотографии из объявлений обрезаю нижнюю часть фотографии. Скрипт легко можно адаптировать под любую категорию объявлений, а также можно добавить код для выбора различных настроек поиска.

Скрипт состоит:
Запускаемый файл - avito_parse_pic.php.
В папке tools находится файл functions.php, в котором содержатся все функции скрипта. В этом же файле находится функция crop, с помощью которой делаем обрезку фотографий.
В папке Log появляются файлы с логами работы скрипта в виде log_03_03_20.txt.
В папку res сохраняем папки с фотографиями.

Скачать скрипт:
avito.zip
(5.4 КБ) 98 скачиваний

Настройки скрипта:
// марка авто
$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);
	}
}
Запрос на создание скриптов viewforum.php?f=61

Ответить