国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

網頁爬蟲 JavaScript 頁面渲染技術與應用

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-25 18:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

廖雨寒 楊彥松 張斌

睿哲科技股份有限公司

一、背景

隨著網絡的迅速發展,萬維網成為大量信息的載體,如何有效地提取并利用這些信息成為一個巨大的挑戰,網絡爬蟲(web crawler)隨之而生。但是現在的網站很少有純靜態網頁,大部分網站都通過JavaScript渲染、ajax異步等實現網頁數據加載。對于目前的爬蟲框架來說,基本都是爬取到的未渲染過的HTML源碼,所以對于爬蟲來說沒真正做到瀏覽器的所見即所爬。對于scrapy來說,官方有一個scrapy-splash項目支持頁面渲染解析,然而scrapy-splash在高并發狀態下極其不穩定。一種方案是通過webkit瀏覽器引擎直接渲染,另一種方案是通過調用瀏覽器渲染。通過幾種方案比較,最終選擇了Google Chrome Devtools Protocol開發渲染功能。

二、渲染方案可行性分析

1.Scrapy-Splash

Scrapy-splash是scrapy官方團隊提供的一個解決js渲染問題的方案。Splash是處理網頁渲染的模塊,它內部使用的開源的webkit瀏覽器引擎,通過HTTP API來使用渲染服務。在scrapy中通過DownloaderMiddleware處理網頁請求,實際是去請求splash接口并得到渲染后的數據。

Splash優點:

可以并行處理多個網頁

獲取HTML結果和/或截取屏幕截圖

關掉加載圖片或使用 Adblock Plus規則使得渲染速度更快

使用JavaScript處理網頁內容

使用Lua腳本

能夠獲得具體的HAR格式的渲染信息

然而在實際使用scrapy-splash的過程中,也遇到過一些splash的問題:

對于一些特殊網站,并不能很好的處理重定向,比如一些需要通過js渲染Cookie的頁面,需要通過location對象重定向好幾次才能到真正的頁面,但是splash只是處理了第一次的渲染Cookie后并沒有實現跳轉

在并發的情況下,獲取到的數據有時候是沒有內容的

2.Scrapy-QtWebkit

Splash是采用Webkit引擎實現的網頁渲染,可直接采用Webkit對接Scrapy實現渲染網頁。在Qt庫中有相應的QtWebkit模塊,但是在Qt5.6版本以上QtWebkit就被淘汰了,代替它的是QtWebEngine,因此,選擇QtWebKit時,建議使用Qt4或者Qt5.6之前的版本。

Webkit大致通過View-->Page-->Frame的流程來加載網頁。通過這些模塊,對于上面splash遇到重定向問題和空頁面問題都能得到解決。

Webkit優點:

細粒度處理網頁渲染

資源加載可控

直接交與webkit處理更效率

Webkit缺點:

內存資源占用較大

高并發處理網頁過多容易引起C底層錯誤

三、Google Chrome Devtools Protocol

以上兩種方案,都存在各自的缺點, 那有沒有可能直接通過調用瀏覽器加載網頁呢?事實上selenium可以操作瀏覽器。selenium操作chrome是使用chromedriver,chromedriver底層應用的是Chrome Devtools Protocol,因此,何不直接使用Chrome Devtools Protocol。

Chrome Devtools Protocol介紹

在Chrome/Chromium瀏覽器中,按F12會彈出調試工具,它是通過Chrome Devtools Protocol的協議來進行數據通訊。Chrome Devtools Protocol用來與瀏覽器頁面(pages)交互和調試的協議通道。它采用websocket來與頁面建立通信通道,由發送給頁面的Commands和它所產生的Events組成。

在Chrome Devtools Protocol中,有很多不同的功能模塊域(domains),類似于Chrome開發這工具的個功能模塊。

然而對于此例的爬蟲來說,只需要用到Network,Page,Runtime等幾個功能模塊域:

Network允許跟蹤頁面的網絡活動,它公開http, file, data,網絡請求和響應等數據信息

Page會檢查與頁面相關的動作和事件

Runtime主要用作運行JavaScript操作代碼

啟動調試實例

要使用Chrome Devtools Protocol,需要開啟調試。我們的項目運行在服務器中,所以需要開啟無頭模式 --headless --disable-gpu --no-sandbox。

chrome.exe --remote-debugging-port=9222 --headless --disable-gpu --no-sandbox

如果需要遠程調試,可以加上參數--remote-debugging-address='0.0.0.0'。

操作Chrome Devtools Protocol

通過以上命令可以啟動一個Chrome調試實例,通過HTTP調用接口:

http://loacalhost:9222/json

會得到接口返回的JSON數據:

"description": "",

"devtoolsFrontendUrl": "/devtools/inspector.html?ws=localhost:9222/devtools/page/A6C1F7B23DFF222A87143ACB37CBF7C4",

"id": "A6C1F7B23DFF222A87143ACB37CBF7C4",

"title": "about:blank",

"type": "page",

"url": "about:blank",

"webSocketDebuggerUrl": "ws://localhost:9222/devtools/page/A6C1F7B23DFF222A87143ACB37CBF7C4"

默認開啟實例后會有一個空的標簽頁(Tab),要創建新的Tab,只需要通過調用接口

http://loacalhost:9222/json/new

或者在后面直接添加網址,Tab將會創建并加載網頁

http://loacalhost:9222/json/new?http://www.example.com/

在每個Tab中有一個webSocketDebuggerUrl字段,它提供了一個WebSocket接口與Chrome交互。比如要啟用Page模塊域,通過WebSocket發送以下命令開啟:

{"id":1, "method":"Page.enable", "params":{}}

關閉Tab

http://loacalhost:9222/json/close/A6C1F7B23DFF222A87143ACB37CBF7C4

四、Scrapy實現Chrome Protocol下載渲染頁面

Scrapy是一個爬蟲框架,它使用了Twisted異步網絡庫來處理網絡通訊,他的大致架構流程如圖

圖 1 Scrapy框架

在圖1中我們看到scrapy處理網絡請求的是Downloader模塊,他通過DownloaderHandler下載處理器完成下載網絡請求,下載處理器使用的是Twisted網絡庫實現的,對于Chrome Protocol來說我們通過接口操作命令實現網頁加載本質上是Chrome加載網頁,也就是說下載處理是通過Chrome Protocol接口操作Chrome瀏覽器請求加載并渲染網頁,因此我們需要拿到渲染后的網頁HTML源碼,需要改寫DownloaderHandler。

然而原生操作Chrome Protocol太繁瑣,我們需要封裝它。在Github上有多種語言實現了Chrome Devtools Protocol的封裝。對于Python來說,我們使用Pychrome庫來操作Chrome Protocol,可以直接用pip安裝模塊:

pip install pychrome

當然要使用該模塊得要啟動Chrome調試實例,通過實例的地址和端口號連接:

browser = pychrome.Browser(url="http://<your_ip>:9222")

通過new_tab()方法創建tab標簽頁,通過tab.start()啟動當前tab的websocket鏈接,例如需要啟動Network功能域,通過調用tab.Network.enable()來啟動,通過tab.Page.navigate(url="http://www.example.com")加載網頁,該頁面加載時的一切網絡活動都可以通過接收websocket響應得到json數據。

這時會有一個問題,何時才算是真正渲染完成頁面?

圖 2 JS渲染流程

在圖2中是瀏覽器從輸入網址到頁面加載完成的處理流程,loadEventEnd是真正加載完成,但是在一些使用ajax異步請求的網頁使用loadEventEnd并不能很好的判斷為渲染結束,所以這里我們使用JavaScript命令獲取readyState狀態判斷頁面是否加載完成:

document.readyState

readyState一共有五種狀態:

uninitialized - XML 對象被產生,但沒有任何文件被加載

loading - 加載程序進行中,但文件尚未開始解析

loaded - 部分的文件已經加載且進行解析,但對象模型尚未生效

