javascript - 所有脚本完成后获取网站内容
问题描述
我正在使用德尔福 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;
解决方案
简短的回答是:没有all scripts completed
事件,所以不可能。
但是,如果您正在寻找 asolution
而不是 short not possible
,请考虑以下事项:
Indy TIdHTTP 根本不处理 JS 脚本,也不应该这样做。它的功能是执行(GET、POST、...)HTTP 请求。
相反,浏览器有内置的 JS 引擎来处理客户端脚本。问题是它们可以连续运行,好吧,即使有一些停顿。浏览器只有事件。很多网站都在这个事件上附加了代码来执行后面的 JS 代码。DOM
is loaded
大多数网站在事件发生后运行一系列 DOM 转换客户端脚本DOM is ready
,在此之后我们可能会以某种方式认为该页面已准备好被真实的人类用户或网络爬虫阅读。
为了捕捉这种状态,有一些方法需要考虑:
- 一个计时器。最简单但不是最好的,加载页面并等待一段时间。在这里考虑网络问题或页面更改,稍后可能需要或多或少的时间。有时过多的等待会浪费执行时间。
- 定期的 DOM 元素/属性检查。有时脚本会在达到所需状态时添加一些属性或元素。分析您已加载的网站。
- 忙碌或就绪状态。TWebBrowser 或 OLE
B := CreateOleObject('InternetExplorer.Application');
具有 Busy 和 ReadyState 属性。您可以检查它是否在一段时间内不忙,认为它已完成。 - 上述方式的智能组合。例如带有 Timeout 的 Browser.Busy 就可以解决问题。如果站点是特定的并且是一个,则元素查找可能会起作用。这是首选的方式。
考虑到这一点,您可以定义自己的功能NavigateAndWaitComplete(URL, [Element], Timeout)
来发挥作用。
推荐阅读
- python - Python 打印嵌套列表的内存地址而不是列表内容
- google-maps - Google Roads API 的 Nearest Roads 函数返回的点数多于给定点,包含重复项
- java - 如何在分页中获得总结果数
- javascript - 在 React 组件中存储多个引用与通过 ID 查询 DOM
- c# - 如果分隔符是一个或多个空格,如何拆分字符串?
- sql - SQL Select 在具有 25M 记录的表上花费太多时间
- typo3 - Typo3 将 7.6.31 升级到 8.7.19 / 数据库分析器失败
- python - 将 tf.Keras 与 TensorFlow 优化器一起使用
- python - 获取依赖文件以在 Binder 上托管 Jupyter 笔记本?
- vue.js - 路线无效(Vue.js)