Разрабатываю сайты

БЛОГ ПРО WEB

Рассказываю о web-разработке
и помогаю создавать сайты

Как скачать все изображения со страницы сайта PHP?

В этот раз была задача скопировать сайт ( Не люблю я это делать и хорошо, что делаю очень редко. Слышал что есть несколько способов скачивания сайта даже целиком. Я не стал вдаваться в подробности, там может быть множество сложностей, поэтому решил скопировать страницу вручную (так было интереснее ;)). Но данная статья не об этом…

В общем, дошло дело до вытаскивания изображений. У них на сервере изображения раскиданы по разным папкам с разной вложенностью, и в коде соответственно прописано вот так:

assets/img/bg.png
assets/img/main/px.png
assets/img/x/logo.png
assets/img/icons/cart.svg

Как видите, вложенность разная, и изображений порядка 400. Чтобы не нарушать структуру, нужно было скачать все изображения и раскидать по папкам точно так же как у них, чтобы не менять пути в самом коде. Делать это вручную — глупо, когда под рукой клавиатура и знания PHP )

Поэтому я решил написать скрипт, который

  • спарсит код страницы
  • вытащит все пути изображений
  • создаст все нужны директории в меня на сервере
  • скачает все изображения в созданные директории

Дальше прилагаю код с комментариями, может пригодится

<?php

// Определим нашу константу с урлом сайта, откуда будет качать изображения
DEFINE('URL', 'https://КАКОЙТОСАЙТ.ru/');

// Получаем html страницы
$html = file_get_contents(URL);

// Находим изображения, которые прописаны в атрибуте SRC
// И на всякий случай, ищем фоновые изображения url()
preg_match_all("/src=[ '\"\s]*([^ \"'>\s#]+)|url[\(](.*)[\)]/", $html, $matches);

// Так как у нас 2 поисковых запроса, соединим 2 массива в 1
$urls = array_merge($matches[1], $matches[2]);

// Прогоняем в цикле все найденое
  for ($i = 0; $i < count($urls); $i++) {

  	// Отсеиваем лишнее, оставляем только пути изображений нужных расширений
  	if (preg_match("/.png|.jpg|.svg/i", $urls[$i])) {

  		// Собираем в массив
	    $rows[] = $urls[$i];
	}
  }

  // Чистим массиы от дублей
  $rows = array_unique($rows);

  // Прогоняем опять в цикле и запускаем парсинг (функция parse())
  foreach ($rows as $key => $row) {

  	// передаем в функцию, путь к изображению
  	parse($row);
  	//echo $key. ' - '.$row."<br />";
  }

function parse($url)
{
	// Разбиваем путь на наименования директорий
	// Чтобы создать нужные директории
	// и раскидать изображения по этим директориям, 
	// точно так же, как это сделано на сайте
	$dirs = explode('/', $url);

	// удаляем последний элемент массива, т.е. имя файла
	$action = array_pop($dirs);
	$parent_dir = false;

	// Перебираем вложенность директорий
	foreach ($dirs as $dir) {
		$real_dir = $dir;
		if ($parent_dir) {
			// формируем вложенную директорию
			$real_dir = $parent_dir.'/'.$dir;
		}

		// Если директория не существует
		if (!is_dir($real_dir)) {
			// Создаем директорию
			mkdir($real_dir);
		}
		// Созраняем данную вложенность, чтобы потом 
		// создать новую директорию, именно здесь
		$parent_dir = $real_dir;
	}
	// Качаем изображение
	$img = file_get_contents(URL.$url);
	// Сохраняем изображение
	file_put_contents($url, $img);
}
?>

Можно еще добавить проверку существования изображения… Можно этот код применить так же для парсинга изображений из файла стилей.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *