Дождаться полной загрузки страницы php

Получить HTML-контент после полной загрузки страницы с помощью curl

У меня здесь проблема. Когда я загружаю страницу, для отображения полного результата требуется не менее 10 секунд. Когда я использую curl, он отображает только html-содержимое страницы во время выполнения. Я хочу, чтобы завиток подождал не менее 10 секунд, чтобы получить полный результат. Это мой код,

 20 , CURLOPT_USERAGENT => $userAgent, CURLOPT_AUTOREFERER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_COOKIEFILE => $cookie, CURLOPT_COOKIEJAR => $cookie , CURLOPT_SSL_VERIFYPEER => 0 , CURLOPT_SSL_VERIFYHOST => 0 ); curl_setopt_array($ch, $options); $kl = curl_exec($ch); curl_close($ch); echo $kl; ?> 

Пожалуйста, скажите мне, где я делаю ошибку, и что я могу удалить или добавить, чтобы заставить скрипт работать. благодаря

Я полагаю, вы ссылаетесь на код, который загружается после открытия страницы. Если это так, вы не можете получить этот код с помощью curl, поскольку это ajax url. Вам нужно будет найти URL-адрес ajax в консоли Chrome, а затем получить его вместо главной страницы.

2 ответа

Я не уверен, где вы получили 10 секунд. На моем ноутбуке среднего класса Linux для загрузки в Firefox потребовалось около 3 секунд. Однако то, что вы вводите в заблуждение, — это время, которое требуется для загрузки страницы HTML, и времени, которое требуется для загрузки всего дополнительного/динамического содержимого.

Когда вы нажимаете на URL-адрес, вы получаете очень маленькую статическую HTML-страницу вместе с некоторыми javascript, css, изображениями и т.д. Задержка, которую вы видите, — это время, необходимое для выполнения javascript-запросов AJAX, а также для изображений,,

Читайте также:  Php ошибка подключения require

Если вы используете curl , вы получаете статический HTML-код и ничего больше вместе с ним. Никакая задержка не поможет вам получить полную информацию, если вы не планируете внедрять полный механизм JavaScript и анализатор HTML, а затем загружать все остальные ресурсы, выполняя, при необходимости, код JavaScript.

Я настоятельно рекомендую вам пересмотреть свой подход.

Источник

Заставьте file_get_contents () дождаться полной загрузки сайта

Вы можете видеть, что веб-сайт начинает загружать реальное содержимое веб-сайта только после первой загрузки страницы.

file_get_contents("https://www.warcraftlogs.com/rankings/server/393/latest/#class=Druid&spec=Feral"); 

возвращает только пустой пустой веб-сайт без фактического содержимого таблиц, загруженных на втором шаге.

Есть ли способ заставить file_get_contents ждать загрузки сайта?

Решение

Чтобы понять, что происходит на сайте, попробуйте открыть инспектор сети вашего браузера. Вы увидите загрузку самой страницы, а затем загрузку различных других ресурсов, таких как CSS-файлы, JS-файлы, изображения и некоторые другие страницы.

Похоже, что основной сайт выдает запрос AJAX для получения дополнительных данных с этого URL. Обратите внимание, что file_get_contents () не может получить все сразу, так как file_get_contents () не будет анализировать веб-сайт или оценивать JS (а именно JS вызывает запрос AJAX). Решение простое — вместо использования file_get_contents () для захвата основного сайта, используйте его для захвата второй страницы с данными.

Если вы пытаетесь получить этот URL, вам придется копать глубже. Если вы откроете главную страницу, вы найдете фрагмент JS, встроенный на страницу, который выглядит следующим образом:

Обратите внимание, как динамически создается строка с нужными параметрами. Затем он вызывает $ .fn.load (), который запускает запрос AJAX на URL.

Другие решения

Данные, которые вы хотите увидеть, находятся по другому адресу:

этот сайт использует AJAX, вы можете найти загрузку AJAX и получить его.
реальный запас акций:

file_get_contents("https://www.warcraftlogs.com/rankings/table/dps/6/0/5/20/1/Druid/Feral/0/393/?search=&page=1"); 

Вы можете загрузить данные из этого URL:

Источник

Как дождаться полной загрузки страницы в Selenium php?

Здравствуйте.
Есть парсер написанный на Selenium WebDriver. Ссылка на него тут.
Изначально все работало отлично, после изменений на сайте страница стала долго грузиться и аяксом подгружается основная информация. А сначала только блок с названием и прелоадер.
И получается что мне отдается не весь html код страницы, а только блок с прелоадером.
В документации было написано что можно ждать 10 секунд с интервалом проверки на наличие так:

$driver->wait(10, 1000)->until( function () use ($driver) < $elements = $driver->findElements(WebDriverBy::cssSelector('#a-match')); return count($elements) == 1; >, 'Error element' );

Но ничего не происходит, скрипт работает ~10 секунд и выдает ошибку «Error element», и получается что он не сумел найти нужный блок.
Как можно решить этот вопрос?

EreminD

там, где конфигурите драйвер, проставьте ожидание (читать)

Не силен в php, но вам нужно что-то вроде такого:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Так вы зададите время драйверу на ожидание выполнения вашего условия (еслиусловие выполнится раньше — получите раньше)

Дальше вопрос, сколько вы готовы ждать (люди иногда и 60 секунд ставят).

