Разработка комплексной стратегии продвижения — полное руководствоскачайте бесплатно

Парсинг с сайта и размещение в объявление цены за товар

Пауза объявлений, где товара нет в наличии

//указываем html-блок в который обернута ценаvar price_wrapper_start ="<span class='price'>";
var price_wrapper_end ="</span>";

//что пишется на странице товара, если нет в наличииvar price_out_of_stock ='Нет в наличии';
var keywords = {};

functionmain() {
    var checked_urls = {};
    var prices = {};
    var campaignIterator = AdWordsApp.campaigns()
        .withCondition('Status = ENABLED')
        .get();

    //пробегаем по всем активным кампаниям, //берем товарные объявления в которых есть param в descriptionwhile (campaignIterator.hasNext()) {
        var campaign = campaignIterator.next();
        var adIterator = campaign.ads()
            .withCondition("Description1 CONTAINS_IGNORE_CASE 'param'")
            .get();

        Logger.log('Кампания: '+ campaign.getName());

        //пробегаем по всем объявлениямwhile (adIterator.hasNext()) {
            var entity = adIterator.next();
            Logger.log(entity.getDescription1() +' - '+ entity.getDescription2());
            var url = entity.urls().getFinalUrl();

            //пропускаем если урл пустойif (url === null) continue;

            Logger.log('Найдено объявление "'+ entity.getHeadline()
            +'" со следующими ключами:');

            //очищаем урл от параметров, меток и т д
            url = clean_url(url);

            //если урл этого товара мы уже парсили, // то берем данные о цене и наличии из массива данных // (чтобы снова не парсить)if (checked_urls[url]) {

                //установили цену если она естьif (prices[url]) setPriceToAd(entity, prices[url]);

                //включили или отключили объявление в зависимости от наличияif (checked_urls[url]) {
                    if (checked_urls[url] ==='out of stock') {
                        //ставим на паузу объявление
                        entity.pause();
                        Logger.log('Объявление: "'+ entity.getHeadline()
                        +'" выключено '+ price_out_of_stock +' Url: '+ url);
                    }
                    else {
                        entity.enable();
                        Logger.log('Объявление: "'+ entity.getHeadline()
                        +'" активно'+' Url: '+ url);
                    }
                }
            }
            //если нет, тоelse {
                var html;
                //парсим страницу товара
                try {
                    html = UrlFetchApp.fetch(url).getContentText();
                } catch (e) {
                    //пропускаем объявление, если не смогли распарсить страницу
                    Logger.log(url +' Ошибка! Пропускаем.');
                    continue;
                }

                //парсим цену, которая должна находится обязательно // между price_wrapper_start и price_wrapper_endvar price_start_index = html.indexOf(price_wrapper_start) + price_wrapper_start.length;
                if (price_start_index >=0) {
                    var price_end_index = html.indexOf(price_wrapper_end, price_start_index);
                    prices[url] = parseFloat(html.substr(price_start_index, price_end_index - price_start_index));
                    //получили цену, проставляем её в кейворды
                    setPriceToAd(entity, prices[url]);
                }

                //ищем на странице текст price_out_of_stock, // который указывает на НЕТ В НАЛИЧИИif (html.indexOf(price_out_of_stock) >=0) {
                    //ставим на паузу объявление
                    checked_urls[url] ='out of stock';
                    entity.pause();
                    Logger.log('Объявление: "'+ entity.getHeadline() +'" выключено '+ price_out_of_stock +' Url: '+ url);
                } else {
                    checked_urls[url] ='in stock';
                    //активизируем объявление
                    entity.enable();
                    Logger.log('Объявление: "'+ entity.getHeadline()
                    +'" активно'+' Url: '+ url);
                }
            }
        }
    }
}

functionsetKeywordPrice(keyword, price) {
    var keywordId = keyword.getId();
    if (keywords[keywordId]) {
    } else {
        keyword.setAdParam(1, price);
        keywords[keywordId] = true;
    }
}

functionsetPriceToAd(ad, price) {
    var keywords = ad.getAdGroup().keywords().get();
    while (keywords.hasNext()) {
        var keyword = keywords.next();
        setKeywordPrice(keyword, price);
        Logger.log('Ключ: '+ keyword.getText() +'; Объявление: '+ ad.getHeadline() +'; Цена: '+ price);
    }
}

functionclean_url(url) {

    //урл может быть обёрнут врапером
    url = url.substr(url.lastIndexOf('http'));
    if (decodeURIComponent(url) !== url) {
        url = decodeURIComponent(url);
    }

    //убираем GET параметрыif (url.indexOf('?') >=0) {
        url = url.split('?')[0];
    }

    //убираем скобкиif (url.indexOf('{') >=0) {
        url = url.replace(/\{[0-9a-zA-Z]+\}/g, '');
    }
    return url;
}