Парсинг PHP: Парсинг картинок — PROG-TIME

Парсинг PHP: Парсинг картинок

06.01.2019
Содержание:

В этой записи я вам расскажу как легко можно спарсить изображения со стороннего сайта. Мы научимся парсить картинки и в конце я вам покажу готовый парсер для парсинга картинок.

Картинки парсить очень просто. Для этого нам нужно всего 2 функции file_get_contents(), которая нам уже известна и file_put_contents().

Внутри функции file_get_contents() прописываем адрес картинки. Для примера я возьму картинку из записи «Шпаргалка по Git. Основные Git команды» — http://prog-time.ru/shpargalka-po-git-osnovnye-git-komandy/

Для начала я просто нажму на нее правой кнопкой мыши и выберу «копировать адрес изображения». Этот адрес мы вставляем в file_get_contents().

Для удобства запишем работу функции в переменную $img.

$img = file_get_contents('http://prog-time.ru/wp-content/uploads/2018/10/SHpargalka-po-git-720x414.jpg');

В функцию file_put_contents()передаем следующие параметры:

  • Первый параметр путь к файлу и его название. Например img/img1.jpg. Только сперва создайте директорию, так как если программа не найдет директорию, она выдаст ошибку.
  • Вторым параметром передаем данные которые будем записывать. У нас это переменная $img в которой хранится работа функции file_get_contents().

URL картинок

Для того чтобы добавить изображение, необходимо прописать тег img и и внутри атрибута src прописать путь к файлу.

Зная это мы с легкостью может сделать обратное, нам нужно достать из тега значение этого атрибута.

Важный момент

  • Пути к файлу бывают 2 видов. Абсолютный и относительный.
  • Абсолютный путь имеет вид — http://prog-time.ru/wp-content/uploads/2018/10/SHpargalka-po-git-720×414.jpg. Такой путь путь имеет протокол и является полным, начинающимся от корня сайта.
  • Относительный путь имеет вид — /uploads/2018/10/SHpargalka-po-git-720×414.jpg . Относительный путь имеет только часть адреса, который может быть написан по разному.

Основные правила написания относительного пути

Если мы находимся на странице http://prog-time.ru/wp-content/uploads/2018/10/index.php и хотим забрать картинку с адресом img.png.

Полный адрес к изображению будет
http://prog-time.ru/wp-content/uploads/2018/10/img.png

Если мы находимся на странице http://prog-time.ru/wp-content/uploads/2018/10/index.php и хотим забрать картинку с адресом /img.png.

Полный адрес к изображению будет
http://prog-time.ru/img.png.

Знак слеша в адресе означает что путь начинается от корневой директории.

Если мы находимся на странице http://prog-time.ru/wp-content/uploads/2018/10/index.php и хотим забрать картинку с адресом images/img.png.

Полный адрес к изображению будет
http://prog-time.ru/wp-content/uploads/2018/10/images/img.png.

Если мы находимся на странице http://prog-time.ru/wp-content/uploads/2018/10/index.php и хотим забрать картинку с адресом ../img.png.

Полный адрес к изображению будет
http://prog-time.ru/wp-content/uploads/2018/10/img.png

Если бы не было двух точек и слеша, путь был бы такой
http://prog-time.ru/wp-content/uploads/2018/10/img.png , но если их поставить, то они поднимают нас на папку выше и путь становится таким http://prog-time.ru/wp-content/uploads/2018/10/img.png .

Парсер картинок

Теперь давайте на основе полученных данных попробуем написать простой парсер картинок. Для написания парсера мы будем использовать знания которые получили в прошлых записях.

Для начала нужно прописать подключение к сайту. Для примера я буду использовать, все ту же страницу записи.

require_once 'phpquery-master/phpQuery/phpQuery.php';//подключаем библиотеку phpQuery
$url = 'http://prog-time.ru/shpargalka-po-git-osnovnye-git-komandy/';//URL записи

$curl = curl_init();//инициализация запроса
curl_setopt($curl, CURLOPT_URL, $url);//сюда передаем URL нашей страницы
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//записывать в переменную, а не выводить
$result = curl_exec($curl);//запрос и запись в переменную $result

После этого производим поиск нужного нам элемента.

$pq = phpQuery::newDocument($result);//создается объект в котором весь код страницы

$elem = $pq->find('.single-thumb img');//поиск элемента
$text = $elem->attr('src');//у найденного элемента вытаскиваем значение атрибута src

В конце нужно передать полученный адрес функцию file_get_contents() и сохранить найденное изображение, с помощью функции file_put_contents().

$img = file_get_contents($text);
file_put_contents('test_img.jpg', $img);

Парсинг изображения с относительным путем

Если изображение имеет относительный путь, зная правила, вы с легкостью можете создать отдельную строку и добавить недостающую часть к имеющемуся адресу. И в дальнейшем собранный адрес, вы можете использовать в моем, выше написанном, коде.

Полный код получившегося парсера:

require_once 'phpquery-master/phpQuery/phpQuery.php';//подключаем библиотеку phpQuery
$url = 'http://prog-time.ru/shpargalka-po-git-osnovnye-git-komandy/';//URL записи

$curl = curl_init();//инициализация запроса
curl_setopt($curl, CURLOPT_URL, $url);//сюда передаем URL нашей страницы
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//записывать в переменную, а не выводить
$result = curl_exec($curl);//запрос и запись в переменную $result

$pq = phpQuery::newDocument($result);//создается объект в котором весь код страницы

$elem = $pq->find('.single-thumb img');//поиск элемента
$text = $elem->attr('src');//у найденного элемента вытаскиваем значение атрибута src 
 
$img = file_get_contents($text);
file_put_contents('test_img.jpg', $img); 

На этом всё!
Больше интересных статей в нашей группе - https://vk.com/progtime
Вы так же можете разместить свой вопрос на нашем форуме, где другие программисты смогут вам помочь в решение вашей задачи - https://vk.com/prog_time
Так же прокачивайте свои навыки на нашем канале - https://www.youtube.com/c/ProgTime
Наши планы
  • Написание материала для курса по разработке ботов на Telegram
  • Разработка универсального парсера на PHP

Поддержите мой сайт!

Каждый переведённый донат, мотивирует на создание новых записей и уроков на YouTube

Контакты для связи

Технология на prog-time
Telegram
https://t.me/prog_time_bot