爲了提高用戶的體驗,大部分網站都使用動態渲染,即使用JavaScript代碼來實現。
動態渲染,由JavaScript改變HTML DOM 導致頁面內容發生變化的現象,不僅提高了網頁的交互性,還提升網頁的加載速度,爲用戶提供了更好的體驗,網頁中常見的表現形式有下拉,刷新,點擊切換和懸停顯示等,以下常見的幾種案例。
- 自動執行的異步請求
網頁資源由多個異步(AJAX)請求共同加載資源。
當客戶端請求時,爲了提高效率,開發者將頁面總資源分成多個資源,多個資源通過異步發送客戶端。所以頁面數據的響應值基本都是在多個AJAX請求響應中。 - 點擊事件
在網頁中通過點擊按鈕或標籤發生請求,而點擊事件一般與JavaScript的方法綁定,只要點擊事件觸發,就會執行事件的方法發送請求。 - 下拉加載
下拉加載實際上一種翻頁操作,而翻頁操作則爲點擊事件,只是鼠標操作不一樣罷了,所以對於下拉加載,也是發送一個AJAX請求。
動態渲染技術不止以上幾種,但無論事件加載如何變化,動態渲染的基礎不會變化,只要能夠解決頁面渲染問題,那麼…
動態渲染爬蟲解決方法:
對於動態渲染,通過分析對應的JavaScript代碼也能解決,但是時間成本太大,不推薦。如:網站有50個請求,那麼需要就分析50對應的JavaScript代碼。而且代碼如果下次發生改變,那麼又要重新分析。
以下是常用的對付動態渲染的工具:
- Selenium
不多介紹,做運維、爬蟲的工程師都知道。 - Puppeteer
可以理解爲異步的Selenium,Python 中使用 Pyppeteer 庫 - Splash
Splash 是一個異步的 JavaScript 渲染服務,它帶有HTTP API 的輕量級 Web 瀏覽器。它能夠並行地處理多個頁面請求。
Splash 使用到分佈式爬蟲上,這是Selenium和Puppeteer無法做到的。做法:在雲服務器上部署該服務,並配置負載均衡,然後多臺爬蟲服務器使用該服務。
題外話:
在使用渲染工具做爬蟲時,並不是最強大的渲染工具(如Splash)是最好的,而是爭對網站而定。
同時也要注意渲染工具加載的渲染時間,在這三個渲染工具中,都支持資源禁止加載,這個可以提高渲染時間。如:某網站需要的是文字資源,並不是圖片資源,這裏可以設置禁止加載圖片或其它類型文件。
通用不一定適用,對於頁面的動態渲染,不要想到使用渲染工具是最好的,應當考慮爬取的資源,請求的資源,工具的所需的時間。如:網頁中分析出JavaScript代碼,AJAX請求也不是很多,這時可以結合 JavaScript + Python 代碼的方式解決。