Получите содержимое веб-сайта после завершения всех сценариев

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

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

David Heffernan 23.01.2019 20:29

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

Remy Lebeau 23.01.2019 20:42

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

Jerry Dodge 23.01.2019 23:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
323
2

Ответы 2

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

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

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

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

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

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

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

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

Спасибо за это. Даже с таймером, ожидающим до минуты, я все еще не получаю содержимое веб-страницы...

David K. 24.01.2019 19:32

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

в Windows лучше использовать OLE Object InternetExplorer.Application вместо TWebBrowser. Это указывает на последнюю версию, не учитывал взлом реестра для эмуляции.

Marcodor 25.01.2019 09:23

Маркодор. Спасибо за подсказку.

David K. 25.01.2019 18:22

Другие вопросы по теме