Парсинг картинок с сайта

Парсинг картинок с сайта

Парсер фото товара с сайта

В результате получаем простой парсер фото товаров с сайта на примере gearbest.com. Код парсера размещён в одном файле, часть возможных ошибок не обрабатывается для краткости кода.

Исходный код index.php:

<?php Error_Reporting(E_ALL & ~E_NOTICE); mb_internal_encoding(«UTF-8»); set_time_limit(0); // Попытка установить своё время выполнения скрипта /* — 1 — Инициализируем переменные для запроса */ $time_start = time(); $error = array(); $error_page = array(); $action = 0; $gearbest_url = «»; $charset = «UTF-8»; // Исходная кодировка страницы $uni_name = date(«d-m-Y-H-i-s», time()); /* — 1.1 — Переопределяем переменные на основе GET или POST параметров */ if(isset($_REQUEST)) $gearbest_url = trim($_REQUEST); if(isset($_REQUEST)) $action = $_REQUEST; /* — 1.2 — Запросы при помощи cURL */ /* — 1.2.1 — Загрузка страницы при помощи cURL */ function curl_get_contents($page_url, $base_url, $pause_time, $retry) { /* $page_url — адрес страницы-источника $base_url — адрес страницы для поля REFERER $pause_time — пауза между попытками парсинга $retry — 0 — не повторять запрос, 1 — повторить запрос при неудаче */ $error_page = array(); $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, «Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0»); curl_setopt($ch, CURLOPT_COOKIEJAR, str_replace(«\\», «/», getcwd()).’/gearbest.txt’); curl_setopt($ch, CURLOPT_COOKIEFILE, str_replace(«\\», «/», getcwd()).’/gearbest.txt’); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Автоматом идём по редиректам curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // Не проверять SSL сертификат curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); // Не проверять Host SSL сертификата curl_setopt($ch, CURLOPT_URL, $page_url); // Куда отправляем curl_setopt($ch, CURLOPT_REFERER, $base_url); // Откуда пришли curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Возвращаем, но не выводим на экран результат $response = curl_exec($ch); $info = curl_getinfo($ch); if($info != 200 && $info != 404) { $error_page = array(1, $page_url, $info); if($retry) { sleep($pause_time); $response = curl_exec($ch); $info = curl_getinfo($ch); if($info != 200 && $info != 404) $error_page = array(2, $page_url, $info); } } $response = $info; $response = $error_page; curl_close($ch); return $response; } /* — 1.3 — Функции для Gearbest.com */ /* — 1.3.1 — Парсинг URL фото */ function get_gearbest_foto_urls($gearbest_url) { /* $gearbest_url — адрес страницы товара на Gearbest */ $res_arr = array(); $res_arr = array(); $base_url = «https://www.gearbest.com»; // Получаем HTML код страницы карточки товара / опускаем проверку ошибок $response_arr = curl_get_contents($gearbest_url, $base_url, 5, 1); $gearbest_page = $response_arr; // Парсим URL адреса картинок $regexp = «/data-big-img=\»(.+)\»/Us»; $buffer = array(); preg_match_all($regexp, $gearbest_page, $buffer); $res_arr = $buffer; $urls_arr = array(); $res_arr = array(); return $res_arr; } /* — 1.3.2 — Скачиваем и сохраняем фото */ function get_gearbest_foto($foto_urls) { /* $foto_urls — массив URLs фото товара на Gearbest */ $res_arr = array(); $res_arr = array(); $res_arr = array(); $res_arr = $res_arr = 0; $base_url = «https://www.gearbest.com»; $catalog_out_path = «images»; if(!is_dir($catalog_out_path)) { mkdir($catalog_out_path, 0777, true); } // Скачиваем фото и записываем их в каталог images / частично опускаем проверку ошибок foreach($foto_urls as $key => $url) { $foto_name = mb_substr($url, (mb_strpos($url, «source-img/») + 11)); $response_arr = curl_get_contents($url, $base_url, 5, 1); $foto_content = $response_arr; if(file_put_contents($catalog_out_path . «/» . $foto_name, $foto_content)) { $res_arr++; $res_arr = $url; $res_arr = $catalog_out_path . «/» . $foto_name; } else { $res_arr = $url; $res_arr = «no_url»; $res_arr = «Ошибка записи фото: » . $url; } $res_arr++; } return $res_arr; } /* — 1.4 — Вывод данных в HTML */ /* — 1.4.1 — Вывод информации о спарсенных фото */ function foto_list_html($res_arr) { echo «Удачно собрано » . $res_arr . » из » . $res_arr . » фото.»; foreach($res_arr as $key => $foto_info) { echo «<p>» . $foto_info . » — » . $foto_info . «</p>»; } } /* — 1.4.2 — Вывод ошибок */ function error_list_html($errors) { if (!empty($errors)) { echo «<p>Во время сбора фото произошли следующие ошибки:</p>\n»; echo «<ul>\n»; foreach($errors as $error_row) { echo «<li>» . $error_row . «</li>\n»; } echo «</ul>\n»; echo «<p>Статус: <span class=\»red\»>FAIL</span></p>\n»; } else { echo «<p>Статус: <span class=\»green\»>OK</span></p>\n»; } } /* — 1.4.3 — Вывод времени работы скрипта */ function run_time_html($time_start) { if(!empty($time_start)) echo «<p>Время работы скрипта: » . (time() — $time_start) . «</p>\n»; } /* — 2 — Получение контента с сайта Gearbest */ if($action) { // Спарсить условия доставки товара товара if(!empty($gearbest_url)) { $gearbest_url = trim($gearbest_url); $din_url = $gearbest_url; $res_arr = get_gearbest_foto_urls($din_url); if(!empty($res_arr)) { $res_arr = get_gearbest_foto($res_arr); } else { $res_arr = «Ошибка сбора адресов фото»; } } else { $res_arr = «Не задан адрес карточки товара»; } } /* — 3 — Вывод результатов работы парсера */ ?> <!doctype html> <html> <head> <title>Парсер информации на Gearbest.com</title> <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″> <!—meta name=»robots» content=»noindex,nofollow»—> </head> <body> <style> .wrapper { max-width: 600px; margin: 0 auto; } h1 { text-align: center; } .action_form { max-width: 560px; margin: 0 auto; } .action_form input { width: 100%; } input { font-size: 1em; min-height: 36px; box-sizing: border-box; } input, input { padding: 8px 12px; margin: 12px auto; font-size: 1.2em; font-weight: 400; line-height: 1.2em; text-decoration: none; display: inline-block; cursor: pointer; border: 2px solid #007700; border-radius: 2px; background-color: transparent; color: #007700; } input:hover, input:hover { background-color: #009900; color: #fff; } .result { border: 1px dotted #000; width: 100%; height: auto; overflow-y: auto; margin: 0px auto; padding: 10px; } .copyright { text-align: center; } .copyright a { color: #000; } .copyright a:hover { text-decoration: none; } .red { color: #770000; } .green { color: #007700; } </style> <div class=»wrapper»> <h1>Парсер фото из карточки товара Gearbest.com</h1> <form class=»action_form» action=»» method=»post»> <input type=»hidden» name=»action» value=»1″ /> <input type=»text» name=»gearbest_url» value =»<?php if(!empty($gearbest_url)) echo $gearbest_url; ?>» placeholder=»URL страницы товара» /> <input type=»submit» name=»submit» value=»Собрать фото» /> </form> <div class=»result»> <?php if($action && !empty($res_arr)) { foto_list_html($res_arr); } ?> </div> <div class=»errors_block»> <?php error_list_html($res_arr); run_time_html($time_start); ?> </div> <div class=»copyright»>&copy Идея и реализация — <a href=»https://seorubl.ru/» target=»_blank» title=»Записки Предприимчивого Человека» rel=»generator»>ПЧ</a> // 30.04.2017 г.</div> </div> </body> </html>

Рассмотрим основные особенности. Парсер собирает фото с одной карточки товара. Но нам ничего не мешает при необходимости добавить ещё один цикл и спарсить картинки по списку страниц.

Обратите внимание на функцию preg_match_all(), она возвращает массив соответствий регулярному выражению. В этом её основное отличие от функции preg_match(), которая работает до первого совпадения.

С помощью встроенной в PHP функции file_put_contents() можно сохранить фото на свой сервер по нужному пути. Соответственно предварительно мы проверяем наличие нужного нам каталога и при его отсутствии создаём его.

Также при попытке достать из URL фото имя файла я показал пример работы с PHP функциями обработки строк mb_strpos() и mb_substr(). Ими полезно пользоваться в качестве альтернативы регулярным выражениям, работают быстрее. Префикс mb_ указывает на то, что данные функции корректно работают с многобайтными кодировками, в частности со строками на русском языке.

В результате работы парсера получаем список фото на своём жёстком диске в заданной папке и с заданными именами файлов.

Конечно, можно было бы организовать парсер по AJAX технологии, но у применённого подхода есть свои плюсы. Например, при большом количестве картинок и длительной работе парсера нам необязательно держать вкладку браузера открытой. PHP скрипт сможет долго работать на сервере и сохранять картинки в нужную директорию. При этом, правда, мы не увидим результаты выполнения скрипта. Но то же окончание работы парсера можно будет заметить по прекращению создания новых файлов с фото.

