2

目标

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

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

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

假设

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

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

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

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

怀疑

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

在 Chrome-Developer-Network-Tab 中输出请求 www.facebook.com

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

4

1 回答 1

2

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

标题中 CSS 和脚本文件的顺序很重要,因为脚本会阻止并行下载(除非脚本没有被延迟)。

浏览器在接收 HTML 时也会解析 HTML(再次加快处理速度)——这就是如果你在头部放置一个脚本来尝试操作尚未加载的 DOM 元素的原因,你会得到一个错误。

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

于 2012-05-20T22:12:14.520 回答