簡體   English   中英

使用 chrome-remote-interface 抓取 Node.js

[英]Node.js scraping with chrome-remote-interface

我一直在嘗試抓取一個受 Distil Networks 保護的網站,其中使用 selenium(使用 Python)總是會失敗。

我做了一些搜索,我的結論是該站點可以通過使用某種 javascript 檢測到您正在使用 Selenium。 然后我在chrome-remote-interface掠奪,就像這是我想要的東西,但后來我被卡住了。

我想做的是自動化以下步驟:

  1. 打開 Chrome 實例
  2. 導航到一個頁面
  3. 運行一些javascript
  4. 收集數據並保存到文件
  5. 重復步驟 2 - 4

我知道我可以通過以下方式打開 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.getDocumentDOM.querySelector等。

還要記住chrome-remote-interface主要是一個庫,這意味着它允許您編寫自己的 Node.js 應用程序, chrome-remote-interface inspect只是一個實用程序。

您可以從多個地方獲得幫助:

如果你問一些更具體的問題,我很樂意幫助你。

最后,您可能想看一下automated-chrome-profiling ,我認為它在結構上與您要實現的目標相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM