如何在目标站点上抓取通过 websocket 流式传输的 JSON 数据

Posted

技术标签:

【中文标题】如何在目标站点上抓取通过 websocket 流式传输的 JSON 数据【英文标题】:How to scrape JSON data streamed via websockets on a target site 【发布时间】:2013-11-20 22:01:44 【问题描述】:

我被要求抓取一个通过 websockets 接收数据的站点,然后通过 javascript/jquery 将其呈现到页面。是否可以绕过中间人(DOM)并使用/抓取来自套接字的数据?像 phantomJS 这样的无头 webkit 是否可以做到这一点?目标站点正在使用socket.io。

我需要使用数据并根据数据中的关键字触发警报。我正在考虑使用Goutte 库,并将在 php 中构建刮板。

【问题讨论】:

你们有什么样的技术可用?您对机器有 root 访问权限还是使用共享主机? Goutte 不会帮助您,因为它们只会抓取“非套接字”内容。 我会选择主机。正在考虑使用 openshift 作为开发服务器,但也可以在 EC2 上使用 Ubuntu 映像。我打算使用 goutte 登录,然后在实际使用之前抓取套接字连接的详细信息。我的后备方案只是监视 Dom 事件,但显然效率会低得多。 你能发布网站 URL 和你想抓取的数据的描述吗? 恐怕不行。 @Tomas 这是我遇到的实际问题,但无法在这个问题上开始赏金 -***.com/questions/20949884/… 【参考方案1】:

Socket.io 与 websockets 并不完全相同。既然您知道他们使用 socket.io,我将专注于这一点。 抓取此套接字的最简单方法是使用 socket.io 客户端。

把它放在你的页面上:

<script src="https://github.com/LearnBoost/socket.io-client/blob/0.9/dist/socket.io.js"></script>
<script src="scraper.js"></script>

创建文件 scraper.js:

var keywords = /foo|bar/ig;
var socket = io.connect('http://host-to-scrape:portnumber/path');
socket.on('<socket.io-eventname>', function (data) 
  // The scraped data is in 'data', do whatever you want with it
  console.log(data);

  // Assuming data.body contains a string containing keywords:
  if(keywords.test(data.body)) callOtherFunction(data.body);

  // Talk back:
  // socket.emit('eventname',  my: 'data' );
);

2014 年 6 月 1 日更新

查看您在下面引用的 *** 问题,您似乎不是在服务器上运行它,而是尝试在浏览器窗口中运行它。所以我删除了关于 NodeJS 的所有内容,因为这不是必需的。

【讨论】:

你在你的抓取源上试过这个吗?它奏效了吗?这个套接字上可能有一些握手,如果是这样,如果没有你模拟它可能无法工作。 不,我还没有尝试过。我从来没有真正使用过节点,所以需要考虑我是否愿意为一个小项目花时间学习它。 不要害怕 Node.js。它只是具有更多功能的 JavaScript。 Node 比 PHP 更适合实时处理。您将在一天内学习 Node。 不确定我是否同意可以在一天内学习整个 Node,但您的回答给了我一个有用的起点。谢谢! 如果您有任何见解,请查看***.com/questions/20937627/…,我们将不胜感激。【参考方案2】:

在我看来,这对你来说是最好的方式:

使用 javascript 直接从应用程序的客户端页面抓取数据,而不使用 php 作为中间端。通过这种方式,您的服务器绝对不会有任何负载,我会推荐这个。由于您的目标站点正在使用 socket.io,因此请使用 socket.io 客户端来废弃数据。表格socke.io offiscial site:

    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = io.connect('http://target_website.com');
              //look the next line closely
      socket.on('event_name', function (data) 
        console.log(data);
        //do something with data here
      );
    </script>

当问题出现时,您如何知道*event_name*?您必须通过对目标站点的js进行研究来找到它。没有解决办法。至少我不知道没有他们中的任何一个。

【讨论】:

这是一个服务器端应用程序。

以上是关于如何在目标站点上抓取通过 websocket 流式传输的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ratchet for PHP 通过 WebSocket 流式传输二进制数据

如何将音频数据从 Android 流式传输到 WebSocket 服务器?

如何以编程方式(Python)抓取流式实时股票图表代码数据及其指标

如何通过烧瓶应用程序流式传输数据?

如何从浏览器中抓取网站?

抓取重定向的目标链接