Как скачать все изображения со страницы сайта 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);
}
?>
Можно еще добавить проверку существования изображения… Можно этот код применить так же для парсинга изображений из файла стилей.
Добавить комментарий