iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Python

Python大戰之網頁爬蟲系列 第 5

[Day 5] 爬蟲工作流程-生命週期&渲染

  • 分享至 

  • xImage
  •  

在今天的學習中,我將會延續昨天沒有講完的部分,
繼續延續爬蟲工作的相關概念。以下是我今天要講述的章節:

網頁的生命週期&瀏覽器的渲染

以下就讓我們開始今天的學習吧!

網頁的生命週期:

講到生命週期,可能多數人的第一直覺會認為:
生命週期就是像人一樣,從出生到死亡的過程。
摁…也不能說錯吧,但也不算完全正確。

對於網頁來說,生命週期指的是在用戶端輸入請求後,
網頁接收請求並進行一系列的處理,最後進行回傳、呈現、卸載的整個過程,
我們稱之為「網頁的生命週期」。

而在以下,我會將生命週期所會經歷的過程步驟一項項的拆分解釋,
以讓我對於它有更好的了解。下方是生命週期所會經歷的階段:

*DNS 查詢與伺服器連接
*發送 HTTP 請求
*伺服器返回 HTTP 響應
*DOM 樹與 CSSOM 樹的生成
*渲染與繪製階段
*JavaScript 的執行與互動
*用戶交互與狀態變更
*卸載與清理資源

而接下來,我就來針對每個階段的內容一項一項的做解釋:

DNS 查詢與伺服器連接、發送 HTTP 請求、
伺服器返回 HTTP 響應
:

前三階段我在前幾天的文章就有提到過了,這邊就先不再佔據版面贅述,
有興趣的讀者可以參考之前的文章。這邊我就直接先跳到下一點做介紹:

DOM 樹與 CSSOM 樹的生成:

什麼是DOM?簡單來說,它就是一個網頁結構與樣式的模型,
而在最後,瀏覽器使用此模型來解析 HTML 和 CSS ,並將其渲染為最終的網頁。
以下就讓我們來深入剖析它的概念:

當瀏覽器接收到伺服器端的HTTP響應,並開始讀取HTML訊息。
當只要發現 HTML 元素(例如像是HTML、body以及div等等)時,
它就會建構一個名為 Node 的 JavaScript 物件。

當瀏覽器從 HTML 文件中建構出諸多 Node 後,
便會將它們組織成一個樹狀的資料結構。
這個樹狀結構將近似於我們在 HTML 文件中使用巢狀語法所描述的模樣,
我們稱之為 DOM tree

DOM tree 會保留與 HTML 標籤相似的結構,但改為使用 Node 物件建構節點。
這樣樹狀的結構將使瀏覽器可以有效的管理並渲染頁面。

https://ithelp.ithome.com.tw/upload/images/20240919/20169196yV8KQZ1jKl.jpg
上圖就是DOM樹的示意圖。

上面的解釋可能會讓人看得霧矇矇,這邊我試著用白話文再解釋一遍:

其實可以把HTML的每一個標籤訊息,都視為DOM樹的一個節點。
例如像是上方這個範例, 就是根節點, 則是它的子節點,
而每個段落、圖片或連結等元素則是進一步的子節點。(有點像輩分的概念)

那什麼是CSSOM呢?在製作網頁時,我們肯定會希望它美觀、具觀賞性,
而CSSOM就是我們要達成這個條件所需要的東西。

在 HTML 頁面中,我們會過 CSS(Cascading Style Sheet)
來為 HTML 元素實作各種樣式的設定。透過CSS選擇器(CSS selector),
我們可以指定 DOM 元素並對其style屬性(例如像是color與font-size)指派特定的值。

https://ithelp.ithome.com.tw/upload/images/20240919/20169196blOmUb8OH9.jpg

CSSOM與 DOM 相似,也是一個樹狀的資料結構。
因此,這個結構又被稱作 CSSOM tree。
上圖就是CSSOM tree的示意圖。

CSSOM 樹定義了哪些 CSS 規則適用於 DOM 中的元素,其中包括顏色、字體等等。
而當CSSOM 樹和 DOM 樹結合後,瀏覽器就可以決定每個 DOM 節點應該如何顯示。

上面我們都是分開討論這兩棵「」,那可不可以將它們合併呢?
答案當然是可以的,而這個部份我們就可以延續到下一個章節--瀏覽器的渲染

瀏覽器的渲染

你有可能在很多地方聽過「渲染」這個名詞,有可能是電腦繪圖的3D渲染,
也有可能是在真的繪畫時的一個作畫技巧。
而在這邊我們要討論的,則是「瀏覽器的渲染」。

