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.
Do pobierania obrazów z Yahoo Images potrzebne będą następujące biblioteki Python:
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
Najpierw musimy zaimportować niezbędne biblioteki dla naszego scrapera.
import requests
from lxml import html
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
)
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.
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)
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)
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:
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)
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