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