click fraud detection
click fraud detection
Blog Case

Создание IM штор

BLOG
CASE
464
0
0/ 5stars
0/5
Время чтения: 20 минут

В наше время интернет торговля развивается очень стремительно и интернет-магазины составляют большую часть всех веб-ресурсов. В этой статье мы попытаемся разобраться как создать интернет-магазин с нуля при минимальных знания программирования. 

В начале давайте подумаем из чего состоит типовой интернет-магазин? Я выделил 3 основных функциональных блока:

  1. Каталог товаров.
  2. Корзина пользователя.
  3. Оформление заказа.

Эти три части составляют основу и без них невозможно представить работу магазина.

Начнем с первой части т.к. она наиболее трудоемка.

Каталог товаров

Если вы решили создать свой интернет-магазин, то очевидно знаете примеры готовых решений, которые вам подходят больше всего и отражают вашу идею и ассортимент продукции. Глупо этим не воспользоваться и не скопировать информацию из других сайтов. Я говорю именно про информацию о товарах, ценах, картинках, описании и т.д. Наличие инструмента для автоматического сбора подобных данных может сэкономить колоссальное количество времени, требующееся для наполнения вашего будущего интернет магазина.

Самым простым будет создание некоторого скрипта, который бы ходил по сайту-примеру и собирал все необходимое, складывая  в виде определенной структуры папок и файлов. Далее эту структуру мы передадим другой программе, которая наполнит нашу базу данных и сам сайт.

Этот подход дает нам несколько преимуществ. 

Во первых, все исходные данные будут лежать отдельно от проекта и могут быть использованы в любой момент. Даже если ваша база данных была случайно удалена или повреждена то восстановить все - дело нескольких минут. Также, вы можете собирать данные из многих источников и наполнять ваш каталог автоматически. Таким образом, ваш магазин может превратиться в некий агрегатор данных. 

Во вторых, наши данные будут независимы от технологий, их использующих. Эти данные можно будет использовать в программах, написанных на любом языке программирования PHP, C#, Ruby Python и т.д.

И наконец, оперировать файлами и каталогами намного проще чем любыми, даже самыми удобными, админ-интерфейсами. Поэтому, этот подход значительно сократит расходы на админку сайта. Если потребуется помощь SЕО специалиста для правок текста, или дизайнера для оформления изображений все что потребуется - это заархивировать этот каталог и передать кому надо. А если учесть тот факт, что мы можем хранить в каталоге с данными и js скрипты, то найдется работа и для фронтенд разработчика. Конечно, такая архитектура связана и с некоторыми расходами по месту на диске (все таки данные будут дублироваться), но думаю в большинстве случаев это не столь принципиально.

Теперь поговорим о инструментах. 

В качестве языка программирования я выбрал Python из-за его простоты, обилия библиотек и прекрасных инструментов работы с файловой и операционной системой на базе Linux. При выборе Python фреймворка мой выбор пал на Django т.к. Это наиболее “продвинутый” фреймворк с достаточно высоким уровнем абстракции, следовательно низким уровнем входа. Еще одним значимым плюсом Django является автогенерация админ-интерфейса, который может быть настроен буквально несколькими строками кода.

В качестве базы данных я выбрал SQLite опять же из-за простоты работы и установки. Но так как Django имеет систему ORM, она может работать с многими СУБД абсолютно прозрачно. Т.е. Если вы захотите перейти на другую СУБД все что необходимо будет сделать это изменить коннект к другой базе данных и запустить скрипт миграции, а затем скрипт, наполняющий каталог товаров из директории с данными, любезно заимствованными из других сайтов.

Теперь обсудим структуру каталога данных, назовем его data.

Предположим, мы продаем шторы и хотим создать интернет магазин штор.

Возьмем какой то пример. В выдачи по “магазин штор” у меня первым вышел https://pangardin.com.ua

Думаю, было бы логичным подкаталоги назвать по имени интернет-ресурса. 

Но помимо каталога продукции, на всех сайтах присутствуют и статические страницы с информацией о владельце, доставке, обратной связи и пр. Думаю что подобную информацию можно оформить в специальных текстовых файла в корне каталога data.

Примерная структура каталога данных:

. data
..pages
...main.txt
...about.txt
...contact.txt
..pangardin.com.ua
...tul
...shtory
...furnitura

Как видно, мы разбиваем товары по каталогам, будем называть их каталог-категориями, при этом внутри таких категорий необходим какой-то мета файл с информацией о данной категории.

Можно воспользоваться форматом yml, как по мне, это наиболее читабельный вариант оформления структурированных данных.

Так и назовем этот файл - meta.yml. С учетом многоязычности этот файл может выглядеть так:

content_type: category
is_published: true
order: 1
title_ru: Тюль.
title_ua: Тюль.
desc_ru: |
    Самая лучшая тюль!
desc_ua: |
    Дуже гарна тюль!

meta_title_ru: Купить тюль. Интернет-магазин штор.
meta_title_ua:  Створення iнтернет магазина штор
meta_keywords_ru: тюль шторы купить интернет-магазин
meta_keywords_ua: ….
meta_description_ru: ….
meta_description_ua: ….

Я заложил минимум информации о каталоге. 

Первым делом я определяю тип информации, для того чтобы отличать описание категории и товара и определять в каком каталоге находится программа. Либо это каталог-категория, либо каталог-товар. Далее идет признак опубликованности на сайте, сортировка и информация для страницы категории.

Подобным образом можно оформить и статичные страницы в файлах *.yml в каталоге pages. 

Например так:

content_type: page
is_published: true
title_ru: Разработка интернет-магазина штор.
desc_ru: |
    Как разработать интернет магазин на  python!

Примерная структура каталога товарной позиции:

.tul-metis
..images
...1.png
...2.png
meta.yml
description.md

Для описания товара я определил файл description.md, использующий формат markdown для разметки текста, но позволяющий использовать и нативный html код.

Файл описания товарной позиции.

name_slug: shtory-raduga
name_ru: Шторы радуга.
meta_title_ru: Первые шаги Python.
meta_keywords_ru: Первые шаги Python.
meta_description_ru: Первые шаги Python.
is_published: false

Для простоты, пока будем оперировать одной, русской локализацией.

Итак, наша следующая задача - опросить сайт-источник скриптом и создать требуемую структуру каталогов. Для этого я буду использовать библиотеки Python requests и BeatifulSoup.

Библиотекой requests мы будем генерировать HTTP запросы на сервер и получать HTML код страниц.

Библиотекой BeatifulSoup мы этот HTML парсим и находим в нем интересующие элементы (теги) и забираем их содержимое.

В начале, нас интересует сама структура каталога. Ее можно найти на главной странице во всплывающем блоке.

HTML код этого списка выглядит так:

image3

Я убрал лишние css классы для наглядности. Что мы имеем - это два вложенных списка ul с категориями и подкатегориями. Подкатегории, кроме названия имеют и ссылку на страницу с товарами, ее мы тоже будем использовать для получения информации о продуктах каждой взятой категории.

Все, приведенные ниже примеры, даны для операционной сисnемы на базе Debian. 

При написании такой программы-загрузчика нам нужно создать каталог, где будут хранится наши библиотеки requests и BeatifulSoup. Этот каталог называется виртуальным окружением и создается он консольной командой

virtualenv -p python3 venv3

После создания виртуального окружения необходимо его активировать набрав такую команду в консоле.

. ./venv3/bin/activate

Установить в него наши библиотеки можно такими командами.

pip install requests
pip install beatifulsoup4

Если у вас не установлена программа pip, то поставить ее можно так:

sudo apt install python-pip

Ниже приведен Python код с подробными комментариями, который разбирает cтруктуру категорий и выводит ее на экран терминала.

#!/usr/bin/env python
‘’’ импортируем библиотеки ‘’’
import requests
from bs4 import BeautifulSoup
print("Getting catalog")
‘’’ делаем запрос на получение главной страницы ‘’’
url = 'https://pangardin.com.ua'
r = requests.get(url)
‘’’ распознаем HTML, создавая специальный объект soup ’’’
soup = BeautifulSoup(r.text, 'html.parser')
‘’’ находим главный (родительский) элемент списка категорий ’’’
ulsout = soup.find('ul',{'class': 'sub-menu'})
‘’’ в цикле проходим по всем его элементам  ’’’
for ulout in ulsout:
    liout = ulout.find('li')
    if liout != -1:
        print('.'+liout.text)
        ‘’’ для каждой родительской категории находим 
           дочерний список подкатегорий ’’’
        ulins = ulout.find('ul')
        ‘’’ в цикле проходим по подкатегориям  ’’’
        for liin in ulins.findAll('li'):
            print('..'+liin.text)

Вывод программы:

.Ткани-Компаньоны
..Ткани-Компаньоны
..Тюль
..Портьерные ткани
..Готовые шторы
..Шторы нити
..Постельное белье
..Фурнитура
….

Все что тут происходит - это перебираются ul - списки в двух вложенных циклах.

Теперь осталось перевести названия в транслит и создать нужные каталоги.

Транслитирировать можно библиотекой python-slugify и делается это передачей нужной строки в функцию slugify.

name_slug = slugify(name)

Для удобства, программу всегда разделяют на более мелкие подпрограммы, называемые функциями. Например функцию сохранения категории на диск можно описать так:

def save_category(cat_name,parent_name):
    ''' сохранение каталогов-категорий  '''
    # транслитерируем русское название категории
    cat_name_slug = slugify(cat_name)
    # транслитерируем русское название подкатегории
    parent_name_slug = slugify(parent_name)
    # выводим отладочное сообщение в консоль
    print("Creating category %s with parent %s" % (cat_name,parent_name))
    # формируем путь для для создания каталога
    dir_name = os.path.join(DATA_DIR,cat_name_slug)
    # создаем каталог, если его не существует
    if not os.path.isdir(dir_name):
        os.mkdir(dir_name)

Для того, чтобы использовать такую функцию ее необходимо вызвать, передав два параметра - название категории и подкатегории. Это будем делать во внутреннем цикле.

        for liin in ulins.findAll('li'):
            save_category(liin.text, liout.text)

Полный код программы и результат его работы приведен ниже.

	
#!/usr/bin/env python
import requests
from bs4 import BeautifulSoup
import os
from slugify import slugify

### создаю каталоги с данными
if not os.path.isdir('data'):
    os.mkdir('data')

if not os.path.isdir(os.path.join('data','pangardin.com.ua')):
    os.mkdir(os.path.join('data','pangardin.com.ua'))
###

DATA_DIR = os.path.join('data','pangardin.com.ua')

def save_category(cat_name,parent_name):
    ''' сохранение каталогов-категорий  '''
    cat_name_slug = slugify(cat_name)
    parent_name_slug = slugify(parent_name)
    print("Creating category %s with parent %s" % (cat_name,parent_name))
    dir_name = os.path.join(DATA_DIR,cat_name_slug)
    if not os.path.isdir(dir_name):
        os.mkdir(dir_name)

print("Getting catalog")
url = 'https://pangardin.com.ua'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
ulsout = soup.find('ul',{'class': 'sub-menu'})

for ulout in ulsout:
    liout = ulout.find('li')
    if liout != -1:
        ulins = ulout.find('ul')
        for liin in ulins.findAll('li'):
            save_category(liin.text, liout.text)
	

Дополним функцию save_category созданием meta.yml файлов, минимально описывающих категории. В эти файлы будем писать имена и псевдонимы текущей и родительской категории.

#!/usr/bin/env python
import requests
from bs4 import BeautifulSoup
import os
from slugify import slugify

### создаю каталоги с данными
if not os.path.isdir('data'):
    os.mkdir('data')

