получить html страницы в переменную php

Тема в разделе "PHP", создана пользователем cherkas, 15 мар 2020.

  1. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Здравствуйте, столкнулся с задачей к которой не знаю с какой стороны подойти

    есть страница, html которой нужно получить в переменную для дальнейших действий. Проблема в том, что вся страницы формируется с помощью js


    подскажите, как это побороть
     
  2. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    если прям нужен html - то у меня плохие новости.

    Если же всё это делается для парсинга, то нужно просто находить запросы, получать json и работать уже с ним.
     
    cherkas нравится это.
  3. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    да, так и есть, нашел запросы спасибо

    появилась еще одна проблема

    http://prntscr.com/rgvjim

    подскажите, как добраться до code?
    --- Добавлено, 16 мар 2020 ---
    сам разобрался сам ))

    Код:
    $property_name = "Рекомендуется комплектовать:";
    $recomemd = {$property_name} -> code;
     
    $iD нравится это.
  4. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Здравствуйте, тема та же а сайт и проблемы другие

    есть страница с товаром


    у товара есть опции, которые в коде товара иногда есть а иногда нету :crazy:, даже не знаю как объяснить то нормально )

    в общем иногда если смотреть код страницы в нем есть такое

    а иногда этой части кода нету.

    я рылся и нашел похожий код в инструментах браузера

    http://prntscr.com/rr8vhz

    он там есть всегда




    Очень прошу помощи, мне нужно получать данные о опциях в переменную. Может хоть на мысль натолкнете
    --- Добавлено, 2 апр 2020 ---
    Нашел даже путь к нужным мне данным, только как получить их в переменную php )

    http://prntscr.com/rr9f2g
     
  5. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    отправить запрос на catalog/inv_chair_detached_elbows/kolyaska_start/?bxrand=1585849792890.

    сделать json_decode() ответу:
    Код:
    {
      'dynamicBlocks': [
        {
          'ID': 'composite_city',
          'CONTENT': '                                  <a href=\"tel:+74954323222\" class=\"mobile_tel  moskov-phone\">+7 (495) 432-32-22<\/a>\n                 <a href=\"tel:+74954323222\" class=\"mobile_tel js-hide-phone region-phone\">+7 (495) 432-32-22<\/a>\n                <p>Ваш город<\/p>\n                   <div>\n                      <p class=\"active_city\" data-toggle=\"modal\" data-target=\"#city_modal\">Москва<\/p>\n                  <\/div>\n                 ',
          'HASH': 'd1921971fad3',
          'PROPS': {
            'CONTAINER_ID': 'composite_city',
            'USE_BROWSER_STORAGE': false,
            'AUTO_UPDATE': true,
            'USE_ANIMATION': false,
            'CSS': '',
            'JS': '',
            'BUNDLE_JS': [],
            'BUNDLE_CSS': [],
            'STRINGS': ''
          }
        },
        {
          'ID': 'composite_header_contacts',
          'CONTENT': '    <meta itemprop=\"name\" content=\"Медтехно.ру интернет-магазин медтехники, медицинских товаров и медоборудования\"/>\n   <div class=\"block_title h5\">Интернет-магазин <br>\n     с 9:00 до 20:00<\/div>\n     \n     <a href=\"tel:74954323222\" class=\"tel  moskov-phone\"><span itemprop=\"telephone\">+7 (495) 432-32-22<\/span><\/a>\n    <a href=\"tel:+74954323222\" class=\"tel js-hide-phone region-phone\">+7 (495) 432-32-22<\/a>\n  <p class=\"mailto\" itemprop=\"email\">\n     [email protected]  <\/p>\n    <div style=\"color:#1b81be;font-size:14px\">Доставляем по всей России!<\/div>\n    ',
          'HASH': '7eef8ff2a438',
          'PROPS': {
            'CONTAINER_ID': 'composite_header_contacts',
            'USE_BROWSER_STORAGE': false,
            'AUTO_UPDATE': true,
            'USE_ANIMATION': false,
            'CSS': '',
            'JS': '',
            'BUNDLE_JS': [],
            'BUNDLE_CSS': [],
            'STRINGS': ''
          }
        }
      ]
    }
    
    Получится массив с ключом: dynamicBlocks, поитерировать по всем элементам и достать CONTENT у каждого
     
    cherkas нравится это.
  6. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    ?bxrand=1585849792890

    число меняется, и в коде страницы его нет, не подскажите где его брать автоматом?

    http://prntscr.com/rrw3di


    Да и собственно я тоже думал, что пошлю запрос на этот адрес и получу нужный ответ, но нет (

    в ответе всё та же страница товара

    PHP:
    $file 'https://www.medtehno.ru/catalog/inv_chair_detached_elbows/kolyaska_start/?bxrand=1585865972285';

    $data file_get_contents($file);

    echo 
    '<pre>';
    print_r($data);
     
    Последнее редактирование: 3 апр 2020
  7. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    это просто время.
    HTML:
    new Date().getTime()
    код достал из
    HTML:
    (function (w, d) {
        var v = w.frameCacheVars = {
            'CACHE_MODE': 'HTMLCACHE',
            'banner': {
                'url': 'http://www.1c-bitrix.ru/composite/',
                'text': 'Быстро с 1С-Битрикс',
                'bgcolor': '#FFFFFF',
                'style': 'grey'
            },
            'storageBlocks': [],
            'dynamicBlocks': {
                'composite_city': 'd41d8cd98f00',
                'composite_header_contacts': 'd41d8cd98f00',
                'composite_profile_block': 'd41d8cd98f00',
                'bx_basketFKauiI': 'a24d686ba851',
                'LkGdQn': '9450cc0de4e1',
                'FCagOt': 'd41d8cd98f00',
                '0yniC2': 'd41d8cd98f00',
                'v85xqd': 'd41d8cd98f00',
                '9PQnXd': 'd41d8cd98f00',
                'qEaDi0': 'd41d8cd98f00',
                '4mn7cn': 'd41d8cd98f00',
                '1EgAeq': 'd41d8cd98f00',
                'Vd6HZa': 'd41d8cd98f00',
                'XEVOpk': 'f255e1d8dcac',
                'composite_store_bottom': 'd41d8cd98f00',
                'NkP4aD': 'f04a6e4dca83',
                'KFTMwn': 'f635343ef53a',
                'city_modal': 'd41d8cd98f00'
            },
            'AUTO_UPDATE': true,
            'AUTO_UPDATE_TTL': '120'
        };
        var inv = false;
        if (v.AUTO_UPDATE === false) {
            if (v.AUTO_UPDATE_TTL && v.AUTO_UPDATE_TTL > 0) {
                var lm = Date.parse(d.lastModified);
                if (!isNaN(lm)) {
                    var td = new Date().getTime();
                    if ((lm + v.AUTO_UPDATE_TTL * 1000) >= td) {
                        w.frameRequestStart = false;
                        w.preventAutoUpdate = true;
                        return;
                    }
                    inv = true;
                }
            } else {
                w.frameRequestStart = false;
                w.preventAutoUpdate = true;
                return;
            }
        }
        var r = w.XMLHttpRequest ? new XMLHttpRequest() : (w.ActiveXObject ? new w.ActiveXObject("Microsoft.XMLHTTP") : null);
        if (!r) {
            return;
        }
        w.frameRequestStart = true;
        var m = v.CACHE_MODE;
        var l = w.location;
        var x = new Date().getTime();
        var q = "?bxrand=" + x + (l.search.length > 0 ? "&" + l.search.substring(1) : "");
        var u = l.protocol + "//" + l.host + l.pathname + q;
        r.open("GET", u, true);
        r.setRequestHeader("BX-ACTION-TYPE", "get_dynamic");
        r.setRequestHeader("BX-CACHE-MODE", m);
        r.setRequestHeader("BX-CACHE-BLOCKS", v.dynamicBlocks ? JSON.stringify(v.dynamicBlocks) : "");
        if (inv) {
            r.setRequestHeader("BX-INVALIDATE-CACHE", "Y");
        }
        try {
            r.setRequestHeader("BX-REF", d.referrer || "");
        } catch (e) {
        }
        if (m === "APPCACHE") {
            r.setRequestHeader("BX-APPCACHE-PARAMS", JSON.stringify(v.PARAMS));
            r.setRequestHeader("BX-APPCACHE-URL", v.PAGE_URL ? v.PAGE_URL : "");
        }
        r.onreadystatechange = function () {
            if (r.readyState != 4) {
                return;
            }
            var a = r.getResponseHeader("BX-RAND");
            var b = w.BX && w.BX.frameCache ? w.BX.frameCache : false;
            if (a != x || !((r.status >= 200 && r.status < 300) || r.status === 304 || r.status === 1223 || r.status === 0)) {
                var f = {error: true, reason: a != x ? "bad_rand" : "bad_status", url: u, xhr: r, status: r.status};
                if (w.BX && w.BX.ready) {
                    BX.ready(function () {
                        setTimeout(function () {
                            BX.onCustomEvent("onFrameDataRequestFail", [f]);
                        }, 0);
                    });
                } else {
                    w.frameRequestFail = f;
                }
                return;
            }
            if (b) {
                b.onFrameDataReceived(r.responseText);
                if (!w.frameUpdateInvoked) {
                    b.update(false);
                }
                w.frameUpdateInvoked = true;
            } else {
                w.frameDataString = r.responseText;
            }
        };
        r.send();
    })(window, document);
    
     
  8. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    а вырезали нужную часть из листа explode?

    как взять теги знаю ) а как часть js?
     
  9. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    не надо брать js, я скинул логику на js которая подставляет значение в bxrand.
    Код:
    new Date().getTime()
    на php
    Код:
    time()
    т.е. нужно отправить запрос с php где bxrand=time()
     
  10. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Блин, я наверное совсем тупой! ))
    вот код

    PHP:
    <?php
      
    $file 
    'https://www.medtehno.ru/catalog/inv_chair_detached_elbows/kolyaska_start/?bxrand='.time();
    $data file_get_contents($file);
    echo 
    '<pre>';
    print_r($data);

        
    ?>

    вот здесь он отрабатывает



    и я получаю в $data полную страницу товара, при чем всё равно без нужного куска кода.

    если я делаю
    PHP:
    $data json_decode(file_get_contents($file));
    то в $data вообще пусто.
     
    Последнее редактирование: 5 апр 2020
  11. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.580
    Симпатии:
    1.482
    нужно для начала проанализировать что делает js, на сколько я вижу там еще и хедеры какие-то добавляются... нужно добавить их тоже в запрос.
    p.s. curl в помощь. через file_get_contents - этого не сделать