Я использую Делфи 10.
Я пытаюсь получить содержимое этого веб-сайта: leforem.be. Я попытался использовать элемент управления WebBrowser, но не смог получить полный исходный код, созданный сценарием на странице. У кого-то есть идея?
PLink := 'https://www.leforem.be/recherche-offres-emploi/jsp/index.jsp#searchurl-results/1?query=&lieu_trav='
MyBrowser.Navigate(PLink, 4);
{Wait for Browser Ready Status}
while MyBrowser.ReadyState <> 4 do Application.ProcessMessages;
StartTime := Now;
{Wait for anoyther 60 seconds}
while SecondsBetween(Now, StartTime) < 60 do Application.ProcessMessages;
{Get the content of the Browser}
document := MyBrowser.Document as IHTMLDocument2;
PBrut := document.body.innerHTML;
Indy не выполняет сценарии на стороне клиента при извлечении веб-страниц, вам придется делать это самостоятельно, что нетривиально. Что касается веб-браузера, то нет способа определить, когда он выполняет скрипты, не говоря уже о том, когда он завершает их выполнение. Если для запуска клиентского сценария требуется некоторое время, вам просто нужно добавить некоторые задержки в свой код, чтобы подождать некоторое время, прежде чем получить доступ к содержимому браузера. Или предложите пользователю уведомить ваше приложение, когда браузер будет готов.
У вас может быть сценарий, который также работает вечно, или один сценарий вызывает другой сценарий и, таким образом, никогда не завершается. Если бы мы знали, что вы на самом деле пытаетесь сделать с этим контентом, мы могли бы помочь вам лучше.
Короткий ответ: нет события all scripts completed
, поэтому это невозможно.
Однако, если вы ищете solution
, а не короткий not possible
, учтите следующее:
Indy TIdHTTP вообще не обрабатывает JS-скрипты и не должен этого делать. Его функциональность заключается в выполнении HTTP-запросов (GET, POST, ...).
Напротив, браузеры имеют встроенный механизм JS для обработки сценариев на стороне клиента. Проблема в том, что они могут работать непрерывно, ну, даже с некоторыми паузами. В браузерах есть только событие DOM
is loaded
. Многие веб-сайты прикрепили код к этому событию для последующего выполнения кода JS.
Большинство веб-сайтов запускают серию клиентских скриптов преобразования DOM после события DOM is ready
, и после этого мы можем как-то рассмотреть, что страница готова для чтения реальными пользователями или парсерами.
Чтобы поймать это состояние, следует рассмотреть несколько подходов:
B := CreateOleObject('InternetExplorer.Application');
имеют свойства Busy и ReadyState. Вы можете проверить, если он не занят в течение некоторого времени, считайте его завершенным.Учитывая это, вы можете определить свою собственную функцию NavigateAndWaitComplete(URL, [Element], Timeout)
, которая будет творить чудеса.
Спасибо за это. Даже с таймером, ожидающим до минуты, я все еще не получаю содержимое веб-страницы...
Наконец, я нашел решение. Delphi использует эмуляцию IE7. Пришлось настроить компонент WebBrowser на IE11, и он работал нормально.
в Windows лучше использовать OLE Object InternetExplorer.Application
вместо TWebBrowser. Это указывает на последнюю версию, не учитывал взлом реестра для эмуляции.
Маркодор. Спасибо за подсказку.
Вы не используете XE10, такой вещи нет. Версия, вероятно, не важна здесь, но если вы ее цитируете, вы можете быть точны.