Jak zeskrobać obrazy z Yahoo Images za pomocą Python

Komentarze: 0

Skrobanie obrazów z Yahoo Image Search jest ważne podczas generowania zestawów danych obrazów. W tym przewodniku wyjaśniono, jak skrobać obrazy z Yahoo Image Search przy użyciu Pythona, a także biblioteki Requests w połączeniu z lxml dla technik parsowania HTML. Poruszono również kwestię korzystania z serwera proxy, aby uniknąć złapania przez systemy wykrywania botów Yahoo.

Wymagane narzędzia i biblioteki

Do pobierania obrazów z Yahoo Images potrzebne będą następujące biblioteki Python:

  • Requests: Do wykonywania żądań HTTP.
  • lxml: Do analizowania kodu HTML.
  • Proxies: W celu uniknięcia zakazów IP podczas intensywnego skrobania.

Instalowanie bibliotek innych firm

Upewnij się, że masz zainstalowane wszystkie niezbędne biblioteki. Zainstaluj je za pomocą pip:

pip install requests
pip install lxml

Można też użyć pojedynczego polecenia:

pip install requests lxml

Przewodnik krok po kroku po skrobaniu w Pythonie

Najpierw musimy zaimportować niezbędne biblioteki dla naszego scrapera.

import requests
from lxml import html

Przeprowadź wyszukiwanie w Yahoo Images

Następnie przeprowadzimy wyszukiwanie w Yahoo Images.

Tutaj zdefiniujemy zapytanie wyszukiwania jako puppies i wyślemy żądanie GET do wyszukiwarki Yahoo Images z niezbędnymi nagłówkami. Nagłówki żądania są ważne, aby naśladować żądanie przeglądarki, co pomaga ominąć niektóre podstawowe mechanizmy wykrywania botów.

# Zdefiniuj nagłówki, aby naśladować żądanie przeglądarki
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",
}

# Zdefiniuj zapytanie wyszukiwania
search_query = "puppies"

# Wyślij żądanie GET do strony wyszukiwania Yahoo Images.
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Analizowanie adresów URL obrazów za pomocą lxml

Po otrzymaniu odpowiedzi od Yahoo musimy przeanalizować kod HTML, aby wyodrębnić adresy URL obrazów. W tym celu używamy lxml.

# Parsowanie odpowiedzi HTML
parser = fromstring(response.text)

# Wyodrębnianie adresów URL obrazów przy użyciu XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

Funkcja fromstring służy do analizowania tekstu odpowiedzi HTML. Xpath służy do wyodrębniania adresów URL obrazów. Poniższy zrzut ekranu pokazuje, w jaki sposób uzyskano ścieżkę xpath.

yaho.png

Pobierz obrazy

Mając listę adresów URL obrazów, musimy teraz pobrać każdy z nich.

Tutaj zapętlimy listę images_urls, aby wyodrębnić zarówno liczbę (indeks), jak i adres url (adres). Każdy obraz zostanie następnie pobrany poprzez wysłanie żądania GET do odpowiedniego adresu url.

# Pobierz każdy obraz i zapisz go w pliku
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Zapisywanie obrazów

Na koniec zapisujemy pobrane obrazy w lokalnym systemie plików. Definiujemy funkcję download_file, która obsługuje proces zapisywania plików.

Ta funkcja pobiera licznik (aby utworzyć unikalne nazwy plików) i odpowiedź (zawierającą dane obrazu). Określa rozszerzenie pliku na podstawie nagłówka Content-Type i zapisuje plik w katalogu ./images/.

def download_file(count, response):
    # Pobierz rozszerzenie pliku z nagłówka Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Utwórz katalog, jeśli nie istnieje
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Zapisanie zawartości odpowiedzi do pliku
    with open(filename, "wb") as f:
        f.write(response.content)

Wywołując tę funkcję w pętli, zapisujemy każdy pobrany obraz:

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

Mechanizmy wykrywania botów Yahoo

Podczas skrobania danych z Yahoo ważne jest, aby zdawać sobie sprawę z mechanizmów wykrywania botów Yahoo. Yahoo wykorzystuje te techniki głównie do identyfikowania i blokowania automatycznych botów:

  • Ograniczenie szybkości IP: Yahoo monitoruje liczbę żądań pochodzących z jednego adresu IP. Nadmierne żądania z jednego adresu IP mogą prowadzić do tymczasowych lub stałych zakazów.
  • CAPTCHAs: Yahoo może wprowadzać CAPTCHA dla użytkowników w celu weryfikacji, czy są oni ludźmi.

Korzystanie z serwerów proxy w celu uniknięcia wykrycia

Aby uniknąć zablokowania przez mechanizm wykrywania botów Yahoo, zwłaszcza w przypadku wysyłania wielu żądań z tego samego adresu IP, używamy serwerów proxy do maskowania naszego adresu IP.

Przekierowując nasze żądania przez różne serwery proxy, możemy rozdzielić naszą aktywność skrobania na wiele adresów IP, zmniejszając w ten sposób prawdopodobieństwo wykrycia.

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

Kompletny kod

Oto kompletny skrypt do pobierania obrazów z wyników wyszukiwania Yahoo Images przy użyciu serwerów proxy:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Zapisuje zawartość odpowiedzi do pliku w katalogu ./images/.

    Args:
        count (int): Unikalny identyfikator pliku.
        response (requests.Response): Odpowiedź HTTP zawierająca zawartość pliku.

    """
    # Pobierz rozszerzenie pliku z nagłówka Content-Type
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Utwórz katalog, jeśli nie istnieje
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Zapisanie zawartości odpowiedzi do pliku
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Główna funkcja wyszukiwania i pobierania obrazów.

    Funkcja ta wykonuje następujące czynności:
    1. Ustawia nagłówki żądania.
    2. Wyszukuje obrazy szczeniąt na Yahoo.
    3. Analizuje odpowiedź HTML, aby wyodrębnić adresy URL obrazów.
    4. Pobiera każdy obraz i zapisuje go w katalogu ./images/.

    """
    # Zdefiniuj nagłówki, aby naśladować żądanie przeglądarki
    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",
    }

    # Definiowanie serwerów proxy w celu ominięcia ograniczeń szybkości
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Zdefiniuj zapytanie wyszukiwania
    search_query = "puppies"

    # Wyślij żądanie GET do strony wyszukiwania Yahoo Images.
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Parsowanie odpowiedzi HTML
    parser = fromstring(response.text)

    # Wyodrębnianie adresów URL obrazów przy użyciu XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Pobierz każdy obraz i zapisz go w pliku
    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()

Skrobanie obrazów z Yahoo Image Search za pomocą Pythona to potężna technika automatyzacji zadań gromadzenia i analizy danych. Wykorzystując bibliotekę Requests do żądań HTTP i bibliotekę lxml do analizowania HTML, można skutecznie wyodrębniać adresy URL obrazów i pobierać obrazy. Włączenie serwerów proxy pomaga uniknąć wykrycia i zakazów IP podczas szeroko zakrojonych działań związanych ze skrobaniem.

Komentarze:

0 komentarze