2012-05-18 91 views
2

目標

我想請求一個HTML文檔只是一個瀏覽器的方式做模擬。這意味着我不僅要下載主要的HTML文件,還要鏈接像CSS,JS,圖像等東西。如何模擬完整的瀏覽器對HTML文檔的請求?

現在我只想解析第一個HTML文檔。即我沒有考慮到由解析導致的請求,比如CSS(背景圖像,網絡字體)或JavaScript(Ajax)等。

爲了實現這一點,我需要知道瀏覽器如何準確處理網站。我還沒有找到一個很好的參考。任何幫助,將不勝感激,並可能解決我的問題。

假設

由於我缺乏任何好的引用我假設的過程(不考慮重定向,渲染等方面綜合考慮)的作品像:

  1. 持久性HTTP連接建立與www.facebook.com
  2. 請求路徑「/」並且接收到HTML
  3. 當文檔完全接收到(?)時,它將被解析,並且需要請求的URL列表被填充(分爲頭部a第二機身對象?)
  4. 第一個URL從頭部列表取出並檢查一個持久的HTTP連接是否建立與該主機
    • 如果沒有,它是建立和事後目的是要求
    • 如果有,它被添加到
  5. 重複步驟4,直到列表中選擇連接的「下載隊列」爲空
  6. 然後步驟4-5被重複,爲「體列表「

這與瀏覽器的工作方式接近嗎?

獎勵問題:標題中JavaScript和CSS文件的順序是否有所不同?

我進行了與Chrome開發者工具的幾個測試器(Chrome 18)進行確認。我連接到測量每個對象何時加載的www.facebook.com。當使用按Ctrl +[R重裝的結果是這樣的:

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

令我百思不解的最深的是最請求併發給別人,即使來自同一主機(static.ak.fbcdn.net)。管道被禁用我的瀏覽器(這是默認設置),爲什麼請求似乎仍然同時發生?

回答

1

瀏覽器確實使用多個連接,以加快下載速度(並行下載資源)。然而,它們限制了到同一主機的連接數量,這是內容交付網絡存在的原因之一。

標題中的CSS和腳本文件的順序很重要,因爲scripts block parallel downloading(除非腳本未被忽略)。

此外,瀏覽器在接收到HTML時會解析HTML(這是爲了加快速度) - 如果您在試圖操縱未加載DOM元素的頭部放置腳本,則會出現錯誤。

但是,所有這些都是瀏覽器實現細節,可能對您的任務並不重要。 最好 - 查看一些無頭瀏覽器的源代碼,找出發生了什麼。

+0

謝謝!對於並行下載你絕對正確。剛剛用wireshark證實。 我也同意訂單部分。我會在進行一些實驗後添加js的_execution_而不是_downloading_塊並行下載。因此在我的情況下,我會忽略這個事實。 您是否有任何關於頭部中的腳本下載順序的信息與身體中的腳本相比較? Chrome似乎沒有什麼區別。截圖似乎證明,但在現實FB [懶加載](http://stackoverflow.com/a/4139432/30344)一些資源。 – Caffeine

+0

@Caffeine可以在[Page Speed Documents](https://developers.google.com/speed/docs/best-practices/rules_intro)中找到許多有用的信息。我剛剛通過鏈接更新了我的答案,解釋說腳本實際上阻止了在許多瀏覽器中下載樣式表。 –

+0

感謝您的鏈接,它確實充滿了有用的信息。他們還鏈接到[瀏覽器](http://www.browserscope.org),瀏覽器比較他們的網絡行爲。 – Caffeine