[英]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.