interactive - 僅對已加載的部分文件有效,在此情況下,對象模型是有效但只讀的

complete - 文件已完全加載,代表加載成功

通過document.readyState == complate來判斷數據的加載進度。當加載完成時通過javascript命令獲取渲染后的HTML源碼:

document.documentElement.outerHTML

在這里我們就可以使用Pychrome替代scrapy的twisted下載處理。

五、結語

使用chrome devtools protocol來操作chrome瀏覽器來渲染頁面,能基本完成渲染頁面的需求,一些需要與瀏覽器交互的頁面也大致能使用JavaScript操作命令,重點是使用chrome操作頁面渲染會很占用資源,因此不宜過多的開啟渲染進程,多線程下載盡量重用Tab標簽頁,因為每多創建一個Tab相當于開了一個進程,最后,爬蟲結束時,應該調用相關接口關閉所有Tab,釋放資源。

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • javascript
    +關注

    關注

    0

    文章

    526

    瀏覽量

    56321
  • 應用軟件
    +關注

    關注

    0

    文章

    53

    瀏覽量

    9417
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    京東關鍵詞搜索商品列表的Python爬蟲實戰

    京東關鍵詞搜索商品列表 Python 爬蟲實戰 你想要實現京東關鍵詞搜索商品的爬蟲,我會從 合規聲明、環境準備、頁面分析、代碼實現、反爬優化 五個方面展開,幫助你完成實戰項目。 一、前置聲明(重要
    的頭像 發表于 01-04 10:16 ?711次閱讀

    # 深度解析:爬蟲技術獲取淘寶商品詳情并封裝為API的全流程應用

    需求。本文將深入探討如何借助爬蟲技術實現淘寶商品詳情的獲取,并將其高效封裝為API。 一、爬蟲技術核心原理與工具 1.1 爬蟲運行機制 網絡
    的頭像 發表于 11-17 09:29 ?341次閱讀

    Nginx限流與防爬蟲配置方案

    在互聯網業務快速發展的今天,網站面臨著各種流量沖擊和惡意爬蟲的威脅。作為運維工程師,我們需要在保證正常用戶訪問的同時,有效防范惡意流量和爬蟲攻擊。本文將深入探討基于Nginx的限流與防爬蟲解決方案,從原理到實踐,為大家提供一套完
    的頭像 發表于 09-09 15:52 ?906次閱讀

    從 CPU 到 GPU,渲染技術如何重塑游戲、影視與設計?

    渲染技術是計算機圖形學的核心內容之一,它是將三維場景轉換為二維圖像的過程。渲染技術一直在不斷演進,從最初的CPU渲染到后來的GPU
    的頭像 發表于 09-01 12:16 ?980次閱讀
    從 CPU 到 GPU,<b class='flag-5'>渲染</b><b class='flag-5'>技術</b>如何重塑游戲、影視與設計?

    知乎開源“智能預渲染框架” 幾行代碼實現鴻蒙應用頁面“秒開”

    近日,知乎在Gitee平臺開源了其自研的鴻蒙“智能預渲染框架”,并將該框架的Har包上架到OpenHarmony三方庫中心倉。該框架在鴻蒙平臺首創“智能預渲染技術,旨在破解應用復雜頁面
    的頭像 發表于 08-29 14:32 ?627次閱讀
    知乎開源“智能預<b class='flag-5'>渲染</b>框架” 幾行代碼實現鴻蒙應用<b class='flag-5'>頁面</b>“秒開”

    通道渲染:釋放渲染的全部潛能!通道渲染的作用、類型、技巧

    在3D圖形創作中,渲染通道(RenderPasses)是一項至關重要的技術,它通過將復雜的渲染圖像拆分為多個圖層,如陰影、光照、法線等,使藝術家能夠在后期制作中更精準地控制和調整畫面。我們常常驚嘆于
    的頭像 發表于 07-15 14:22 ?690次閱讀
    通道<b class='flag-5'>渲染</b>:釋放<b class='flag-5'>渲染</b>的全部潛能!通道<b class='flag-5'>渲染</b>的作用、類型、技巧

    英語單詞學習頁面+單詞朗讀實現 -- 【1】頁面實現 ##HarmonyOS SDK AI##

    ?先看一下頁面效果 ? 整體頁面是一個比較簡潔的頁面,其中有兩個特色功能 對于例句中,能夠實現將當前的單詞從句子中進行識別并突出顯示 對于單詞和句子,可以進行朗讀,這個朗讀使用的是Core
    發表于 06-29 23:24

    ArkUI介紹

    是共用的,但是相比類Web開發范式,聲明式開發范式無需JS框架進行頁面DOM管理,渲染更新鏈路更為精簡,占用內存更少,應用性能更佳。 發展趨勢:聲明式開發范式后續會作為主推的開發范式持續演進,為開發者
    發表于 06-24 06:41

    如何用Brower Use WebUI實現網頁數據智能抓取與分析?

    ? 作者:算力魔方創始人/英特爾創新大使劉力 Browser-use是一款能讓AI智能體像人類一樣操作網頁的創新工具,與傳統網絡爬蟲技術相比,Browser-use能模擬人瀏覽并操作網頁
    的頭像 發表于 04-17 17:48 ?1128次閱讀
    如何用Brower Use WebUI實現<b class='flag-5'>網頁</b>數據智能抓取與分析?

    CPU渲染、GPU渲染、XPU渲染詳細對比:哪個渲染最快,哪個效果最好?

    動畫渲染動畫3D渲染技術需要應對復雜的計算任務和精細的圖像處理,作為渲染技術人員,選擇合適的渲染
    的頭像 發表于 04-15 09:28 ?1675次閱讀
    CPU<b class='flag-5'>渲染</b>、GPU<b class='flag-5'>渲染</b>、XPU<b class='flag-5'>渲染</b>詳細對比:哪個<b class='flag-5'>渲染</b>最快,哪個效果最好?

    NVIDIA實現神經網絡渲染技術的突破性增強功能

    近日,NVIDIA 宣布了 NVIDIA RTX 神經網絡渲染技術的突破性增強功能。NVIDIA 與微軟合作,將在 4 月的 Microsoft DirectX 預覽版中增加神經網絡著色技術,讓開
    的頭像 發表于 04-07 11:33 ?1166次閱讀

    HarmonyOS應用高負載場景分幀渲染

    ,可以采用分幀渲染技術,將原本在一幀內加載的數據分散到多幀中逐步加載,從而減輕單幀的渲染壓力。不過,分幀渲染需要開發者精確計算每幀加載的數據量,操作較為復雜,因此建議僅在性能瓶頸明顯且
    的頭像 發表于 03-25 10:28 ?1108次閱讀
    HarmonyOS應用高負載場景分幀<b class='flag-5'>渲染</b>

    爬蟲數據獲取實戰指南:從入門到高效采集

    爬蟲數據獲取實戰指南:從入門到高效采集 ? ? 在數字化浪潮中,數據已成為驅動商業增長的核心引擎。無論是市場趨勢洞察、競品動態追蹤,還是用戶行為分析,爬蟲技術都能助你快速捕獲目標信息。然而,如何既
    的頭像 發表于 03-24 14:08 ?1541次閱讀

    「極速探索HarmonyOS NEXT 」閱讀體驗】+Web組件

    web web應用是基于 Web技術(如HTML、CSS、JavaScript),構建在瀏覽器中運行的應用,亦稱為前端開發。從用戶視角來看,手機和平板上的應用多由原生開發打造;而通過瀏覽器訪問的網頁
    發表于 03-10 10:39

    Get這個秘籍,鴻蒙原生應用頁面滑動絲滑無比

    問題的解決方案,通過創新技術手段解決不同技術棧下的性能瓶頸,為開發者提供更流暢的頁面渲染體驗,有效提升鴻蒙應用的頁面滑動流暢度。 ArkUI
    發表于 03-06 14:41