- Создание таблицы в MySQL
- Парсинг данных с сайта
- Обработка данных
- Создание API для товаров
- Загрузка изображений
- Описание товаров
- Цены товаров
- Атрибуты товаров
- Импорт данных о товарах в MySQL
- Вставка данных в таблицу
- Загрузка товаров в базу данных
- FAQ
- Как выбрать версию Python для Django?
- Как установить Django?
- Как подключиться к базе данных MySQL из Django?
- Как парсить данные с веб-сайта?
- Как загрузить изображения на сервер?
- Как отобразить изображения на веб-странице?
- Как форматировать текст описания товаров?
- Как добавить сравнительную таблицу на сайт?
- Как создать API для управления данными о товарах?
Создание таблицы в MySQL
Я решил создать базу данных для своего интернет-магазина футболок Polo. Для этого я использовал MySQL, мощную и популярную систему управления базами данных. Сначала я создал таблицу с помощью SQL-запроса. Я назвал её «polo_shirts», чтобы было понятно, о чём идёт речь.
В таблице «polo_shirts» я определил следующие поля:
- id: уникальный идентификатор каждой футболки. Я сделал его первичным ключом.
- name: название футболки. Я решил, что это поле должно быть текстовым.
- description: описание футболки. Я решил, что это поле должно быть текстовым.
- price: цена футболки. Я решил, что это поле должно быть числовым.
- image_url: URL-адрес изображения футболки. Я решил, что это поле должно быть текстовым.
- color: цвет футболки. Я решил, что это поле должно быть текстовым.
- size: размер футболки. Я решил, что это поле должно быть текстовым.
Я также задал типы данных для каждого поля, чтобы MySQL понимал, как хранить информацию. Например, для «id» я использовал тип данных INT, а для «name» — VARCHAR.
Вот как выглядит мой SQL-запрос:
CREATE TABLE polo_shirts (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
image_url VARCHAR(255) NOT NULL,
color VARCHAR(255) NOT NULL,
size VARCHAR(255) NOT NULL
);
После выполнения этого запроса у меня появилась таблица «polo_shirts» с необходимыми полями. Теперь я готов к следующему шагу — импорту данных о товарах.
Парсинг данных с сайта
Я обнаружил, что данные о товарах были представлены в виде списка элементов с определёнными классами. Это было удобно, потому что я мог легко извлечь эти элементы с помощью Python. Я использовал библиотеку Beautiful Soup 4 для работы с HTML-кодом. Сначала я загрузил HTML-код страницы с помощью библиотеки requests. Затем я передал этот код в Beautiful Soup 4, чтобы создать объект, с которым можно работать. После этого я использовал методы Beautiful Soup 4, чтобы найти нужные мне элементы и извлечь из них данные.
Например, чтобы получить название футболки, я использовал следующий код:
from bs4 import BeautifulSoup
import requests
url = 'https://example.com/polo-shirts'
response = requests.get(url)
polo_shirts = soup.find_all('div', class_='product-item')
for polo_shirt in polo_shirts:
name = polo_shirt.find('h3', class_='product-title').text.strip
print(name)
Аналогичным образом я извлёк данные о других атрибутах футболки: описание, цена, изображение, цвет, размер. Я сохранил все данные в списке Python. После этого я мог использовать эти данные для заполнения таблицы «polo_shirts» в MySQL.
Обработка данных
После того, как я извлек данные о футболках Polo с сайта, мне нужно было обработать их перед тем, как загружать в MySQL. Парсинг веб-страниц часто приводит к неконсистентным данным, которые нужно привести в порядок. Я столкнулся с несколькими проблемами, которые пришлось решать.
Во-первых, некоторые данные содержали лишние пробелы или символы. Например, в описании футболки могли быть лишние пробелы в начале или конце строки. Чтобы решить эту проблему, я использовал метод strip для удаления лишних пробелов. Также я использовал метод replace для замены нежелательных символов на пустые строки.
Во-вторых, цена футболки могла быть представлена в разных форматах. Например, на некоторых сайтах цена могла быть записана с использованием точки в качестве разделителя десятичных дробей, а на других — с использованием запятой. Чтобы привести цену к единому формату, я использовал регулярные выражения. Я создал шаблон, который вычленяет числовую часть цены, а затем преобразовал её в десятичный формат.
В-третьих, я столкнулся с проблемой перекодирования. Некоторые данные были закодированы в UTF-8, а другие — в ASCII. Чтобы избежать ошибок при загрузке данных в MySQL, я перекодировал все данные в UTF-8 с помощью метода encode.
В целом, обработка данных была довольно простой, но важной. Я убедился, что данные были очищены, переформатированы и закодированы правильно, чтобы их можно было легко загрузить в MySQL. Вот пример кода, который я использовал для обработки данных:
# Обработка названия
name = name.strip
# Обработка описания
description = description.strip.replace('
', ' ').replace(' ', ' ')
# Обработка цены
price = float(price.replace(',', '.').replace(' ', ''))
# Обработка изображения
image_url = image_url.strip
# Обработка цвета
color = color.strip
# Обработка размера
size = size.strip
# Перекодировка
name = name.encode('utf-8')
description = description.encode('utf-8')
color = color.encode('utf-8')
size = size.encode('utf-8')
Этот код показывает, как я обработал данные о названии, описании, цене, изображении, цвете и размере футболки. Я использовал различные методы для очистки, переформатирования и перекодирования данных. После обработки данные были готовы к загрузке в MySQL.
Создание API для товаров
После того, как я загрузил данные о футболках Polo в MySQL, я решил создать API для управления этими данными. Это позволило бы мне легко получить доступ к данным из других приложений, например, из веб-приложения интернет-магазина. Я использовал Django, популярный фреймворк для веб-разработки на Python, чтобы создать API.
Сначала я создал модель Django для представления таблицы «polo_shirts» в MySQL. Я использовал функцию create_table из библиотеки django.db.models для создания модели. Я определил поля модели, которые соответствовали полям таблицы «polo_shirts»:
from django.db import models
class PoloShirt(models.Model):
name = models.CharField(max_length=255)
description = models.TextField
price = models.DecimalField(max_digits=10, decimal_places=2)
image_url = models.URLField
color = models.CharField(max_length=255)
size = models.CharField(max_length=255)
Затем я создал сериализатор для модели PoloShirt. Сериализатор позволяет преобразовать данные модели в формат JSON, который легко передавать по сети. Я использовал класс ModelSerializer из библиотеки rest_framework.serializers:
from rest_framework import serializers
class PoloShirtSerializer(serializers.ModelSerializer):
class Meta:
model = PoloShirt
fields = '__all__'
После этого я создал представление API для модели PoloShirt. Представление API определяет правила, по которым API будет обрабатывать запросы. Я использовал класс ModelViewSet из библиотеки rest_framework.viewsets. Это представление предоставляет стандартные операции CRUD (создание, чтение, обновление, удаление) для модели PoloShirt:
from rest_framework import viewsets
class PoloShirtViewSet(viewsets.ModelViewSet):
queryset = PoloShirt.objects.all
serializer_class = PoloShirtSerializer
Наконец, я настроил маршруты API в файле urls.py. Я использовал функцию include для включения маршрутов API, определенных в файле routers.py. В файле routers.py я создал роутер, который регистрирует представление API PoloShirtViewSet:
from rest_framework import routers
router = routers.DefaultRouter
router.register(r'polo-shirts', PoloShirtViewSet)
После завершения этих действий я получил API, которое позволяло мне создавать, читать, обновлять и удалять данные о футболках Polo из других приложений. Я мог легко получить доступ к данным API, используя HTTP-запросы. API был доступен по адресу, указанному в настройках Django. Например, чтобы получить список всех футболок Polo, я мог отправить GET-запрос по адресу http://localhost:8000/api/polo-shirts/. API вернул бы JSON-представление данных о футболке.
Загрузка изображений
Я решил, что для моего интернет-магазина футболок Polo нужно добавить изображения к каждой футболке. Я добавил поле image_url в таблицу «polo_shirts» в MySQL, чтобы хранить URL-адреса изображений. Но я также хотел, чтобы изображения хранились на сервере, чтобы обеспечить более быструю загрузку страниц и независимость от внешних ресурсов. Я решил использовать библиотеку Pillow для работы с изображениями в Python.
Сначала я добавил поле image в модель PoloShirt в Django. Я использовал класс ImageField из библиотеки django.db.models:
from django.db import models
class PoloShirt(models.Model):
# ... другие поля ...
image = models.ImageField(upload_to='polo_shirts/images')
Затем я настроил каталог для хранения изображений в настройках Django. Я добавил путь к каталогу в параметр MEDIA_ROOT:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Я также добавил путь к каталогу в параметр MEDIA_URL, который используется для доступа к изображениям через URL:
MEDIA_URL = '/media/'
После этого я обновил сериализатор PoloShirtSerializer, чтобы он включал поле image:
from rest_framework import serializers
class PoloShirtSerializer(serializers.ModelSerializer):
class Meta:
model = PoloShirt
fields = '__all__'
Теперь, когда я создавал новую футболку через API, я мог передать изображение в качестве файла. Django автоматически сохранял изображение в каталог MEDIA_ROOT, а URL-адрес изображения сохранялся в поле image в базе данных. Я также мог загрузить изображения для существующих футболок, используя API.
Чтобы отобразить изображения на веб-странице, я использовал тег img. Я указал атрибут src, который содержал URL-адрес изображения из поля image модели PoloShirt. Например, чтобы отобразить изображение футболки с ID 1, я мог использовать следующий код:

Таким образом, я реализовал загрузку изображений для футболок Polo, обеспечивая хранение изображений на сервере и доступ к ним через API.
Описание товаров
Я решил, что для каждой футболки Polo в моем интернет-магазине нужно добавить подробное описание, чтобы покупатели могли получить больше информации о товаре. Я добавил поле description в таблицу «polo_shirts» в MySQL, чтобы хранить текст описания. Но мне нужно было убедиться, что описание будет красиво форматировано на странице товара. Я решил использовать язык разметки Markdown, который позволяет создавать простой и читабельный текст с форматированием.
Я добавил поле description в модель PoloShirt в Django. Я использовал класс TextField из библиотеки django.db.models:
from django.db import models
class PoloShirt(models.Model):
# ... другие поля ...
description = models.TextField
Затем я обновил сериализатор PoloShirtSerializer, чтобы он включал поле description:
from rest_framework import serializers
class PoloShirtSerializer(serializers.ModelSerializer):
class Meta:
model = PoloShirt
fields = '__all__'
Теперь, когда я создавал новую футболку через API, я мог передать описание в формате Markdown. Django автоматически сохранял описание в поле description в базе данных. Я также мог редактировать описание существующих футболок, используя API.
Например, чтобы отобразить описание футболки с ID 1, я мог использовать следующий код:
{% load static %}
{{ markdown(polo_shirt.description) }}
Таким образом, я реализовал поддержку Markdown для описаний футболок Polo, обеспечивая красивое и читабельное отображение описаний на веб-странице.
Цены товаров
Я решил, что для каждой футболки Polo в моем интернет-магазине нужно отображать цену. Я добавил поле price в таблицу «polo_shirts» в MySQL, чтобы хранить цену товара. Мне нужно было обеспечить удобный формат отображения цены для покупателей, а также реализовать возможность изменения цены через API. Я решил использовать тип данных DecimalField из библиотеки Django.db.models для хранения цены.
Я добавил поле price в модель PoloShirt в Django. Я использовал класс DecimalField из библиотеки django.db.models:
from django.db import models
class PoloShirt(models.Model):
# ... другие поля ...
price = models.DecimalField(max_digits=10, decimal_places=2)
Я также настроил сериализатор PoloShirtSerializer, чтобы он включал поле price:
from rest_framework import serializers
class PoloShirtSerializer(serializers.ModelSerializer):
class Meta:
model = PoloShirt
fields = '__all__'
Теперь, когда я создавал новую футболку через API, я мог передать цену в формате десятичного числа. Django автоматически сохранял цену в поле price в базе данных. Я также мог редактировать цену существующих футболок, используя API.
Чтобы отобразить цену на веб-странице, я использовал тег {{ }}. Я указал имя поля price модели PoloShirt внутри тега. Например, чтобы отобразить цену футболки с ID 1, я мог использовать следующий код:
{{ polo_shirt.price }}
Django автоматически форматировал цену в удобном виде, используя точку в качестве разделителя десятичных дробей. Также, я мог добавить валюту к цене, используя тег {{ }} и имя переменной, содержащей валюту.
{{ polo_shirt.price }} {{ currency }}
В этом коде я использовал переменную currency, которая содержала название валюты. Django автоматически заменял эту переменную на фактическое название валюты, которое было определено в настройках Django.
Таким образом, я реализовал отображение цены для футболок Polo, обеспечивая удобный формат для покупателей и возможность изменения цены через API.
Атрибуты товаров
Я решил, что для каждой футболки Polo в моем интернет-магазине нужно добавить несколько атрибутов, таких как цвет и размер. Это позволило бы покупателям выбирать футболку, которая им подходит. Я добавил поля color и size в таблицу «polo_shirts» в MySQL, чтобы хранить эти атрибуты. Мне нужно было обеспечить удобный формат отображения атрибутов для покупателей, а также реализовать возможность изменения атрибутов через API. Я решил использовать тип данных CharField из библиотеки Django.db.models для хранения атрибутов.
Я добавил поля color и size в модель PoloShirt в Django. Я использовал класс CharField из библиотеки django.db.models:
from django.db import models
class PoloShirt(models.Model):
# ... другие поля ...
color = models.CharField(max_length=255)
size = models.CharField(max_length=255)
Я также настроил сериализатор PoloShirtSerializer, чтобы он включал поля color и size:
from rest_framework import serializers
class PoloShirtSerializer(serializers.ModelSerializer):
class Meta:
model = PoloShirt
fields = '__all__'
Теперь, когда я создавал новую футболку через API, я мог передать цвет и размер в качестве строковых значений. Django автоматически сохранял эти значения в поля color и size в базе данных. Я также мог редактировать цвет и размер существующих футболок, используя API.
Чтобы отобразить атрибуты на веб-странице, я использовал тег {{ }}. Я указал имена полей color и size модели PoloShirt внутри тега. Например, чтобы отобразить цвет и размер футболки с ID 1, я мог использовать следующий код:
Цвет: {{ polo_shirt.color }}
Размер: {{ polo_shirt.size }}
Django автоматически форматировал атрибуты в удобном виде, используя строковые значения. Также, я мог добавить текст перед атрибутами, используя тег {{ }} и имя переменной, содержащей текст.
Цвет: {{ polo_shirt.color }}
Размер: {{ polo_shirt.size }}
В этом коде я использовал переменную currency, которая содержала название валюты. Django автоматически заменял эту переменную на фактическое название валюты, которое было определено в настройках Django.
Таким образом, я реализовал отображение атрибутов для футболок Polo, обеспечивая удобный формат для покупателей и возможность изменения атрибутов через API.
Импорт данных о товарах в MySQL
После того, как я обработал данные о футболках Polo, полученные с помощью парсинга, мне нужно было загрузить их в базу данных MySQL. Я использовал библиотеку mysql.connector для Python, чтобы подключиться к MySQL и вставить данные в таблицу «polo_shirts». Я создал соединение с базой данных, используя данные о хосте, имени пользователя, пароле и базе данных. Затем я создал курсор для выполнения SQL-запросов.
Я использовал метод execute для выполнения SQL-запроса INSERT, чтобы вставить данные в таблицу «polo_shirts». Я передал в метод execute SQL-запрос с подстановкой значений из списка Python, который я получил в результате парсинга и обработки данных.
Например, чтобы вставить данные о футболке с названием «Футболка Polo с коротким рукавом», описанием «Классическая футболка Polo с коротким рукавом», ценой 1000 рублей, URL-адресом изображения «https://example.com/polo_shirt.jpg», цветом «синий» и размером «M», я мог использовать следующий код:
import mysql.connector
# Данные для подключения к MySQL
host = 'localhost'
user = 'username'
password = 'password'
database = 'database_name'
# Создание соединения с базой данных
cnx = mysql.connector.connect(host=host, user=user, password=password, database=database)
# Создание курсора
cursor = cnx.cursor
# Вставка данных в таблицу "polo_shirts"
sql = "INSERT INTO polo_shirts (name, description, price, image_url, color, size) VALUES (%s, %s, %s, %s, %s, %s)"
val = ('Футболка Polo с коротким рукавом', 'Классическая футболка Polo с коротким рукавом', 1000.00, 'https://example.com/polo_shirt.jpg', 'синий', 'M')
cursor.execute(sql, val)
# Сохранение изменений в базе данных
cnx.commit
# Закрытие курсора и соединения
cursor.close
cnx.close
В этом коде я сначала импортировал библиотеку mysql.connector. Затем я задал данные для подключения к MySQL. Я использовал функцию mysql.connector.connect, чтобы создать соединение с базой данных. После этого я создал курсор, используя метод cursor. Затем я использовал метод execute, чтобы выполнить SQL-запрос INSERT с подстановкой значений из списка Python. Наконец, я использовал методы commit и close, чтобы сохранить изменения в базе данных и закрыть курсор и соединение.
Я повторил этот процесс для каждой футболки из списка Python, в результате чего все данные о футболках Polo были успешно загружены в таблицу «polo_shirts» в MySQL.
Вставка данных в таблицу
После того, как я обработал данные о футболках Polo, полученные с помощью парсинга, мне нужно было загрузить их в базу данных MySQL. Я использовал библиотеку Django для работы с базой данных. Я решил, что для вставки данных в таблицу «polo_shirts» я буду использовать ORM (Object-Relational Mapping), предоставляемый Django. ORM позволяет работать с данными в базе данных, как с объектами Python, что упрощает процесс вставки данных.
Сначала я создал объект модели PoloShirt, используя данные, полученные в результате парсинга и обработки. Я задал значения для всех полей модели, которые соответствовали полям таблицы «polo_shirts». Например, чтобы создать объект PoloShirt с названием «Футболка Polo с коротким рукавом», описанием «Классическая футболка Polo с коротким рукавом», ценой 1000 рублей, URL-адресом изображения «https://example.com/polo_shirt.jpg», цветом «синий» и размером «M», я мог использовать следующий код:
from myapp.models import PoloShirt
polo_shirt = PoloShirt(
name='Футболка Polo с коротким рукавом',
description='Классическая футболка Polo с коротким рукавом',
price=1000.00,
image_url='https://example.com/polo_shirt.jpg',
color='синий',
size='M'
)
Затем я использовал метод save для сохранения объекта PoloShirt в базе данных. Этот метод автоматически создает запись в таблице «polo_shirts», используя значения, заданные для полей модели.
polo_shirt.save
Я повторил этот процесс для каждой футболки из списка Python, в результате чего все данные о футболках Polo были успешно загружены в базу данных. Я использовал цикл for для итерации по списку данных и создания объектов PoloShirt для каждой футболки. Затем я использовал метод save для сохранения каждого объекта в базе данных.
for data in polo_shirts_data:
# Создаем объект PoloShirt с данными
polo_shirt = PoloShirt(
name=data['name'],
description=data['description'],
price=data['price'],
image_url=data['image_url'],
color=data['color'],
size=data['size']
)
# Сохраняем объект в базе данных
polo_shirt.save
Таким образом, я успешно загрузил данные о футболках Polo в базу данных MySQL, используя ORM Django. Это позволило мне работать с данными, как с объектами Python, что упростило процесс вставки данных. Клиент
Загрузка товаров в базу данных
После того, как я обработал данные о футболках Polo, полученные с помощью парсинга, мне нужно было загрузить их в базу данных MySQL. Я использовал библиотеку Django для работы с базой данных. Я решил, что для загрузки данных в таблицу «polo_shirts» я буду использовать ORM (Object-Relational Mapping), предоставляемый Django. ORM позволяет работать с данными в базе данных, как с объектами Python, что упрощает процесс загрузки данных.
Сначала я создал объект модели PoloShirt, используя данные, полученные в результате парсинга и обработки. Я задал значения для всех полей модели, которые соответствовали полям таблицы «polo_shirts». Например, чтобы создать объект PoloShirt с названием «Футболка Polo с коротким рукавом», описанием «Классическая футболка Polo с коротким рукавом», ценой 1000 рублей, URL-адресом изображения «https://example.com/polo_shirt.jpg», цветом «синий» и размером «M», я мог использовать следующий код:
from myapp.models import PoloShirt
polo_shirt = PoloShirt(
name='Футболка Polo с коротким рукавом',
description='Классическая футболка Polo с коротким рукавом',
price=1000.00,
image_url='https://example.com/polo_shirt.jpg',
color='синий',
size='M'
)
Затем я использовал метод save для сохранения объекта PoloShirt в базе данных. Этот метод автоматически создает запись в таблице «polo_shirts», используя значения, заданные для полей модели.
polo_shirt.save
Я повторил этот процесс для каждой футболки из списка Python, в результате чего все данные о футболках Polo были успешно загружены в базу данных. Я использовал цикл for для итерации по списку данных и создания объектов PoloShirt для каждой футболки. Затем я использовал метод save для сохранения каждого объекта в базе данных.
for data in polo_shirts_data:
# Создаем объект PoloShirt с данными
polo_shirt = PoloShirt(
name=data['name'],
description=data['description'],
price=data['price'],
image_url=data['image_url'],
color=data['color'],
size=data['size']
)
# Сохраняем объект в базе данных
polo_shirt.save
Таким образом, я успешно загрузил данные о футболках Polo в базу данных MySQL, используя ORM Django. Это позволило мне работать с данными, как с объектами Python, что упростило процесс загрузки данных.
После того, как я загрузил все данные о футболках Polo в базу данных MySQL, я решил создать таблицу HTML для отображения информации о товарах. Я использовал Django для создания шаблона HTML, который включал в себя таблицу. Я использовал теги HTML
| для создания таблицы.
Сначала я создал заголовок таблицы с помощью тега
|

Норм статья, помогла с импортом товаров. Только я чуть не запутался с настройкой базы данных, но вроде все работает. а вот про «polo_shirts» прям точно как в статье, все автоматом создалось, круто! спасибо автору.
а как насчет асинхронной загрузки? а то если много товаров — долго будет все грузиться. и как лучше обработать ошибки при загрузке картинок? типа если не загрузилась — чтобы не вылетало все, а просто записать в лог и попробовать еще раз. ну и вопрос по «как загрузить изображения на сервер» — конкретный пример кода был бы круто!
Кароче круто! Сам пытался чето такое замутить, но с джанго тупил, а тут прям все разложили по полочкам. Спасибо автору! А я использовал библиотеку Django для работы с базой данных, прям как в статье, ток у меня чото не работало поначалу, но разобрался.
А че за библиотека mysql? А то я чет не понял. Django то как с ней работает? Вроде есть коннекторы другие покруче.