【问题标题】:How to simulate a full browser's request to an HTML document?如何模拟完整浏览器对 HTML 文档的请求?
【发布时间】:2012-05-18 18:32:26
【问题描述】:

目标

我想像浏览器一样模拟对 HTML 文档的请求。这意味着我不仅要下载主要的 HTML 文件,还要下载 CSS、JS、图像等链接的内容。

现在我只想解析第一个 HTML 文档。 IE。我没有考虑解析产生的请求,比如 CSS(背景图像、网络字体)或 JavaScript(Ajax)等。

要实现这一点,我需要知道浏览器如何准确地处理网站。我还没有找到很好的参考。对此的任何帮助将不胜感激,并可能解决我的问题。

假设

由于我缺乏任何好的参考资料,我假设这个过程(不考虑重定向、渲染等)是这样工作的:

  1. 使用www.facebook.com 建立持久的HTTP 连接
  2. 请求路径“/”并接收 HTML
  3. 当文档被完全 (?) 接收时,它会被解析并填充需要请求的 URL 列表(分为头部和正文对象?!)
  4. 第一个 URL 取自 head-list 并检查是否与该主机建立了持久 HTTP 连接
    • 如果没有,则建立,然后请求对象
    • 如果有,则将其添加到连接的“下载队列”中
  5. 重复第 4 步,直到列表为空
  6. 然后为“正文列表”重复步骤 4-5

这甚至接近浏览器的工作方式吗?

额外问题:标头中 JavaScript 和 CSS 文件的顺序是否有区别?

怀疑

我使用 Chrome 开发者工具 (Chrome 18) 进行了一些测试以确认。我连接到www.facebook.com 测量每个对象的加载时间。使用 Ctrl + R 重新加载时,结果如下所示:

最让我困惑的是,即使来自同一主机 (static.ak.fbcdn.net),大多数请求也与其他请求并发。我的浏览器禁用了流水线(这是默认设置),为什么请求似乎仍然同时发生?

【问题讨论】:

    标签: http browser language-agnostic html-parsing simulation


    【解决方案1】:

    浏览器确实使用多个连接,以加快下载(资源的并行下载)。然而,它们限制了与同一主机的连接数量,这也是内容交付网络存在的原因之一。

    标题中 CSS 和脚本文件的顺序很重要,如 scripts block parallel downloading(除非脚本没有被延迟)。

    浏览器在接收 HTML 时也会对其进行解析(再次加快处理速度)——这就是如果您将脚本放在头部尝试操作尚未加载的 DOM 元素的原因,您会收到错误消息。

    但所有这些都是浏览器实现细节,可能对您的任务并不重要。 最好 - 查看一些无头浏览器的源代码以了解发生了什么。

    【讨论】:

    • 谢谢!您对并行下载是绝对正确的。刚刚用wireshark证实了这一点。我也同意订单部分。在进行了一些实验之后,我会添加虽然 execution 而不是 js 的 downloading 会阻止并行下载。因此,就我而言,我将忽略这一事实。与正文相比,您是否有任何关于头部脚本下载顺序的信息?似乎 Chrome 在那里没有什么区别。截图似乎证明并非如此,但实际上 FB lazy-loads 一些资源。
    • @Caffeine 很多有用的信息都可以在Page Speed Documents 中找到。我刚刚用一个链接更新了我的答案,解释说该脚本确实会阻止在许多浏览器中下载样式表。
    • 感谢您的链接,它确实充满了有用的信息。他们还链接到browserscope,它对他们的网络行为进行了一些很好的浏览器比较。
    猜你喜欢
    • 2022-01-08
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2011-07-01
    • 2019-04-07
    • 2016-05-09
    相关资源
    最近更新 更多