1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

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

В данной статье рассмотрено массовое добавления товара в OpenCart

Метки:
  1. Support Денис
    Доброго время суток, уважаемые читатели!
    Продолжим написание парсера работающего с 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:
    [​IMG]
    Код:
    *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;
            }
    Запускаем и проверяем результат:
    [​IMG]

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

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

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