从套接字连接中抓取数据

问题描述 投票:0回答:1

我一直在尝试从使用 socket.io 进行实时更新的网站上抓取数据。如果可以的话那就非常方便了。

套接字层执行的大部分工作是发送和接收数据。套接字层本身明确避免对通过套接字发送或接收的数据强加任何结构。

我正在尝试从网站https://www.coinscrash.com/获取实时更新。但是,我尝试了以下代码,除了连接之外,没有得到任何更新:

var io = require("socket.io-client");
var socket = io("https://www.coinscrash.com");

socket.on("connect", function () {
  console.log(true);
});

socket.on("msg", function (data) {
  console.log("chat message");
});

socket.on("disconnect", function () {
  console.log(false);
});

socket
  .on("error", (err) => console.log(err))
  .on("connect_error", (err) => console.log(err));

我做错了什么还是这根本不可能?

javascript node.js web-scraping socket.io
1个回答
0
投票

我不认为你的抓取方法有效。您在代码中做了很多毫无根据的假设。我将解释我用来收集有关套接字连接信息的方法,并将其余的留给您。我也尝试纠正你的错误,但没有成功。

检查数据包

通过打开

https://coinscrash.com/play
的Chrome开发工具上的网络和应用程序选项卡,我们可以获得很多有关套接字连接的信息:

https://game.coinscrash.com/socket.io/?EIO=3&transport=polling&t=OoRA8bm&sid=YTATw0ot9MvDA542ABdY
  • 此连接涉及 Cookie:
  • 传输类型为轮询:

从网站代码检查套接字事件名称

从Chrome开发工具的Sources选项卡中,我们可以从

main-new-a35c0ce7.js
获取一些信息:

  • 客户端发出
    ping
    事件,并期望在一定延迟内从服务器发出
    pong
    事件:

为什么你的代码不起作用

var socket = io('https://www.coinscrash.com')

https://www.coinscrash.com
处没有任何可连接的内容。如前所述,套接字连接的服务器具有 URL https://game.coinscrash.com/socket.io/.

假设您以某种方式设法连接到服务器,您的代码仍然无法工作,因为事件名称

msg
不正确:

socket.on('msg', function(data) {
console.log('chat message');
});

客户应该期待一个

pong
事件。

我失败的尝试

首先,我在 HTTP 服务器上运行代码以持续监视套接字连接。如果没有服务器,您的代码将运行一次并结束。

// setup server
const http = require("node:http");
const hostname = "127.0.0.1";
const port = 3000;
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello World\n");
});
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

const BACKEND_URL = "https://game.coinscrash.com/socket.io/";

const { io } = require("socket.io-client");
const socket = io(BACKEND_URL, {
  reconnectionDelayMax: 10000,
  autoConnect: false,
  transports: ["polling", "websocket"],
  withCredentials: true, // includes cookies in socket
});

// Adds a listener that will be fired when any event is emitted.
socket.on("connect", () => {
  console.log(socket.id);
});

// Adds a listener that will be fired when any event is emitted.
socket.onAny((eventName, ...args) => {
  console.log(eventName);
});

我的代码仍然无法连接到套接字服务,很可能是因为此代码没有将所需的 cookie 发送到 coincrash 服务器。

最后的想法

在这种情况下,直接连接到套接字服务并不简单,因为 coincrash 服务器上可能会发生一些基于会话的身份验证(使用 cookie)。由于您使用的是基础的 NodeJS 环境,因此您将无法通过身份验证。

此外,coincrash 很可能将套接字配置为仅在其域名上运行,因此即使您克隆其前端网站并在本地主机上运行它,套接字连接也不会成功。

© www.soinside.com 2019 - 2024. All rights reserved.