繁体   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