- Получить HTML-контент после полной загрузки страницы с помощью curl
- 2 ответа
- Заставьте file_get_contents () дождаться полной загрузки сайта
- Решение
- Другие решения
- Как дождаться полной загрузки страницы в Selenium php?
- Как сделать чтобы парсер дождался полной загрузки сайта и только тогда забирал информацию с него?
- Как дождаться полной загрузки страницы в Selenium 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, а также для изображений,,
Если вы используете 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», и получается что он не сумел найти нужный блок.
Как можно решить этот вопрос?
там, где конфигурите драйвер, проставьте ожидание (читать)
Не силен в 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);
Дмитрий Еремин, Я вас немного не понял. В браузере все хорошо подгружается, до сегодняшнего дня скрипт работал отлично, но что-то пошло не так (прелоадер и раньше вроде как был и все работало) и теперь попросту не работает.
Как сделать чтобы парсер дождался полной загрузки сайта и только тогда забирал информацию с него?
Мне нужно спарсить сайт на котором находится статистика, но она долго загружается и по этому парсер берёт не цифры а надпись «загрузка». Как исправить это?
Сам скрипт-
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», и получается что он не сумел найти нужный блок.
Как можно решить этот вопрос?
там, где конфигурите драйвер, проставьте ожидание (читать)
Не силен в 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);
Дмитрий Еремин, Я вас немного не понял. В браузере все хорошо подгружается, до сегодняшнего дня скрипт работал отлично, но что-то пошло не так (прелоадер и раньше вроде как был и все работало) и теперь попросту не работает.