首页 > 解决方案 > 所有脚本完成后获取网站内容

问题描述

我正在使用德尔福 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;

标签: javascriptdelphiindytwebbrowser

解决方案


简短的回答是:没有all scripts completed事件,所以不可能。

但是,如果您正在寻找 asolution而不是 short not possible,请考虑以下事项:

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

相反,浏览器有内置的 JS 引擎来处理客户端脚本。问题是它们可以连续运行,好吧,即使有一些停顿。浏览器只有事件。很多网站都在这个事件上附加了代码来执行后面的 JS 代码。DOM is loaded

大多数网站在事件发生后运行一系列 DOM 转换客户端脚本DOM is ready,在此之后我们可能会以某种方式认为该页面已准备好被真实的人类用户或网络爬虫阅读。

为了捕捉这种状态,有一些方法需要考虑:

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

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


推荐阅读