В следующих статьях из цикла про парсеры мы рассмотрим обработку CSV данных и парсинг с помощью специальных библиотек для работы с DOM данными в PHP на примере PHPquery. Оставайтесь на связи.

Парсер картинок с сайта 5 (100%) 1 vote
Не жмись! С друзьями ссылкой поделись:

Парсинг ссылок на картинки с сайта и их массовая закачка

Сначала я вам расскажу про свою задачу.

Надо было с одного сайта скачать все фотки с галерей. Было около 30 страниц, на каждой из которых было примерно 50-100 фотографий. Их надо было скачать.

Проблем то? В общем решил сделать следующим образом, открыл одну страницу с галерей, нажал «Сохранить как» (или Cntrl+S) в Google Chrom. И скачалась целиком страница со всеми файлами.

Естественно все картинки тоже должны были скачаться. НО скачались лишь их миниатюры. Залез в Html-код и увидел следующею разметку для одной из фотографий.

<a rel=»lightbox» data-href=»Полный путь до картинки» data-title=»»> <img src=»Путь до миниатюры» alt=»»/> </a>

То есть, нужные мне картинки находились в атрибуте «data-href». Дело в том, что браузер не воспринимает такой атрибут, как ссылку на файл.

И вот я начал капать интернет в поисках решения. Самым очевидным решением, мне показалось спарсить все через Datacol. Но под рукой не было лицензии, а покупать второй раз как-то не хотелось.

И в итоге нашёл бесплатную программу, для элементарного парсинга с сайта happy-hack.ru. С помощью неё можно спарсить все ссылки на все нужные нам изображения.

Внимание: антивирусник может посчитать её как вирус, хотя у меня ни каких проблем не было.

В ней все просто, забиваем ссылку на страницу, правила и нажимаем старт. Объясню поподробней.

1. Мы вбиваем адрес нужной нам страницы.

2 и 3. Мы вбиваем правила для копирования пути на изображение так, чтобы между «от» и «до» был путь на изображение (не забываем про двойные кавычки, они тоже нужны). Пример:

<a rel=»lightbox» data-href=»http://daruse.ru/image.jpg» data-title=»»>

4. Нажимаем кнопку «Старт» и ждём завершение.

5. Сохраняем.

На выходе получаем текстовый файл, в которым построчно написаны ссылки.

Теперь остаётся их скачать, нужна была программа, в который можно импортировать все ссылки и скачать разом, для этого нашёл программу Download master, скачать её можно .

В ней выбираем «Файл — Импорт» и выбираем наш текстовый файл с ссылками.

Парсер — программа, реализующая процесс сбора необходимой информации из заданных источников.

Парсинг данных — одно из направлений автоматизации процессов в интернете, которым мы занимаемся.

Для парсинга — мы разрабатываем собственных ботов, которым доверяем эту трудоёмкую и монотонную работу. Мы разрабатываем и простые и сложные парсеры — от сбора email адресов, до вычисления объёмов продаж позиций.
Вы можете заказать — ботов — и запускать их самостоятельно, либо заказать парсинг — как услугу — и получить данные.
Для парсинга с популярных ресурсов, чаще всего достаточно скачать парсер — запустить и через некоторое время у Вас будет файл со всеми необходимыми данными.
Дело в том, что не под все необходимые задачи существуют уже готовые парсеры, либо работоспособность парсера уже на нуле — в виду того, что на необходимом ресурсе может поменяться вёрстка, а в программный код парсера не внесены изменения.
Новичкам в этом вопросе, конечно хотелось бы скачать универсальный парсер, который сможет парсить везде и всё — такой себе парсер яндекс, ключевых слов, почты (email), телефонов, слов, текста, цен, адресов, товаров, каталогов, google, объявлений, соц сетей — vk, одноклассники, facebook — и чтобы всё запускалось нажатием одной кнопки, но в текущее время — качество парсинга достигается за счёт индивидуально разработанных парсеров под конкретную задачу.
Стоимость парсинга данных складывается из стоимости разработки парсера и затрат на мощности для парсинга, а так же в некоторых случаях затрат на прокси.
Если Вам необходим парсинг для наполнения сайта актуальной информацией и продвижения в поисковых системах, то рекомендуем так же обратить внимание на бота, который способен влиять на привлечение траффика из поисковой системы яндекс — Termidroid — раскрутка сайта за счёт управления поведенческим фактором.
Наши готовые парсеры: 1. PYW — парсер yandex wordstat
2. MMP — парсер email участников групп соц сети «Мой Мир»
3. ContactBase — парсер email и телефонов с сайтов по заданному списку ключевых слов из поисковой системы google.

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