if not os.path.isdir(os.path.join('data','pangardin.com.ua')):
    os.mkdir(os.path.join('data','pangardin.com.ua'))
###

DATA_DIR = os.path.join('data','pangardin.com.ua')

def save_category(cat_name,parent_name):
    ''' сохранение каталогов-категорий  '''
    cat_name_slug = slugify(cat_name)
    parent_name_slug = slugify(parent_name)
    print("Creating category %s with parent %s" % (cat_name,parent_name))
    dir_name = os.path.join(DATA_DIR,cat_name_slug)
    if not os.path.isdir(dir_name):
        os.mkdir(dir_name)

print("Getting catalog")
url = 'https://pangardin.com.ua'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
ulsout = soup.find('ul',{'class': 'sub-menu'})

for ulout in ulsout:
    liout = ulout.find('li')
    if liout != -1:
        ulins = ulout.find('ul')
        for liin in ulins.findAll('li'):
            save_category(liin.text, liout.text)

Выводы

В статье рассмотрен новый подход к хранению структурированных данных внутри файловой системы и использование их для наполнения сайта. Это позволяет унифицировать формат данных и дает возможность собирать и объединять разнородные данные с разных сайтов в одном проекте.

Тема следующей статьи будет создание проекта Django, команда импорта структуры каталогов в базу данных Django проекта и вывод каталога на странице. 

У ВАС ОСТАЛИСЬ ВОПРОСЫ?

Оставьте ваши контактные данные. Наш менеджер свяжется и проконсультирует вас.

ПОЛУЧИТЬ КОНСУЛЬТАЦИЮ

Наш менеджер свяжется с Вами в ближайшее время

0/5
Проголосовало людей: 0
СОДЕРЖАНИЕ
СТАТЬИ
Каталог товаров
Теперь поговорим о инструментах. 
Выводы
Лучшие PHP-фреймворки, которые упрощают разработку в 2019 году
Фреймворки PHP – это программные платформы, которые значительно облегчают и ускоряют разработку сайтов, web- и…
Алексей Варламов
Алексей Варламов
Что такое модернизация сайта и когда она необходима
В этой статье мы расскажем о том, какие задачи позволяет решить данный вид работ, какие…
Алексей Варламов
Алексей Варламов
Разработка и запуск персонального сайта
В этой статье мы расскажем о том, что из себя представляет персональный сайт и каким…
Алексей Варламов
Алексей Варламов
Гензель и Гретель по-умански или как «Уманьпиво» нашла свой пряничный домик
«Уманьпиво» существует с 1878 года, и спустя 140 лет компания столкнулась с острой необходимостью пересмотреть…
Wezom
Wezom
ПОЛУЧАТЬ ИНТЕРЕСНЫЕ СТАТЬИ
Уже подписались 253 человек
Автор
464
0
Дмитрий Жариков
Дмитрий
Жариков
most
Popular
Возможно
UX это термин, который охватывает взаимодействие пользователя с интерфейсом веб-ресурса. Сайт радует или действует на…
Галина Назарова
Галина Назарова
Мы написали эту статью, чтобы рассказать об основах SEO и поделиться знаниями, которые помогут избежать…
Алексей Варламов
Алексей Варламов
Как увеличить продажи в интернет-магазине - вопрос, мучающий многих современных предпринимателей. Всемирная сеть предлагает много…
Яна Спиридонова
Яна Спиридонова
Давайте начнем
беседу!
КОММЕНТАРИИ0
ОСТАВИТЬ КОММЕНТАРИЙ К СТАТЬЕ
ПОДПИСЫВАЙТЕСЬ НА РАССЫЛКУ АЙТЫЖБЛОГ
ХОТИТЕ ПОЛУЧАТЬ 
ИНТЕРЕСНЫЕ СТАТЬИ?
Уже подписались 253 человек
313
ПОПИСЧИКОВ
ЧИТАТЬ
4295
ПОПИСЧИКОВ
СЛЕДИТЬ
9307
ПОПИСЧИКОВ
СЛЕДИТЬ