Скрапінг зображень з Yahoo Images за допомогою Python

Коментарі: 0

У цьому посібнику розглянемо, як використовувати Python для вилучення зображень з Yahoo Images, застосовуючи при цьому бібліотеки Requests і lxml для парсингу HTML. Особливу увагу буде приділено застосуванню проксі для мінімізації ризику блокування з боку механізмів Yahoo, призначених для виявлення і блокування ботів.

Необхідні інструменти та бібліотеки

Для скрапінгу зображень із сервісу Yahoo Images вам знадобляться такі інструменти та бібліотеки Python:

  • Requests: для надсилання HTTP-запитів.
  • lxml: для парсингу HTML.
  • Прокси: для уникнення блокування IP під час інтенсивного скрапінгу.

Встановлення необхідних бібліотек

Для налаштування середовища, переконайтеся, що у вас встановлені всі необхідні бібліотеки за допомогою pip:

pip install requests
pip install lxml

Або використовуйте одну команду для встановлення обох бібліотек:

pip install requests lxml

Покрокова інструкція зі скрапінгу за допомогою Python

Спочатку нам потрібно імпортувати необхідні бібліотеки для нашого скрапера за допомогою такої команди:

import requests
from lxml import html

Виконання пошуку в Yahoo Images

Далі ми виконаємо пошук у Yahoo Images. Визначимо пошуковий запит як "puppies" і відправимо GET-запит до пошуку зображень Yahoo з необхідними заголовками. Заголовки запиту важливі для імітації запиту з браузера, що допомагає обходити деякі базові механізми виявлення ботів.

# Визначення заголовків для імітації запиту з браузера
headers = {
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
    "accept-language": "en-IN,en;q=0.9",
    "cache-control": "max-age=0",
    "dnt": "1",
    "priority": "u=0, i",
    "sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Linux"',
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "none",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
}

# Визначення пошукового запиту
search_query = "puppies"

# Надсилання GET-запиту на сторінку пошуку зображень Yahoo
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Парсинг URL зображень за допомогою lxml

Після отримання відповіді від Yahoo нам потрібно проаналізувати HTML, щоб витягти URL зображень. Для цього ми використовуємо бібліотеку lxml.

# Парсинг HTML-відповіді
parser = fromstring(response.text)

# Витягти URL зображень за допомогою XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

Функція fromstring використовується для парсингу тексту HTML-відповіді. Xpath використовується для вилучення URL зображень. На зображенні нижче показано, як було отримано XPath:

yaho.png

Завантаження зображень

Далі необхідно виконати завантаження зображень зі списку "images_urls", що містить URL-адреси зображень. Для цього використовуємо такий підхід у Python: кожен URL у списку буде оброблено за допомогою GET-запиту для завантаження зображення.

# Скачайте кожне зображення і збережіть його у файл
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Збереження зображень

Далі, ми зберігаємо завантажені зображення в локальній файловій системі. Ми визначаємо функцію download_file, яка керує процесом збереження файлу.

Ця функція приймає індекс для створення унікальних імен файлів і відповідь, що містить дані зображення. Вона визначає розширення файлу із заголовка Content-Type і зберігає файл у директорії ./images/.

def download_file(count, response):
    # Отримайте розширення файлу із заголовка Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Створіть директорію, у разі якщо вона відсутня
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Запишіть вміст відповіді у файл
    with open(filename, "wb") as f:
        f.write(response.content)

Застосовуючи цю функцію в циклі, ми зберігаємо кожне завантажене зображення:

for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)
    download_file(count, response)

Механізми виявлення ботів на сервісі Yahoo

Під час скрапінгу даних з Yahoo важливо пам'ятати про механізми виявлення ботів Yahoo. Yahoo в основному використовує такі техніки для ідентифікації та блокування ботів для автоматизації:

  • Обмеження частоти запитів за IP: Yahoo відстежує частоту запитів, що надходять з однієї IP-адреси. Надмірна кількість запитів з одного IP може призвести до тимчасового або постійного блокування.
  • CAPTCHA: Yahoo може використовувати CAPTCHA для підтвердження, що користувач не є роботом.

Використання проксі для обходу обмежень

Щоб уникнути блокування механізмами виявлення ботів Yahoo, особливо під час надсилання безлічі запитів з однієї IP-адреси, ми використовуємо проксі для маскування IP-адреси.

Маршрутизація запитів через різні проксі дає змогу розподілити активність скрапера за безліччю IP-адрес, тим самим знижуючи ймовірність виявлення.

proxies = {
    'http': 'http://USER:PASS@HOST:PORT',
    'https': 'http://USER:PASS@HOST:PORT'
}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)

Повна версія коду

Нижче представлено коректний код для скрапінгу зображень із результатів пошуку Yahoo Images з використанням проксі:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Зберігає вміст відповіді у файл у директорії ./images/.

    Args:
        count (int): Унікальний ідентифікатор файлу.
        response (requests.Response): HTTP-відповідь, що містить контент файлу.

    """
    # Отримайте розширення файлу із заголовка Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Створіть директорію, у разі якщо вона відсутня
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Запишіть вміст відповіді у файл
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
   Основна функція для пошуку зображень та їхнього завантаження.

    Ця функція виконує такі дії:
    1. Налаштовує заголовки запиту.
    2. Шукає зображення цуценят на Yahoo.
    3. Аналізує HTML-відповідь для вилучення URL-адрес зображень.
    4. Завантажує кожне зображення і зберігає його в директорії ./images/.

    """
    # Визначте заголовки для імітації запиту з браузера
    headers = {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "accept-language": "en-IN,en;q=0.9",
        "cache-control": "max-age=0",
        "dnt": "1",
        "priority": "u=0, i",
        "sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"Linux"',
        "sec-fetch-dest": "document",
        "sec-fetch-mode": "navigate",
        "sec-fetch-site": "none",
        "sec-fetch-user": "?1",
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
    }

    # Визначте проксі для обходу обмежень за частотою запитів
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Визначте пошуковий запит
    search_query = "puppies"

    # Надішліть GET-запит на сторінку пошуку зображень Yahoo
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Парсинг HTML-відповіді
    parser = fromstring(response.text)

    # Витягніть URL зображень за допомогою XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Скачайте кожне зображення і збережіть його у файл
    for count, url in enumerate(images_urls):
        response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
        download_file(count, response)


if __name__ == "__main__":
    main()

Скрапінг зображень з результатів пошуку Yahoo Images за допомогою Python являє собою потужний метод автоматизації збору візуальних даних. Застосування бібліотеки Requests дає змогу ефективно надсилати HTTP-запити, а lxml спрощує парсинг HTML, забезпечуючи можливість витягувати URL-адреси зображень. Використання проксі важливе для забезпечення анонімності та запобігання блокування IP-адреси, що особливо актуально під час масового збору даних. Таким чином, не тільки розширюються можливості з обробки та аналізу даних, а й підвищується надійність і ефективність скрапінгових процесів.

Коментарії:

0 Коментаріїв