在上面的一個章節,其實我們已經把渲染(Render)的前幾個步驟講述完畢了,
也就是生成所謂的CSSOM 樹和 DOM 樹。那其實概念非常非常簡單,
當CSSOM 樹和 DOM 樹生成後,瀏覽器就會將它們合併在一起,
生出來的東西叫做「渲染樹」(Render Tree)。

而瀏覽器會透過 render tree 來計算 layout(排版),
並且將可視元素 paint(繪圖)至畫面中。

換句話說,在 render tree 建構完成前,畫面上將不會有任何內容呈現出來

https://ithelp.ithome.com.tw/upload/images/20240919/20169196UOTzpXAdyB.jpg

上圖就是渲染樹的示意圖。而要注意,渲染樹只包含會顯示在畫面中的元素。

而在了解上面的「三棵樹」過後,
我們就可以實際來看看所謂的「渲染流程」是如何運作的。

在render tree建構完成後,將會進行三個階段的流程,
也就是佈局(Layout)、繪製(Paint)、以及合成(Compositing),
下方我會將這三個流程做分開討論說明:

https://ithelp.ithome.com.tw/upload/images/20240919/20169196m1nNUIwofn.jpg

上圖為渲染的流程圖

佈局(Layout)(不過我比較喜歡叫它排版):

瀏覽器會將Render Tree當成input(輸入),接著計算Render Tree上各節點的
大小、顏色、位置、形狀等外觀上的物理資訊。

這包含了計算每節點在螢幕上的像素尺存
以及確切的位置(顧名思義,就是很直觀的排版)。

Layout的計算除了一開始載入畫面會觸發,
也會在使用者滾動或重新調整視窗大小、操作DOM節點的時候觸發。

而這個排版的過程又被稱作 reflow或是 browser reflow

繪製(Paint):

在paint的這個流程中,我們又可以將它拆分為兩個步驟,
也就是Layer(圖層)Rasterized(柵格化)

為什麼會有Layer層呢?是因為在上面render tree的流程時,
裡面的子元素可能會有相互重疊的情況,
這時候我們就必須把他們拆分開來,不然就會混在一起。

因此,瀏覽器就會構建出一個Layer圖層來管理他們。

在有了Layer之後,就會將各Layer依序Rasterized,也就是「柵格化
。簡單來說,就是一次處理一個Layer。在每一個 layer 中,
瀏覽器會依據元素的可視屬性
(例如像是邊線、背景色、陰影、文字等等)來填上對應的像素。

合成(Compositing):

Compositing階段相對來說就比較簡單一點了,到上個階段為止,
其實瀏覽器上是還沒有任何畫面的,所以說這一步的目標就是要把畫面呈現出來。

在這個階段,會將剛剛處理過的layer合成到最終的畫面中,
並將合成的畫面依序的透過GPU(圖形處理器)繪製到螢幕上。
在完成後,用戶就可以看到網頁了!!!


小結:

在今天,我將有關爬蟲的工作流程大概的講述完畢了。
在這幾天的學習中,我又對於一些專有名詞的概念更加熟悉了,
像是CSS、DOM這些,我以前一直都是一知半解,不過在透過這幾天的深入研究,
我又學習到了很多之前不知道的觀念,真的對我十分的有幫助。

參考資料:
https://learn.microsoft.com/zh-tw/previous-versions/visualstudio/visual-studio-2008/ms178472(v=vs.90)?redirectedfrom=MSDN
https://marcus116.blogspot.com/2018/10/net-aspnet-page-life-cycle.html
https://medium.someone.tw/web-%E7%80%8F%E8%A6%BD%E5%99%A8%E5%A6%82%E4%BD%95%E7%B9%AA%E8%A3%BD%E7%B6%B2%E9%A0%81-%E6%8E%A2%E8%A8%8E-dom-cssom-%E8%88%87%E6%B8%B2%E6%9F%93-%E7%BF%BB%E8%AD%AF-e9ba8c2be451
https://medium.com/@valerie81.wang/%E7%80%8F%E8%A6%BD%E5%99%A8%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%8C%E6%88%90%E7%95%AB%E9%9D%A2%E6%B8%B2%E6%9F%93%E7%9A%84-c11bf1ec3ca0
https://zh.wikipedia.org/zh-tw/%E6%A0%85%E6%A0%BC%E5%8C%96


上一篇
[Day4] 爬蟲工作流程
下一篇
[Day 6] HTML/CSS基礎 - HTML標籤
系列文
Python大戰之網頁爬蟲12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言