Как создать парсер для извлечения фотографий и их названий с помощью Python?

Мне нужна помощь или советы по созданию парсера, который будет извлекать фотографии продукции с сайта производителя и сохранять их в соответствующие папки. Например, есть сайт <a href="https://www.gigabyte.ru/products/mb/all-series?filters=200005" rel="nofollow">https://www.gigabyte.ru/products/mb/all-series?fil...</a> с множеством материнских плат. Парсер должен создавать папки с названиями материнских плат (например, "X870 GAMING X WIFI7") и сохранять в них 4 фотографии из карточки каждой материнской платы, повторяя этот процесс для всей продукции.
  • 21 сентября 2024 г. 20:03
Ответы на вопрос 2
Создание парсера для извлечения фотографий и названий с веб-сайта относится к области веб-скрейпинга. Я расскажу вам, как это можно реализовать с помощью Python и популярных библиотек, таких как `requests` и `BeautifulSoup`. Обратите внимание, что перед началом работы с веб-скрейпингом важно ознакомиться с условиями использования и правилами сайта, чтобы убедиться, что вы не нарушаете их политику.

### Шаги для создания парсера

1. **Установка необходимых библиотек**:
   Убедитесь, что у вас установлены необходимые библиотеки. Вы можете установить их с помощью pip:

   ```bash
   pip install requests beautifulsoup4
   ```

2. **Импорт библиотек**:
   Начнем с импорта библиотек и настройки основного кода:

   ```python
   import os
   import requests
   from bs4 import BeautifulSoup
   ```

3. **Создание функции для скачивания изображений**:
   Создайте функцию, которая будет загружать изображения и сохранять их в указанные папки.

   ```python
   def download_image(url, folder, filename):
       if not os.path.exists(folder):
           os.makedirs(folder)
       img_data = requests.get(url).content
       with open(os.path.join(folder, filename), 'wb') as handler:
           handler.write(img_data)
   ```

4. **Парсинг страницы с материнскими платами**:
   Теперь напишем код для извлечения названий и изображений материнских плат с указанного URL.

   ```python
   def parse_motherboards(url):
       response = requests.get(url)
       soup = BeautifulSoup(response.text, 'html.parser')

       # Поиск карточек продукции
       products = soup.find_all("div", class_="product-card")  # Уточните класс в зависимости от фактической структуры HTML

       for product in products:
           # Извлечение названия материнской платы
           title = product.find("h2").text.strip()  # Убедитесь, что теги правильные
           folder_name = title.replace('/', '_')  # Замена возможных недопустимых символов
           
           # Извлечение изображений (например, первые 4)
           images = product.find_all("img", limit=4)  # Уточните, как именно извлекаются изображения

           for index, img in enumerate(images):
               img_url = img['src']  # или другой атрибут, если требуется, например, `data-src`
               download_image(img_url, folder_name, f'img_{index+1}.jpg')
   ```

5. **Запуск парсера**:
   Вы можете запустить парсер, указав URL-адрес, приведенный в вопросе:

   ```python
   if __name__ == "__main__":
       parse_motherboards("https://www.gigabyte.ru/products/mb/all-series?filters=200005")
   ```

### Полезные советы

- **Обработка ошибок**: Добавьте обработку ошибок, чтобы учесть возможные сбои при подключении или ошибках в разметке.
  
- **Соблюдение правил веб-скрейпинга**: Убедитесь, что вы не отправляете слишком много запросов за короткий период времени, чтобы не перегружать сервер. Используйте библиотеки вроде `time` для добавления задержек.

- **Уточнение селекторов**: Обратите внимание на структуру HTML на сайте, чтобы правильно настроить селекторы для извлечения нужной информации.

- **Использование `User-Agent`**: Иногда сайты могут блокировать запросы с по умолчанию `User-Agent`. Попробуйте добавлять заголовок:

   ```python
   headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}
   response = requests.get(url, headers=headers)
   ```

Этот пример должен помочь вам начать. Попробуйте настраивать код под свои нужды, если структура HTML будет отличаться от ожиданий.
Отправьте запрос на https://www.gigabyte.ru/api/productsBySpecs?catego... 
В ответ получите json
В этом json есть поле products
В нем вы найдете все данные о продуктах на странице с картинкой и тд
Для отдельного продукта есть другой endpoint https://www.gigabyte.ru/api/product/keyFeatures?pr...

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