1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

Скачивание всех изображений из сайта

Обзор способа получения всех картинок определенного сайта

  1. Support
    Недавно в нашем телеграм чате был задан вопрос о том, как с помощью A-Parser можно скачать картинки со всего сайта. Также с похожими вопросами часто обращаются пользователи в техническую поддержку. Поэтому мы подготовили подробную статью с детальным описанием настройки и скриншотами решения.
    Данную задачу лучше разделить на 2 этапа: парсинг ссылок на картинки и скачивание картинок по ссылкам. Ниже будут рассмотрены оба этапа.

    Этап 1: парсинг ссылок на картинки
    Есть несколько способов собрать ссылки на картинки со всего сайта. Первый заключается в "слепом" обходе всего сайта в глубину и сборе всех ссылок, указанных в атрибуте src тега img. Второй способ предполагает изучение сайта и составление пресета, который пройдет только по нужным страницам и соберет ссылки только на нужные картинки. Рассмотрим оба способа более детально. В качестве "подопытного" возьмем сайт РИА Новости, а для упрощения задачи будем парсить только его раздел "В мире".

    Способ 1: обход всего сайта
    Используем парсер HTML::LinkExtractor HTML::LinkExtractor. С его помощью довольно легко можно настроить проход по внутренним ссылкам вглубь и параллельно собрать любые данные со страниц.

    [​IMG]

    В данном случае настройка максимально простая: задаем глубину парсинга и прописываем регулярное выражение для сбора ссылок из <img src="...">. Также указываем в Формате результата выводить собранные ссылки и обязательно включаем уникализацию запросов (чтобы не парсер не зацикливался на перекрестных ссылках) и уникализацию результатов по строке (чтобы исключить дубли ссылок из результатов).
    Можно также более тонко настроить пресет, исключив из обхода какие-то ссылки и/или фильтруя собираемые результаты, но это уже зависит от конкретного сайта и задачи, поэтому на этом моменте не будем останавливаться.

    [​IMG]

    В результате будет получен большой список ссылок:
    https://cdnn21.img.ria.ru/images/07e4/0b/1e/1587007077_0:322:3068:2048_600x0_80_0_0_ae70531c16d1b3aad864602f2d18f7fd.jpg.webp
    https://cdnn21.img.ria.ru/images/07e4/0c/1e/1591554327_0:172:3066:1897_600x0_80_0_0_3124f4b39563d2382fcd35b38398de9d.jpg.webp
    https://cdnn21.img.ria.ru//i/loader.svg
    https://cdnn21.img.ria.ru/images/155740/38/1557403806_0:21:413:434_100x100_80_0_0_3c82cf7de501c3afefa1fc6540b7a94e.jpg.webp
    https://cdnn21.img.ria.ru/images/150008/38/1500083879_0:0:1946:1095_600x0_80_0_0_9954b39de9c79cb786b4eab599e40ad9.jpg.webp
    https://cdnn21.img.ria.ru//i/loader_white.svg?
    https://cdnn21.img.ria.ru/images/07e5/07/1e/1743633588_0:321:3072:2048_1920x0_80_0_0_5d9d629fe55de460f2ca378ed266d42e.jpg.webp
    https://cdnn21.img.ria.ru/images/07e5/0b/01/1757283420_0:0:3072:1728_1920x0_80_0_0_6707316917dd563fe70fdad87d9400ee.jpg.webp
    Если его изучить, то становится видно, что здесь есть как ссылки на ресурсы страницы (например анимация загрузки), так и ссылки на превью картинок разных размеров. Это один из минусов данного способа, особенно если нужно собрать только полноразмерные иллюстрации к статьям. Также к недостаткам можно отнести довольно длительную работу пресета, это связано с тем, что парсер обходит очень большое количество страниц и далеко не везде есть уникальные картинки. Зато несомненным плюсом данного способа является его простота реализации, буквально в несколько кликов, а также универсальность, т.к. его можно применять почти для любых сайтов.
    Код:
    eJxtVN9v2jAQ/lfQCalFRdA+7CXaJtGqaJtoYZQ+QSpZ5Mi8OnZmOxQU5X/fnRMS
    uvUpuc933333wy7BC/fqFhYdegfRuoQ8/EMEC2Ed9mQmUuwpqV9db38DQ8gZtuy7
    hm+rh1kUzejw/uCt2HpjySPBnSiUh2EJ/pgjUW0L5022RBdgsPVPBInwItgpHsj8
    LLN0/fI1vnJ2+2UDl+uXDcRXg5PHqiZLW4YGENaKI4Hh+ygyxoJs13qy3BqDuOp0
    mdxLo9lNJmSG0ma4R0XIXqiCfG6uqzhuaabGZoKV9/ObUZ1jtAvY5UU/2JuNvhh0
    eZ/EHleGAnZSYQdPyWqU9qkJyKcnosHIH7hLIkkkyxOqzso1dEqetfzD+sB5KzX3
    hEwr0U2tyQj2GEgYPJ5Ur6EfbCCaIsT/rGMg8rbAIThSOxWkJWkPdkI5OpEeraDx
    zpuORSUYPVEqdKtzC/S3hVQJrchkR0Hfm8CPXeb/cVRtheep9mjfLGloWYJ1O3/o
    ohIzMykVrg2VrWQmPdnuzhSa53VN4Cti3rbtkd0yY7FN0zA32elK5Kh5K7qpTfIO
    elfGu8m8B7dG72Q6pwKsTPDkWegV3bu5vjNZrpDr0oVSNBWHy25DJq4ZAxudwH+D
    70IKvk6niwfeGOV+PNVScytpAz+xwIw6eZ61odwKpZ6Xs/MT6DaKjF/e5y4aj60U
    I1uM34xVyRg40GNqaKP45QgrF8H9QTAJ3yo85EInmNT7VcVV3L4f7ZNTfviKRGVF
    M/3tFrU3N4B9CaNOOhoY3czqLxrgqEo=

    Способ 2: составление кастомного пресета
    В первую очередь необходимо немного изучить сайт-источник и продумать необходимый алгоритм работы.
    Итак, наша главная цель - собрать ссылки на иллюстрации к статьям. Открыв источник, мы видим список новостей и кнопку загрузки следующей страницы.

    [​IMG]

    Полноразмерные иллюстрации доступны внутри каждой новости, а также на странице со списком новостей присутствует пагинация для подгрузки очередной порции новостей. Таким образом нам необходимо чтобы парсер листая страницы пагинации зашел в каждую новость и уже оттуда забрал ссылку на изображение.
    Это не сложная задача для встроенного парсера Net::HTTP Net::HTTP, который является универсальным решением для множества задач. Также необходимо будет использовать многоуровневый парсинг, чтобы реализовать заход в каждую новость.

    [​IMG]

    В целом настройка заключается в указании регулярных выражений для сбора ссылок на новости, получения ссылки на следующую страницу и получения ссылок на картинку из новости.
    Как видно на скриншоте, в Формате результата используется шаблон, реализующий тот самый многоуровневый парсинг с помощью инструмента tools.query.addAll() и вывод результата:
    Код:
    [% IF query.lvl == 0;
        tools.query.addAll(p1.news, 'link');
    ELSE;
        p1.images.format('$image\n');
    END %]
    Также нужно включить уникализацию результатов и, желательно, запросов.

    [​IMG]

    В итоге также будет получен список ссылок, но в отличие от первого способа, здесь уже будут ссылки только на полноразмерные иллюстрации:

    https://cdnn21.img.ria.ru/images/07e5/0b/1c/1761134279_0:320:3072:2048_1920x0_80_0_0_fbccc8226588a518bd591cc9bfbaddf8.jpg.webp
    https://cdnn21.img.ria.ru/images/07e5/0b/19/1760663358_0:322:3070:2048_1920x0_80_0_0_bde4e27133ea68157cb23969b944420a.jpg.webp
    https://cdnn21.img.ria.ru/images/151611/33/1516113387_0:240:4608:2832_1920x0_80_0_0_b68ca6b3461327d0d6af94d83d8f3c77.jpg.webp
    https://cdnn21.img.ria.ru/images/07e4/0b/02/1582621552_0:320:3072:2048_1920x0_80_0_0_ccd02626592a822f716058630ae05471.jpg.webp
    Отсутствие различного мусора - это однозначное преимущество данного способа. Второй плюс заключается в том, что пресет, по сравнению с первым способом, отработает гораздо быстрее, т.к. ему не нужно обходить множество "лишних" страниц. К минусам можно отнести более сложную настройку и подготовку, которые требуют определенных навыков в решении таких задач.
    Код:
    eJyVVW1TGjEQ/is3GR2hIqAz/XKtOkhlaocCKn4CZDLcgim5y5nkAIfy37ubewPb
    fvDT3W727dl9Ntkyy83SDDQYsIb5oy2L3T/z2YBrA54I+QI8KaKl8VYXrMZiUmuy
    HbEeWN//PhwOUB/AnCfSstqW2bcYMIBagdYiADwUAcoLpYK2cvKKywRNRhfN5mRX
    eswSY1X4AMYFYjr98VnALXfyAjYovmiYX45ZZfQ8ZpPT6uj5anI6k9wYVEph7Jmw
    EE6nVlgJudswzbAowmYKrjV/Q6X79nhIugjWprAjpIzws/1KVWyFikwObfYCs2UP
    NnaA3Srxscq1f1BYqDSMmSuYMJ0lWv52PxH6klTdw0VVBYGgRFwyf3uYpStCQb1p
    st3/64rRsGV6sL5PQL+VhVmdwPvoS4DYmXVhBahp7j4+mRxs/KKsWglYT6cqhiiF
    /Omqfnr9VYQLh9/o2SHWD4/JUfPdoJwOJzWZFOqO0iGnWkfH3l3HeyWIdbmS3uWl
    1/wyjsbWKiVNPT3AnrSkrMTndWJBzTuh0Z9U0e62+3jrzPEsTV2fu9CVkyMnj8dR
    atj75h1Pyroe+QqGCguYi4yPaV0oZUiOsI1Ap3nEat1u7MH8UxSEsUT2FIlXRzNj
    tYioZ4RBgOloFaLaggvigOVdGLEjJzMMkzj/+9QnJ4XBajscawmKgzmXBk9wqzS3
    SvczjiFnVITNcnwpzVz4m0TIAK+J1hyd7jLHf5v0/4qxKxDup8LbZK2xhiKKk276
    P0uvQHXVghZYIWxJC4KyaaskSjel5khetK1HZrSSRZoscpYdr0UkL+1RObVWXKoO
    YBxM5lA5U9FcLPrZdZhbJtEQ795+1FZhLIFwRYmUOBUDDyVDWiYbAwllge+d2y4F
    LWR+DTPH6h+PaamxFsjAz1RgiJ3cz5qFnHEpnx66+yesZBTdutbGxm80tOB1nTTW
    SsugwcjRwkIho+j1cJTz2e2GUxBaTtjEPAogSPm1w9Us3pDi2dnuvST+Fu8d9ssM
    UhuCTRaow/4ZHBPzz3d/ADSaUYo=

    Какой способ использовать?
    Оба способа одинаково успешно можно использовать для сбора списка ссылок на картинки из сайтов. У каждого есть свои недостатки и преимущества. В целом, выбирая какой способ использовать, нужно учитывать нюансы конкретной задачи. Для рассматриваемой же задачи я бы предпочел второй способ.

    Этап 2: скачивание картинок по ссылкам
    Теперь, имея список ссылок на картинки, можно переходить непосредственно к их скачиванию. Для этого лучше всего воспользоваться уже готовым и доступным в нашем Каталоге парсером: Скачивание картинок. Этот парсер позволяет не только скачать картинки, а и определить "на лету" их размеры и ориентацию, а также сформировать отчет со списком загруженных файлов, благодаря чему по окончании работы можно будет проанализировать какие картинки были собраны. Также он умеет определять формат картинок и генерирует имена файлов на основе md5 ссылок, благодаря чему не возникнет проблем с сохранением с неправильным разрешением или ошибками из-за запрещенных символов в имени файла.

    [​IMG]

    Заключение
    В этой статье рассмотрены 2 способа сбора ссылок на изображения из сайта, а также комплексно дан ответ по решению задачи скачивания картинок со всего сайта. Рассмотрены плюсы и минусы каждого способа, а также их результативность. В целом для решения данной задачи достаточно начальных навыков работы с А-Парсером.
    Rost нравится это.