Наши преимущества:
1. Мы не берём предоплату, если вам нужен сам бот, а не данные (когда нужны именно данные, а не парсер — у нас есть затраты на сервер под бота и эти затраты покрываются Вами в виде предоплаты).
2. Для создания ботов, мы используем Zennoposter, либо чистый c#, что позволяет нам делать парсеры под самые сложные условия (например для получения данных, необходимо запустить обработку javascript, совершить несколько действий на сайте, а информацию спарсить из ответного письма с сайта).
3. Мы соблюдаем сроки.
4. Опыт с 2011 года.
Архипов Владимир Валериевич почта — vipvodu@yandex.ru skype — vipvodu тел. +7-978-863-00-47

Парсинг картинок с сайта: как получить большую картинку

Парсинг фото/картинок с сайтов часто больная тема у многих, особенно начинающих. Если у Вас с помощью xpath или регулярного изображения не получается получить большое изображение, то попробуйте воспользоваться этим советом. Особенно он будет полезен, если для товара есть несколько фотографий.

Покажу вам проверенный способ, которым часто пользуюсь. Часто полученная картинка:

1) скачивается и маленькая и большая картинка
2) оказывается маленькой

Для первого случая в 99% достаточно просто сделать допустимым только тег <a>, т.к идет вложенность

<a href=»picture_big.jpg»> <img src=»picture_small.jpg»> </a>

И естественно Датакол качает 2 картинки. Чтобы ограничить включаем «Допустимые теги» = <a>

Для второго случая нужно найти так сказать 1 отличие в ссылке на маленькое изображение и большое. В основном это может быть:

— приставка к имени файла, например thumb, small и т.п
— добавление размера, например 60×60
— или совмещенные способы /thumb/picture_60x60.jpg

Рассмотрим на примере http://demo-ru.webasyst.net/shop/product/iphone/

Откроем станицу в Selector и кликнем левой кнопкой мыши (ЛКМ) по картинке. Селектор выделит ссылку на картинку в теге <img>.

Мы видим конструкцию, которую я описал выше, тег <img> вложен в тег <a>:

<a target=»_blank» onclick=»return hs.expand(this)» href=’products_pictures/iphone13z_enl.jpg’ img_width=»403″ img_height=»630″> <img id=’img-current_picture’ border=’0′ src=»products_pictures/iphone13z.jpg» title=»iPhone ― Мой интернет-магазин» alt=»iPhone ― Мой интернет-магазин» > </a>

И видим что ссылки отличаются приставкой _enl для большого фото. Значит нам остается добавить 1 замену
.jpg на _enl.jpg

Если картинок, которые нужно спарсить несколько, как на странице примере, то можно подобрать xpath для списка картинок.

Откроем Picker, нажимаем ПКМ на картинке из списка и «подобрать xpath»
Наш xpath будет таким:

//table/tbody/tr/td/a/img

Но огорчу Вас, он не работает ) Да, так бывает. Но раз уж взял в пример эту страницу, значит доведу до конца.

Теперь один секрет ) Если загрузчик Браузер то в его DOM модели есть тег <tbody>, если стандартный загрузчик то его нет, поэтому будьте внимательны, если вам попадаются таблицы и используете стандартный загрузчик — то удаляйте его из xpath.

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

1. Мы видим, что у нас большая картинка в теге <a> значит преобразуем xpath к такому виду
//table/tr/td/a
И делаем «Допустимые теги» = <a>
Поле «Статическое» и включаем загрузку файлов.

2. Бывает, что в теге <a> не ссылки на большое изображение (или вовсе его нет), но мы уже заранее узнали, чем отличается ссылка на большое изображение. Тогда используем xpath
//table/tr/td/a/img
Добавляем одну замену
.jpg на _enl.jpg
Поле «Статическое» и включаем загрузку файлов.

P.S из стандартного xpath, подобранного в Selector я убрал , т.к его в коде нет, да и логично понятно, что это не нужная конструкция.

Как результат видим, что все загрузилось.


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

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