Работаем с OpenCart. Часть 2. Массовое добавление товаров

Работаем с OpenCart. Часть 2. Массовое добавление товаров

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

Наш парсер будет принимать в качестве запроса ссылку на категорию сайта moyo.ua и парсить товары с первой страницы выдачи, затем добавлять их в OpenCart.
Пример ссылки:
Код:
https://www.moyo.ua/telecommunication/cell_phones/

Реализация метода который парсит moyo.ua и возращает массив продуктов.
Код:
* getMoyoProduct(link) {
            let moyouResponse = yield this.request('GET', link, {}, {
                'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36',
                decode: 'utf8'
            });
            if (moyouResponse.success) {
                let rgx = /<a.+?class="goods_image" data-imageSrc="(.+?)".+?data-alt="(.+?)"[\s\S]+?<div class="goodsprice-amount">.+?>([\d\s]+)<\/span/g;
                let tmp;
                let products = [];
                while (tmp = rgx.exec(moyouResponse.data)) {
                    let imageName = yield *this.downloadImage(tmp[1]);
                    let product = {
                        nameProd: tmp[2],
                        image: imageName,
                        price: tmp[3]
                    };
                    products.push(product);
                }
                return products;
            }
        }

С наименованием продукта, ценой и т.д. все понятно. Но что делать с картинками? Было решено применить следующий алгоритм действий.
Картинки скачиваются в папку results/image/ (папку image нужно создать), им будет присваиваться новое имя, с помощью метода getRandomImageName.
Код:
 getRandomImageName(url) {
        let name = "";
        let strong = 10;
        let dic = "abcdefghijklmnopqrstuvwxyz1234567890";
        for (var i = 0; i < strong; i++) {
            name += dic.charAt(Math.floor(Math.random() * dic.length));
        }
        let date = new Date();
        return name + '-' + date.getFullYear() + '-' + date.getMonth() + '-' + date.getDay() + '-' + date.getTime() + '.' + this.getExtension(url);
        }

И затем скачанные картинки будут переноситься на сервер где установлен A-Parser в папку image/catalog/.

Вынос авторизации в отдельный метод
Теперь, чтобы не превращать метод parse в большую, плохо читабельную кучу кода, вынесем авторизацию с получением куки и токена в отдельный метод authorization, который возвращает токен или false, если запрос был неудачный. Для указания ссылки на наш интернет-магазин, чтобы парсер знал, где авторизироваться и куда добавлять товар, было создано поле Site:
k6833_180913115643.png

Код:
*authorization(){
            let response = yield this.request('POST',this.conf.siteurl  + '/admin/index.php?route=common/login', {
                username: this.conf.login,
                password: this.conf.pass,
                route: 'common/login',
                redirect: this.conf.siteurl + '/admin/index.php?route=common/login',
            }, );
            if(response.success){
                 this.cookies.setAll({});
                let token = response.headers.URI.match(/.+?\&user_token=(.+)/);
                let cookie_sessid = response.headers['Request-Raw'].match(/OCSESSID=([\w\d]+)/);
                token = token ? token[1] : 'No token';
                cookie_sessid = cookie_sessid ? cookie_sessid[1] : false;
                if (token && cookie_sessid) {
                    this.cookies.set(this.utils.url.extractTopDomain(this.conf.siteurl), '/', 'OCSESSID', cookie_sessid);
               }
               return token;
            }
            return false;
        }

Итоговый вид метода parse
Код:
*parse(set, results) {
        /*Получаем список продуктов*/
            let moyouResponse = yield* this.getMoyoProduct(set.query);
            if(this.conf.siteurl != ''){
                /*Авторизируемся*/
                let token  = yield* this.authorization();
                if(token){
                    for(let i = 0; i < moyouResponse.length; i++){
                        let addProd = yield * this.add_product(this.getSingleProduct(moyouResponse[i]),token,this.conf.siteurl);
                    }
                    results.success = 1;
                }
            }
            return results;
        }

Запускаем и проверяем результат:
0iwja_180913140622.png


Как видим, все, кроме картинок, добавилось без проблем. Что же не так с картинками?
Дело в том, что OpenCart при добавлении или редактировании продукта проверяет есть ли такая картинка в папке и если нет подставляет свою.

Как решить эту проблему:
Способ 1
Разбить эту задачу на 2 парсера. 1-й парсит информацию и скачивает картинки. Затем заливаем картинки на сервер и запускаем второй парсер, который уже добавит наши товары в интернет магазин.
Способ 2
Разработать парсер, который будет изменять данные продуктов о картинках. Запускать его будем после того, как отработал наш парсер, который описан в этой статье.

Более подробно оба метода будут расписаны в следующей статье.
Скачать готовый парсер вы можете по этой ссылке.
Автор
Support Денис
Просмотры
27
Первый выпуск
Обновление

Рейтинги

5,00 звёзд Оценок: 2

Ещё ресурсы от Support Денис

Назад
Верх