Lobochkin
@Lobochkin
PHP Bitrix Vue Laravel

Почему при парсинге сайта, не могу достать некоторые текстовые данные?

Доброго дня всем профессионал своего дела, мне очень нужна ваша помощь, пытаюсь отпарсить страничку "https://razmerkoles.ru/size/peugeot/308/2013/"
проблема достать эти данные 5c46bc2a680e3289938406.jpeg
<?php
require_once 'pr-24.12.2018/simple_html_dom.php';
ini_set('memory_limit', '500M');

function getCurlResult ($url) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
	curl_setopt($ch, CURLPROTO_HTTPS,1);
	$htmltext = curl_exec($ch);
	curl_close($ch);
	//$htmltext = iconv("CP1251", "UTF-8", $htmltext);
	return $htmltext;
}
$urlYear = 'https://razmerkoles.ru/size/peugeot/308/2013/';
			// print(getCurlResult($urlYear));
			// $file = fopen("5.txt", "w");
			// fwrite($file, getCurlResult($urlYear));
			// fclose($file);
			$html3 = str_get_html(getCurlResult($urlYear));			
			$htmlArr3 = $html3->find('#vehicle-market-data .vehicle-market'); // массив внутренних рынков
			if(count($htmlArr3) != 1) {// проверка есть ли разделения на внутренние рынки
				foreach ($htmlArr3 as $key => $div) {
					// echo $div->outertext . "<br>";
					$market = $html3->find('#vehicle-market-data .vehicle-market h4', $key)->plaintext; // выводит название внутреннего рынка
					echo $market . "<br>";
					foreach ($div->find('.modification-item') as $modifications) { // проходит по модификациям модели на одном рынке						// echo "<pre>";
						// var_dump($modifications);
						// echo "</pre>";						
						foreach ($modifications->find('tbody tr') as $k => $size) {
							// print($size->outertext . "<br>");
							$b = $size->find('td[class=data-rim aux-table-cell]')->plaintext;
							var_dump($b);
							// $file = fopen($k . ".txt", "w");
							// fwrite($file, $size->outertext);
							// fclose($file);

							// $zz++;
							// if($zz > 3) {
							// exit;
							// }
						}
					}					
				}				
			} else { //если нет разделения на внутренние рынки
			}
			$html3->clear(); // подчищаем за собой
			unset($html3);

Если Curl странички вывести на экран то вся информация содержиться , если записать в
// $file = fopen("5.txt", "w");
// fwrite($file, getCurlResult($urlYear));
// fclose($file);
То в текстовом файле её уже не будет 5c46bc7972b49130172315.jpeg
Очень нужна ваша помощь!
  • Вопрос задан
  • 381 просмотр
Решения вопроса 2
@marxxt
понравился ответ - поставь ✔
Интересная задачка

Смотрите,

вас интересует блок

<span data-rim="nI41sNGXnsbfvdqY"></span>

Информация уже здесь, но сначала закодирована в base64, а потом замаскирована

Снимаем маскировку:
nI41sNGXnsbfvdqY -> Ni41SngxNSBFVDQy==

Декодируем:
base64_decode("Ni41SngxNSBFVDQy==");

Получаем:
6.5Jx15 ET42䀀

Ну вот и все :)
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Какая конкретно "вся информация" вам нужна? Скорее всего, она генерируется при помощи javascript, поэтому при "выводе на экран" (в браузер, как я подозреваю), вы её видите - там js исполняется, а в curl нет.

Там есть защита от парсинга, td[class=data-rim aux-table-cell] заполняется через javascript и только с юзер-агентом настоящего браузера.
<script>
!function () {
    (function () {
        for (var t = [/PhantomJS/.test(window.navigator.userAgent), /HeadlessChrome/.test(window.navigator.userAgent), navigator.webdriver, window.callPhantom || window._phantom], e = 0; e < t.length; e++) if (t[e]) return !0;
        return !1
    })() || (function () {
        for (var t, e = document.querySelectorAll("span[data-rim]"), r = 0; r < e.length; ++r) {
            var n = e[r], a = n.getAttribute("data-rim");
            n.innerHTML = (t = a) ? atob(function (t) {
                return t.split("").map(function (t) {
                    return t === t.toUpperCase() ? t.toLowerCase() : t.toUpperCase()
                }).join("")
            }(t.replace(/-/g, "="))) : t, n.parentNode.classList.add("aux-table-cell")
        }
    }(), function () {
        for (var t = document.querySelectorAll("tbody[data-vehicle]"), e = function (t) {
            return String.fromCharCode(t)
        }, r = 0; r < t.length; ++r) {
            var n = t[r], a = n.getAttribute("data-vehicle");
            a = a.match(/\d{3}/g).map(e).join("");
            for (var o = n.querySelectorAll("tr>td.data-bolt-pattern"), i = 0; i < o.length; ++i) o[i].innerHTML = a
        }
    }())
}();
</script>


Соответственно, вам нужно использовать, например, PhantomJS или Хром в безголовом режиме, но передавать юзер-агент десктопного браузера.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы