У цьому посібнику розглянемо, як використовувати Python для вилучення зображень з Yahoo Images, застосовуючи при цьому бібліотеки Requests і lxml для парсингу HTML. Особливу увагу буде приділено застосуванню проксі для мінімізації ризику блокування з боку механізмів Yahoo, призначених для виявлення і блокування ботів.
Для скрапінгу зображень із сервісу Yahoo Images вам знадобляться такі інструменти та бібліотеки Python:
Для налаштування середовища, переконайтеся, що у вас встановлені всі необхідні бібліотеки за допомогою pip:
pip install requests
pip install lxml
Або використовуйте одну команду для встановлення обох бібліотек:
pip install requests lxml
Спочатку нам потрібно імпортувати необхідні бібліотеки для нашого скрапера за допомогою такої команди:
import requests
from lxml import html
Далі ми виконаємо пошук у 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
)
Після отримання відповіді від 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:
Далі необхідно виконати завантаження зображень зі списку "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-адреси, ми використовуємо проксі для маскування 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-адреси, що особливо актуально під час масового збору даних. Таким чином, не тільки розширюються можливості з обробки та аналізу даних, а й підвищується надійність і ефективність скрапінгових процесів.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Коментарі: 0