Так же пробовал ставить
$driver->manage()->timeouts()->implicitlyWait(10);
Но это не работает, скрипт выполняется как и без него по времени и не весь код подгружается.
Только что пробовал так:

$driver = RemoteWebDriver::create($host, $capabilities, 5000); $driver->manage()->timeouts()->implicitlyWait(60); $driver->get($url); $driver->wait(); $driver->wait(60, 1000)->until( function () use ($driver) < $elements = $driver->findElements(WebDriverBy::cssSelector('#a-match')); return count($elements) == 1; >, 'Error element' );

И в результате ждал минуту пока отработает скрипт и в результате все так же ошибка «Error element».
Сейчас почитаю статью что скинули.

$driver->manage()->timeouts()->implicitlyWait(60); $driver->manage()->timeouts()->pageLoadTimeout(60); $driver->manage()->timeouts()->setScriptTimeout(60);

EreminD

Дмитрий Еремин, Я вас немного не понял. В браузере все хорошо подгружается, до сегодняшнего дня скрипт работал отлично, но что-то пошло не так (прелоадер и раньше вроде как был и все работало) и теперь попросту не работает.

Источник

Как сделать чтобы парсер дождался полной загрузки сайта и только тогда забирал информацию с него?

Мне нужно спарсить сайт на котором находится статистика, но она долго загружается и по этому парсер берёт не цифры а надпись «загрузка». Как исправить это?
Сам скрипт-
function Parse ($p1, $p2, $p3) $num1 = strpos ($p1, $p2);
if ($num1 === false) return 0;
$num2 = substr ($p1, $num1);
return strip_tags (substr ($num2, 0, strpos ($num2, $p3)));
ini_set(«pcre.backtrack_limit», 10000000);
>

echo Parse ($String, ‘-5,153,663’, »);
/*echo ‘
‘.Parse ($String, », »);*/

Вот так получше будет-
function Parse ($p1, $p2, $p3) $num1 = strpos ($p1, $p2);
if ($num1 === false) return 0;
$num2 = substr ($p1, $num1);
return strip_tags (substr ($num2, 0, strpos ($num2, $p3)));
>

Проблема не в том, что «статистика долго подгружается», а в том, что вероятнее всего в исходном коде страницы этой статистики вообще нет — она загружается уже после открытия страницы в браузере — JavaScript’ом через AJAX. Понятно, что PHP загруженный JavaScript не выполняет.

Второй вариант — не JS, а iframe. Но опять же — сожержимое iframe в исходном коде страницы отсутствует.

Проще всего открыть страницу в браузере и в консоли (клавиша F12) посмотреть, по какому адресу и каким запросом забирается эта статистика. А после сымитировать этот запрос в PHP посредством cURL: http://php.net/manual/ru/book.curl.php

Но когда я решил получить статистику с Liveinternet, она вообще не выводилась, хотя там есть сами цифры в коде. Почему так?

Андрей Высший разум (338809) Потому я и предложил посмотреть, какой именно запрос выполняется — и сымитировать его именно в том виде, какой он есть — со всеми заголовками / куками / дополнительными параметрами.

Источник

Как дождаться полной загрузки страницы в Selenium php?

Здравствуйте.
Есть парсер написанный на Selenium WebDriver. Ссылка на него тут.
Изначально все работало отлично, после изменений на сайте страница стала долго грузиться и аяксом подгружается основная информация. А сначала только блок с названием и прелоадер.
И получается что мне отдается не весь html код страницы, а только блок с прелоадером.
В документации было написано что можно ждать 10 секунд с интервалом проверки на наличие так:

$driver->wait(10, 1000)->until( function () use ($driver) < $elements = $driver->findElements(WebDriverBy::cssSelector('#a-match')); return count($elements) == 1; >, 'Error element' );

Но ничего не происходит, скрипт работает ~10 секунд и выдает ошибку «Error element», и получается что он не сумел найти нужный блок.
Как можно решить этот вопрос?

EreminD

там, где конфигурите драйвер, проставьте ожидание (читать)

Не силен в php, но вам нужно что-то вроде такого:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Так вы зададите время драйверу на ожидание выполнения вашего условия (еслиусловие выполнится раньше — получите раньше)

Дальше вопрос, сколько вы готовы ждать (люди иногда и 60 секунд ставят).

Так же пробовал ставить
$driver->manage()->timeouts()->implicitlyWait(10);
Но это не работает, скрипт выполняется как и без него по времени и не весь код подгружается.
Только что пробовал так:

$driver = RemoteWebDriver::create($host, $capabilities, 5000); $driver->manage()->timeouts()->implicitlyWait(60); $driver->get($url); $driver->wait(); $driver->wait(60, 1000)->until( function () use ($driver) < $elements = $driver->findElements(WebDriverBy::cssSelector('#a-match')); return count($elements) == 1; >, 'Error element' );

И в результате ждал минуту пока отработает скрипт и в результате все так же ошибка «Error element».
Сейчас почитаю статью что скинули.

$driver->manage()->timeouts()->implicitlyWait(60); $driver->manage()->timeouts()->pageLoadTimeout(60); $driver->manage()->timeouts()->setScriptTimeout(60);

EreminD

Дмитрий Еремин, Я вас немного не понял. В браузере все хорошо подгружается, до сегодняшнего дня скрипт работал отлично, но что-то пошло не так (прелоадер и раньше вроде как был и все работало) и теперь попросту не работает.

Источник

Оцените статью