完成所有脚本后获取网站内容

时间:2019-01-23 19:18:23

标签: javascript delphi indy twebbrowser

我正在使用Delphi10。

我尝试获取该网站的内容: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 :(得分:1)

最简单的答案是:没有all scripts completed事件,因此是不可能的。

但是,如果您要寻找solution而不是简短的not possible,请考虑以下事项:

Indy TIdHTTP根本不处理JS脚本,因此不应该这样做。它的功能是执行(GET,POST等)HTTP请求。

相反,浏览器具有内置的JS引擎来处理客户端脚本。问题在于它们即使连续停顿也可以连续良好地运行。浏览器只有DOM is loaded事件。许多网站已将代码附加到此事件中,以执行以后的JS代码。

DOM is ready事件发生后,大多数网站都运行一系列DOM转换客户端脚本,在这之后,我们可能会以某种方式考虑,该页面已准备好供真实的人类用户阅读或网页抓取工具。

要了解这种状态,可以考虑以下几种方法:

  • 一个计时器。最简单但不是最好的,加载页面并等待一段时间。在这里考虑网络问题或页面更改,以后可能会花费更多或更少的时间。有时会浪费大量等待时间。
  • 定期DOM元素/属性检查。有时,脚本会在达到所需状态时添加一些属性或元素。分析您准备好的已加载网站。
  • 忙或就绪状态。 TWebBrowser或OLE B := CreateOleObject('InternetExplorer.Application');具有Busy和ReadyState属性。您可能会检查一段时间是否不忙,请认为它已完成。
  • 上述方式的智能组合。例如,带有超时的Browser.Busy可能会解决问题。如果站点是特定站点,则可以进行元素查找。这是首选的方式。

考虑到这一点,您可以定义自己的函数NavigateAndWaitComplete(URL, [Element], Timeout)来发挥作用。

答案 1 :(得分:0)

最后,我找到了解决方案。 Delphi使用IE7仿真。不得不将WebBrowser组件调整为IE11,并且工作正常。