Получить содержимое сайта после завершения всех сценариев - PullRequest
0 голосов
/ 23 января 2019

Я использую Delphi 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;

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Наконец-то я нашел решение.Delphi использует эмуляцию IE7.Пришлось настроить компонент WebBrowser на IE11, и он работал нормально.

0 голосов
/ 24 января 2019

Краткий ответ: нет события all scripts completed, поэтому это невозможно.

Однако, если вы ищете solution, а не короткий not possible, учтите следующее:

Indy TIdHTTP вообще не обрабатывает JS-скрипты и не должен этого делать. Его функциональность заключается в выполнении (GET, POST, ...) HTTP-запросов.

Напротив, браузеры имеют встроенный JS-движок для обработки клиентских сценариев. Проблема в том, что они могут работать непрерывно, даже с некоторыми паузами. Браузеры имеют только DOMis loaded событие. Многие веб-сайты прикрепили код к этому событию, чтобы выполнить более поздний код JS.

Большинство веб-сайтов запускают серию клиентских сценариев DOM-преобразования после события DOM is ready, и после этого мы можем каким-то образом считать , что страница готова для чтения реальными пользователями или веб-скребками.

Чтобы поймать это состояние, нужно рассмотреть несколько подходов:

  • Таймер. Проще всего, но не лучше, загрузите страницу и подождите некоторое время. Рассмотрим здесь проблемы с сетью или изменения страницы, которые позже могут занять больше или меньше времени. Иногда чрезмерное ожидание тратит время выполнения.
  • Периодическая проверка DOM-элемента / свойства. Иногда сценарии добавляют некоторые свойства или элементы, когда достигается необходимое состояние. Проанализируйте ваш готовый загруженный сайт.
  • Занято или ReadyState. TWebBrowser или OLE B := CreateOleObject('InternetExplorer.Application'); имеют свойства Busy и ReadyState. Вы можете проверить, не занято ли это в течение некоторого времени, считать его завершенным.
  • Разумная комбинация упомянутых выше способов. Например, Browser.Busy с Timeout может помочь. Если сайт конкретный и один, поиск элемента может работать. Это предпочтительный путь.

Учитывая это, вы можете определить свою собственную функцию NavigateAndWaitComplete(URL, [Element], Timeout), которая будет творить чудеса.

...