Здравствуйте, столкнулся с задачей к которой не знаю с какой стороны подойти есть страница, html которой нужно получить в переменную для дальнейших действий. Проблема в том, что вся страницы формируется с помощью js подскажите, как это побороть
если прям нужен html - то у меня плохие новости. Если же всё это делается для парсинга, то нужно просто находить запросы, получать json и работать уже с ним.
да, так и есть, нашел запросы спасибо появилась еще одна проблема http://prntscr.com/rgvjim подскажите, как добраться до code? --- Добавлено, 16 мар 2020 --- сам разобрался сам )) Код: $property_name = "Рекомендуется комплектовать:"; $recomemd = {$property_name} -> code;
Здравствуйте, тема та же а сайт и проблемы другие есть страница с товаром у товара есть опции, которые в коде товара иногда есть а иногда нету , даже не знаю как объяснить то нормально ) в общем иногда если смотреть код страницы в нем есть такое а иногда этой части кода нету. я рылся и нашел похожий код в инструментах браузера http://prntscr.com/rr8vhz он там есть всегда Очень прошу помощи, мне нужно получать данные о опциях в переменную. Может хоть на мысль натолкнете --- Добавлено, 2 апр 2020 --- Нашел даже путь к нужным мне данным, только как получить их в переменную php ) http://prntscr.com/rr9f2g
отправить запрос на 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 у каждого
?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);
это просто время. 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);
не надо брать js, я скинул логику на js которая подставляет значение в bxrand. Код: new Date().getTime() на php Код: time() т.е. нужно отправить запрос с php где bxrand=time()
Блин, я наверное совсем тупой! )) вот код 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 вообще пусто.
нужно для начала проанализировать что делает js, на сколько я вижу там еще и хедеры какие-то добавляются... нужно добавить их тоже в запрос. p.s. curl в помощь. через file_get_contents - этого не сделать