Соскабливание нескольких изображений в Интернете
В этой статье рассказывается о соскабливании нескольких изображений с веб-страницы. Основное требование — получить все изображения с веб-страницы и сохранить их в локальной папке, а дополнительное требование — сохранить изображения с их названиями, чтобы этими файлами можно было легко управлять или обрабатывать в дальнейшем.
Существуют некоторые инструменты загрузки, которые можно использовать для сохранения всех веб-изображений в папку, но изображения в основном сохраняются с идентификаторами или случайными именами, которые нелегко понять. Поэтому я реализую этот сценарий с помощью Python-модуля Clicknium за его простоту в запуске и хороший опыт в захвате списка похожих элементов.
Давайте посмотрим на веб-страницу для списка изображений, как показано ниже. Каждый элемент содержит изображение, название и цену. Ожидаемый результат — папка, содержащая все изображения с названием в качестве имени.
Мы рассмотрим процесс скраппинга в 3 частях, как показано ниже:
- Подготовка инструмента разработки
- Захват локатора для изображения
- Написание кода автоматизации
Подготовка инструмента разработки
- Установите Visual Studio Code и расширение Clicknium.
- Для завершения установки следуйте инструкциям документа быстрого запуска расширения Clicknium.
Захват локатора для изображения
После настройки среды разработки откройте пустую папку в VSCode и создайте новый файл .py.
-
Начните захват локатора, нажав на кнопку ниже или нажмите «Ctrl+F10».
-
После вызова «Clicknium Recorder» нажмите кнопку «Похожие элементы» в рекордере, чтобы захватить локатор для списка изображений.
-
После нажатия на кнопку появится мастер, предлагающий сгенерировать локатор, который может соответствовать всем ожидаемым изображениям.
Наведите курсор мыши на элемент и добавьте первый целевой элемент, нажав «Ctrl+Click». Это может быть любой элемент из списка изображений. | ![]() |
После добавления элемента мастер покажет, сколько похожих элементов может быть найдено добавленным локатором. Так как здесь добавлен только один элемент, то пока он также соответствует одному целевому элементу. Мы можем захватить еще одно изображение из списка, чтобы получить больше совпадений. |
![]() |
После добавления 3 изображений в мастер мы видим, что теперь 21 элемент сопоставлен с автоматически сгенерированным локатором. | ![]() |
Поскольку всего на веб-странице 22 изображения, мы будем продолжать добавлять в мастер новые элементы изображений, пока все 22 элемента не будут сопоставлены с автоматически сгенерированным локатором. (Если количество совпадений не ожидается, мы всегда можем добавить больше элементов). Нажмите кнопку «Сохранить», чтобы завершить работу мастера. |
![]() |
После захвата локатора мы можем открыть локатор, чтобы увидеть его детали, как показано ниже в Visual Studio Code. Подробные свойства могут быть обновлены вручную, если их можно оптимизировать.
На панели редактора локатора мы также можем нажать кнопку «Validate», чтобы убедиться, что все 22 элемента соответствуют ожидаемым. После нажатия кнопки «Validate» можно запустить мастер для определения местоположения целевых элементов по одному. Если какой-либо целевой элемент неверен, мы можем
- восстановить локатор, пройдя через мастер снова
- или вручную изменить локатор в панели редактирования локатора, расположенной выше.
Захват заголовков изображений выполняется так же, как описано выше. Определение локатора приведено ниже:
Написать код автоматизации
Теперь, имея локаторы, мы можем написать код следующим образом
- Получить изображения и заголовки
- Загрузить изображение и сохранить его с названием в качестве имени файла
import os
import requests
import shutil
from clicknium import clicknium as cc, locator, ui
# attach to the opened browser, the url is a fake site
tab = cc.edge.attach_by_title_url(url = "https://gallerydemo.com/pages/outerwear")
# get images and titles
imgs = tab.find_elements(locator.msedge.gallerydept.img_out)
titles = tab.find_elements(locator.msedge.gallerydept.span_out)
# iterate every image element
for x in range(len(imgs)):
src = imgs[x].get_property("src")
tstr = titles[x].get_text()
# download image with url and save to folder with title as name
res = requests.get("https:"+src, stream = True)
if res.status_code == 200:
file = "c:\test\gallery\" + tstr + ".png"
# use different name if the title is duplicated
if(os.path.exists(file)):
file = "c:\test\gallery\" + tstr + str(x) + ".png"
with open(file,'wb') as f:
shutil.copyfileobj(res.raw, f)
print('Image sucessfully downloaded: ',tstr)
else:
print('Image Couldn't be retrieved')
- Полный код можно найти на GitHub.
Результат выполнения показан ниже. Изображения сохраняются в папке c:testgallery с названием в качестве имени и тем же именем, что и на веб-странице.
Заключение
В этой статье я показал, как соскабливать изображения из Интернета. С помощью функции Clicknium «Похожие элементы» можно легко находить изображения по щелчку мыши и писать код, используя сгенерированный локатор.
Важной частью является захват похожих элементов, чем больше элементов вы добавите, тем точнее будет сгенерированный локатор. Хорошей практикой является добавление элементов в разных местах, например, в разных столбцах и разных строках, чтобы увеличить охват для генерации правильного локатора.
Подробнее о Clicknium читайте в документе.