【问题标题】:Get Content of Website after all Scripts are completed所有脚本完成后获取网站内容
【发布时间】:2019-06-17 10:56:06
【问题描述】:

我使用的是 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;

【问题讨论】:

  • 你没有使用XE10,没有这样的东西。版本在这里可能并不重要,但如果你引用它,你可能还是准确的。
  • Indy 在检索网页时不会执行客户端脚本,您必须自己执行此操作,这并非易事。对于 WebBrowser,没有办法检测它何时执行脚本,更不用说何时完成执行脚本了。如果客户端脚本需要一段时间才能运行,您只需在代码中添加一些延迟,以便在访问浏览器内容之前等待一段时间。或者在浏览器准备就绪时提示用户通知您的应用。
  • 你可能有一个永远运行的脚本,或者一个脚本调用另一个脚本,因此永远不会完成。如果我们知道您实际上想对这些内容做什么,我们或许可以为您提供更好的帮助。

标签: javascript delphi indy twebbrowser


【解决方案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 属性。您可以检查它是否有一段时间不忙碌,认为它已完成。
  • 上述方式的智能组合。例如带有 Timeout 的 Browser.Busy 就可以解决问题。如果站点是特定的并且是一个,则元素查找可能会起作用。这是首选方式。

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

【讨论】:

  • 谢谢。即使计时器等待一分钟,我仍然没有得到网页的内容......
【解决方案2】:

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

【讨论】:

  • 在 windows 上最好使用 OLE 对象 InternetExplorer.Application 而不是 TWebBrowser。它指向上一个版本,没有考虑到用于仿真的注册表黑客攻击。
  • 马尔科多。感谢您的提示。
猜你喜欢
  • 2015-12-04
  • 2013-04-27
  • 2022-11-26
  • 2016-03-05
  • 1970-01-01
  • 2014-05-06
  • 2015-07-15
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多