[英]Node.js scraping with chrome-remote-interface
我一直在嘗試抓取一個受 Distil Networks 保護的網站,其中使用 selenium(使用 Python)總是會失敗。
我做了一些搜索,我的結論是該站點可以通過使用某種 javascript 檢測到您正在使用 Selenium。 然后我在chrome-remote-interface
掠奪,就像這是我想要的東西,但后來我被卡住了。
我想做的是自動化以下步驟:
我知道我可以通過以下方式打開 Chrome 實例進行調試:
google-chrome --remote-debugging-port=9222
我可以通過以下方式在節點上打開控制台:
chrome-remote-interface -t 127.0.0.1 -p 9222 inspect -r
我還可以運行簡單的腳本,如
Page.navigate({url:"https://google.com"})
Runtime.evaluate({expression:"1+1"})
但是就像我不能像在 Chrome 開發人員工具控制台上那樣直接在 Node.js 上獲取 DOM。 基本上我想要的是在 Node 上運行腳本,就像我可以在 Chrome 開發者工具控制台上做的那樣。
此外,用於抓取的chrome-remote-interface
文檔不足。 有什么好的鏈接嗎?
我知道兩年前有人問過它,但為了文檔目的,讓我把它寫在這里。
- 貿易工具 -
我嘗試了與您相同的技術(使用遠程調試器進行抓取),但我沒有使用 Python,而是使用了 Node.js,因為它具有異步性質,因此可以更輕松地使用遠程調試器所依賴的 websocket。
-- 運行時.評估 --
我注意到的一件事是,如果您的表達式涉及異步調用,Runtime.evaluate 不是恢復任何數據的有效選項,因為它返回調用函數的結果而不是回調函數的結果。 你必須堅持使用同步表達式。
例子:
Array.from(document.getElementByTagName('tr'))
.map((e)=>e.children[2].innerHTML)
.filter((e)=>e.length>0)
另一件事是,當您的表達式返回一個數組 Runtime.evaluate 時,只需提及該表達式返回一個數組而不是數組本身! (我知道真氣)我通過在頁面上下文中簡單地將數組編碼為 JSON 字符串,然后在它到達 Node.js 時將其解碼回對象來解決它。 例如,上面的表達式需要是:
JSON.stringify(
Array.from(document.getElementByTagName('tr'))
.map((e)=>e.children[2].innerHTML)
.filter((e)=>e.length>0)
)
- 導航 -
當您使用“Page.navigate”、“.click()”、“.submit()”、“window.location.href=...”或任何其他方式觸發頁面加載時,了解下一次加載的時間很重要在使用 Runtime.evaluate 發送更多指令之前,頁面已完全加載。 我做了一個技巧,要求調試器向我發送頁面加載事件(在文檔中查找 Page.enable 方法),然后在發送更多表達式之前等待“Page.loadEventFired”事件。
由Runtime.evaluate
計算的 JavaScript 表達式在頁面上下文中執行,就像在 DevTools 控制台中發生的一樣。
您可以使用DOM
域與 DOM 交互,例如DOM.getDocument
、 DOM.querySelector
等。
還要記住chrome-remote-interface
主要是一個庫,這意味着它允許您編寫自己的 Node.js 應用程序, chrome-remote-interface inspect
只是一個實用程序。
您可以從多個地方獲得幫助:
如果你問一些更具體的問題,我很樂意幫助你。
最后,您可能想看一下automated-chrome-profiling
,我認為它在結構上與您要實現的目標相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.