如何模拟完整浏览器对HTML文档的请求?

时间:2012-05-18 18:32:26

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

目标

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

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

要实现这一点,我需要知道浏览器如何精确处理网站。我没有找到一个很好的参考。任何有关这方面的帮助将非常感激,并可能解决我的问题。

假设

由于我缺乏任何好的参考资料,我认为这个过程(不考虑重定向,考虑渲染等)就是这样的:

  1. 使用www.facebook.com
  2. 建立持久性HTTP连接
  3. 请求路径“/”并收到HTML
  4. 当文档完全(?)收到时,它会被解析并填写需要请求的URL列表(分为头部和正文对象?!)
  5. 从头列表中获取第一个URL,并检查是否与该主机建立了持久HTTP连接
    • 如果没有,则建立并随后请求对象
    • 如果有,则将其添加到连接的“下载队列”
  6. 重复步骤4直到列表为空
  7. 然后对“身体清单”重复步骤4-5
  8. 这甚至接近浏览器的工作方式吗?

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

    质疑

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

    Output in the Chrome-Developer-Network-Tab for a request to www.facebook.com

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

1 个答案:

答案 0 :(得分:2)

浏览器确实使用多个连接,以加快下载速度(并行下载资源)。但它们限制了到同一主机的连接数,这是内容传送网络存在的原因之一。

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

此外,浏览器在接收HTML时解析HTML(再次加快速度) - 这是一个原因,如果你把一个脚本放在头部试图操纵尚未加载的DOM元素,你就会收到错误。

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