Пошаговое руководство: Как соскабливать изображения с помощью Python

Путеводители, Как сделать, Скрапинг, Сентябрь-05-20245 минут чтения

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

Основы скраппинга изображений с помощью Python

Чтобы приступить к поиску изображений с помощью Python, вам нужно ознакомиться с некоторыми ключевыми библиотеками, которые облегчают эту задачу. Наиболее популярными являются BeautifulSoup, Scrapy и Requests.

BeautifulSoup для извлечения URL-адресов изображений

BeautifulSoup - это библиотека Python для разбора HTML- и XML-документов. Она создает дерево разбора из исходных кодов страниц, которое можно использовать для извлечения данных.

Вот простой пример извлечения URL-адресов изображений с помощью BeautifulSoup:

Шаг 1: Установите BeautifulSoup и Requests:

 pip install bs4 requests

Шаг 2: Извлечение URL-адресов изображений:

 импортировать запросы
 из bs4 import BeautifulSoup

 url = 'https://books.toscrape.com/'

 response = requests.get(url)

 soup = BeautifulSoup(response.text, 'html.parser')
 изображения = soup.find_all('img')

This code fetches the HTML content of the specified URL, parses it with BeautifulSoup, and then finds all the `<img>` tags, printing out their `src` attributes.

Загрузка изображений с помощью Python

Once you've extracted the image URLs, the next step is to download them. The Requests library is perfect for this task due to its simplicity and ease of use.

Использование запросов для загрузки изображений

Вот как можно загрузить изображения с помощью Requests:

Загрузите изображение с URL:

for ind, img in enumerate(images):
   img_data = requests.get(url+img['src']).content
   with open(f'image_{ind+1}.jpg', 'wb') as handler:
       handler.write(img_data)

Этот скрипт отправляет GET-запрос на URL-адрес изображения и записывает его двоичное содержимое в файл.

Обработка ошибок и исключений

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

Обработка ошибок:

for ind, img in enumerate(images):
   try:
       img_data = requests.get(url+img['src']).content
       with open(f'image_{ind+1}.jpg', 'wb') as handler:
           handler.write(img_data)
   except Exception as e:
       print(f"An error occurred during the extraction of image \n Image Url: {img['src']} \n Error: {e}")

Этот фрагмент кода включает блок try-except, чтобы перехватить любые ошибки, которые могут возникнуть в процессе загрузки.

Продвинутые техники поиска изображений

Для более сложных задач, таких как создание нескольких страниц или целых веб-сайтов, Scrapy - это мощная библиотека, которая эффективно справляется с такими сценариями.

Использование Scrapy для решения сложных задач

Scrapy - это фреймворк для совместного веб-скраппинга на Python с открытым исходным кодом. Он создан для скорости и эффективности, что делает его идеальным для крупных проектов по скраппингу.

Шаг 1: Установите Scrapy:

 pip install scrapy

Шаг 2: Создайте проект Scrapy:

 scrapy startproject image_scraper
 cd image_scraper

Шаг 3: Определите паука:

Создайте файл паука (`spiders/image_spider.py`) со следующим содержимым:

import scrapy
class ImageSpider(scrapy.Spider):
   name = 'imagespider'
   start_urls = ['https://books.toscrape.com/']
   def parse(self, response):
       # Extract image URLs and convert them to absolute if necessary
       for img in response.css('img::attr(src)').getall():
           abs_img_url = response.urljoin(img)
           yield {'image_url': abs_img_url}
      
       # Find the link to the next page and create a request for it
       next_page = response.css('a.next::attr(href)').get()
       if next_page is not None:
           next_page_url = response.urljoin(next_page)
           yield response.follow(next_page_url, self.parse)

Этот простой паук Scrapy запускается по заданному URL-адресу, извлекает все URL-адреса изображений и переходит по ссылкам на следующую страницу, чтобы продолжить поиск.

Улучшение проектов по скрапбукингу изображений

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

Использование API для скрапинга изображений

API обеспечивают надежный и легальный способ доступа к изображениям. Многие сайты предлагают API, позволяющие программно искать и загружать изображения. Один из таких сайтов - Unsplash API.

Пример с использованием API Unsplash:

import requests
# Replace 'YOUR_ACCESS_KEY' with your actual Unsplash Access Key
api_url = "https://api.unsplash.com/photos/random"
headers = {"Authorization": "Client-ID YOUR_ACCESS_KEY"}
params = {"query": "nature"}
try:
   response = requests.get(api_url, headers=headers, params=params)
   response.raise_for_status()  # This will raise an exception for HTTP errors
   data = response.json()
   image_url = data['urls']['full']
   print(image_url)
except requests.exceptions.HTTPError as err:
   print(f"HTTP error occurred: {err}")
except Exception as err:
   print(f"An error occurred: {err}")

Этот скрипт использует API Unsplash для получения случайного изображения природы.

Автоматизация задач по поиску изображений

Автоматизация экономит время и обеспечивает бесперебойное выполнение задач по скрапбукингу без ручного вмешательства. Такие инструменты, как задания cron в Unix-системах или планировщик задач в Windows, позволяют планировать выполнение скриптов через регулярные промежутки времени.

Задания Cron в Unix-системах - Crontab:

Crontab - это мощная утилита в Unix-подобных операционных системах для планирования задач, известных как"задания cron", для автоматического выполнения в указанное время. Давайте посмотрим, как можно запланировать задание с помощью Crontab.

Понимание синтаксиса Crontab:

Файл crontab состоит из командных строк, где каждая строка представляет собой отдельное задание. Синтаксис выглядит следующим образом:

МИН ЧАС ДОМ МОН ДОУ СМД
  • MIN: поле минут (от 0 до 59)
  • HOUR: поле часов (от 0 до 23)
  • DOM: День месяца (от 1 до 31)
  • MON: поле месяца (от 1 до 12)
  • DOW: День недели (от 0 до 7, где 0 и 7 обозначают воскресенье)
  • CMD: команда для запуска (в данном случае это будет исполняемый файл вашего скрипта python).

Вот пример запуска сценария python ежедневно в 8:00PM

0 20 * * * /usr/bin/python3/path/to/Image_Scraper.py

Использование планировщика задач (Windows):

  • Откройте "Планировщик заданий" (используйте строку поиска в windows и найдите "Task Scheduler").
  • Нажмите"Создать основную задачу".
  • Укажите имя и описание и нажмите"Далее".
  • Выберите гранулярность или интервал, через который нужно запускать эту задачу, и нажмите"Далее".
  • Теперь убедитесь, что флажок"Запустить программу" установлен, и нажмите"Далее".
  • Укажите путь к вашему скрипту python, нажав на кнопку"Обзор". Если вам необходимо указать какие-либо аргументы для вашего скрипта python, вы можете сделать это, добавив их в поле"Добавить аргументы" и нажав"Далее".
  • В качестве последнего шага просто нажмите кнопку"Готово", и все, задача готова к запуску через заданный интервал времени.

Заключение

В этой статье мы рассмотрели, как с помощью Python соскребать изображения с сайтов. Мы рассмотрели основы работы с BeautifulSoup и Requests, продвинутые методы работы со Scrapy и этические нормы скрапинга. Кроме того, мы обсудили, как улучшить ваши проекты по скраппингу с помощью API и инструментов автоматизации, таких как планировщик задач Windows.

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

Счастливого скраппинга!