8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

使用 python 从 socket.io 客户端抓取 json

user26020733 2月前

106 0

我需要从网站抓取最新信息:https://x13.bet/double,我发现我需要的所有网站信息都来自:https://s.x13.bet:2053/socket.io/?EIO=4&

我需要从网站上抓取最新信息: https://x13.bet/double

我发现我需要的所有网站信息都来自: https://s.x13.bet:2053/socket.io/?EIO=4&transport=polling&t=P4eAL8U&sid=TrsbKlW5sGeHC8A4AETS

我想知道如何使用 python 从套接字中抓取这些信息,

请注意,如果您进入我提到的网站,您将获得:

{
    "code": 3,
    "message": "Bad request"
}

但里面有真实的信息。我在预览选项卡上看到:

我已经测试过:

import socketio

url = "https://s.x13.bet:2053"

sio = socketio.Client()

@sio.event
def connect():
    print("Connected.")

@sio.event
def message(data):
    print("Message received:", data)

@sio.event
def disconnect():
    print("Disconnected.")

sio.connect(url, transports=['polling'])

sio.wait()

它只是返回给我显示已连接,但没有任何真实数据...

帖子版权声明 1、本帖标题:使用 python 从 socket.io 客户端抓取 json
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由user26020733在本站《sockets》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我正在使用 SQL。在表 tblDemo 中,有一列是“FileName”。此列的每一行都包含一个具有任意扩展名的不同文件名。例如“flower.jpeg”、“batman.mov”、study.pdf 等。请...

    我正在使用 SQL。

    在表格 tblDemo 中,有一列是“FileName”。此列的每一行包含一个具有任意扩展名的不同文件名。例如“flower.jpeg”、“batman.mov”、study.pdf 等。

    请建议我执行一个查询,帮助我从“文件名”列的每一行中删除扩展名(以及点)。这样我就可以只获取名称,例如“flower”、“batman”、“study”等。

    谢谢

  • 我理解表值函数被设计为出现在 FROM 子句中,但是有没有办法将其包含在列表列中,即:SELECT xa, xb, FN(xc), x.dFROM x; ...其中

    理解 表值函数被设计为出现在子句中 FROM ,但是有没有办法将其包含在列表列中,即:

    SELECT
     x.a,
     x.b,
     FN(x.c),
     x.d
    FROM x;
    

    ...预期输出可能如下所示?

    |x.a|x.b|fn_col_1|fn_col_2|fn_col_3|x.d|
    
  • 试试这个:

    UPDATE TableName
    SET FileName = REVERSE(SUBSTRING(REVERSE(FileName), 
                           CHARINDEX('.', REVERSE(FileName)) + 1, LEN(FileName))
    

    查看 SQLFiddle.com 的演示

  • Wil 2月前 0 只看Ta
    引用 5

    我想我是在寻找一个行值函数。我有一个函数,根据提供的参数,它可以返回大约 8 个不同的值。问题是,要计算任何 1 个值都需要计算所有值,这需要大量工作 - 因此,当我想要一个像上面这样的查询,并且我想返回这 8 个值中的每一个时,每行结果都会执行 8 次相同(或非常相似)的工作。最好调用一次该函数并一起返回 8 个值,这占处理的 1/8。我会研究将 TVF 与另一个表连接起来。

  • 你的冠军。它成功了。它确实从 fileName 中删除了扩展名,即使文件名中有多个“点”。我会稍微编辑一下你的帖子,这样它以后会帮助到其他人。

  • @johnny5 999 是字符串(文件名)的起始参数。来自 w3schools.com/sql/func_sqlserver_charindex.asp: \'搜索的起始位置(如果您不想从字符串开头开始)。字符串中的第一个位置是 1。\'如果您的列中的字符串包含超过 999 个字符,则必须修改此参数。在大多数情况下,这个数字应该足够了。

  • 在 Sql Server 上测试。这显示没有扩展名的文件名,更改为 Update / Set 以修改数据。

    SELECT left([FileName], len([FileName]) - charindex('.', reverse([FileName]))) 
      FROM tblDemo
    

    编辑: 使用反向进行修改,因此当字段包含多个点时它也有效。

    以下是 更新表的 版本:

    UPDATE Testing 
       Set [FileName] = left([FileName], 
                             len([FileName]) - charindex('.', Reverse([FileName])))
    
  • Ben/Jcis - 在上述查询中需要修改什么,以考虑类似这样的情况:- 'This.Is.My.Filename.Txt'

  • 引用 10

    您可以将 cross apply TVF 移至常规表,例如

    SELECT
     x.a
     , x.b
     , x.d
     , y.*
    FROM x
    cross apply FN(x.c) y;
    
  • @Jcis - 非常感谢,朋友。我接受了 John 的回答,因为他首先回答了多个点的问题。你的回答完全正确。

  • 我需要删除所有扩展名,即:.tar.gz 或 .txt.out。以下是我在 SQL Server 中可以使用的方法:

    CREATE FUNCTION RemoveFileExt
    (
        @fullpath nvarchar(500)
    )
    RETURNS nvarchar(500)
    AS
    BEGIN
        IF(CHARINDEX('.', @fullpath) > 0)
        BEGIN
           SELECT @fullpath = SUBSTRING(@fullpath, 1, CHARINDEX('.', @fullpath)-1)
        END
        RETURN @fullpath
    END;
    
    CREATE FUNCTION RemoveFileExtAll
    (
        @fullpath nvarchar(500)
    )
    RETURNS nvarchar(500)
    AS
    BEGIN
        IF(CHARINDEX('.', @fullpath) > 0)
        BEGIN
            SELECT @fullpath = dbo.RemoveFileExt(@fullpath)
        END
        RETURN @fullpath
    END;
    
    select dbo.RemoveFileExtAll('test.tar.gz');
    
    OUTPUT> test
    

    另外,要从 Linux 或 Windows 中的完全限定路径中获取基本名称:

    CREATE FUNCTION GetBaseName
    (
        @fullpath nvarchar(500)
    )
    RETURNS nvarchar(500)
    AS
    BEGIN
        IF(CHARINDEX('/', @fullpath) > 0)
        BEGIN
           SELECT @fullpath = RIGHT(@fullpath, CHARINDEX('/', REVERSE(@fullpath)) -1)
        END
        IF(CHARINDEX('\', @fullpath) > 0)
        BEGIN
           SELECT @fullpath = RIGHT(@fullpath, CHARINDEX('\', REVERSE(@fullpath)) -1)
        END
        RETURN @fullpath
    END;
    
    select dbo.GetBaseName('/media/drive_D/test.tar.gz');
    
    OUTPUT> test.tar.gz
    
    select dbo.GetBaseName('D:/media/test.tar.gz');
    
    OUTPUT> test.tar.gz
    
    select dbo.GetBaseName('//network/media/test.tar.gz');
    
    OUTPUT> test.tar.gz
    
  • 这是一个返回所需结果的简单选择语句:

     SELECT  [Filename], SUBSTRING([Filename], 1, charindex('.',[Filename])-1) as [New name] FROM [Table]
    
  • 在 MySQL 中,这对我来说有效。

    set @file = 'test1.test2.test3.docx';
    
    SELECT      substring(@file, 1, (length(@file) - (length(substring_index(@file, '.', -1)) + 1))) as 'name_file',
                substring_index(@file, '.', -1) as 'extension';
    
  • 我正在使用 Go 中的两个 map[string]interface{} 类型的对象,我需要创建一个函数来返回这些对象之间的所有差异。我知道 reflect.DeepEqual(m1, m2) 可以告诉...

    我正在使用 Go 中的两个 map[string]interface{} 类型的对象,我需要创建一个函数来返回这些对象之间的所有差异。我知道 reflect.DeepEqual(m1, m2) 可以告诉我它们是否相等,但我需要知道哪些字段已更改。

    我希望该函数返回如下结构:

    {
    "id": {
    "before": "example",
    "now": "example2"
    },
    "name": {
    "before": "oldName",
    "now": "newName"
    }
    // other fields...
    }
    
    

    以下是函数签名的示例:

    
    func FindDifferences(m1, m2 map\[string\]interface{}) map\[string\]map\[string\]interface{} {
    // implementation
    }
    
    

    我尝试实现此功能,但遇到了问题。以下是实现和失败的测试用例:

    func FindDifferences(m1, m2 map[string]interface{}) map[string]map[string]interface{} {
        differences := make(map[string]map[string]interface{})
        for k, v1 := range m1 {
            if v2, ok := m2[k]; ok {
                if !reflect.DeepEqual(v1, v2) {
                    differences[k] = map[string]interface{}{
                        "before": v1,
                        "now":    v2,
                    }
                }
            } else {
                differences[k] = map[string]interface{}{
                    "before": v1,
                    "now":    nil,
                }
            }
        }
        for k, v2 := range m2 {
            if _, ok := m1[k]; !ok {
                differences[k] = map[string]interface{}{
                    "before": nil,
                    "now":    v2,
                }
            }
        }
        return differences
    }
    

    测试:

    func TestFindDifferences(t *testing.T) {
       m1 := map[string]interface{}{
            "id":             "d7f3c1e8-6b5a-4c9a-b28d-1b6345f28978",
            "name":           "Greenhouse-Management-System",
            "garden_id":      "a2b9c8f3-45d1-4e2d-bc1e-7845f3c91b27",
            "garden_version": "1.0",
            "enabled":        true,
            "template":       false,
            "nodes": []interface{}{
                map[string]interface{}{
                    "id":   "3f5a6d8e-8235-4d1a-8f37-e5c9f1a5c7b3",
                    "name": "Tomato-Section",
                    "desc": "Section for growing tomatoes",
                    "type": "plant:solanaceae",
                    "value": map[string]interface{}{
                        "soil_ph":           6.5,
                        "watering_schedule": "daily",
                        "fertilizer":        "compost",
                        "max_height":        2.0,
                        "max_width":         1.5,
                        "harvest_time":      "60 days",
                    },
                    "mode": "crop",
                    "parents": []interface{}{
                        "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p",
                    },
                    "children": []interface{}{},
                },
                map[string]interface{}{
                    "id":   "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p",
                    "name": "Irrigation-System",
                    "desc": "Automated irrigation system",
                    "type": "infrastructure:water",
                    "value": map[string]interface{}{
                        "water_source": "rainwater_tank",
                        "flow_rate":    "10 liters/minute",
                    },
                    "mode":    "support",
                    "parents": []interface{}{},
                    "children": []interface{}{
                        "3f5a6d8e-8235-4d1a-8f37-e5c9f1a5c7b3",
                    },
                },
            },
        }
        m2 := map[string]interface{}{
            "id":             "d7f3c1e8-6b5a-4c9a-b28d-1b6345f28978",
            "name":           "Greenhouse-Management-System",
            "garden_id":      "a2b9c8f3-45d1-4e2d-bc1e-7845f3c91b27",
            "garden_version": "1.0",
            "enabled":        true,
            "template":       false,
            "nodes": []interface{}{
                map[string]interface{}{
                    "id":   "3f5a6d8e-8235-4d1a-8f37-e5c9f1a5c7b3",
                    "name": "Tomato-Section",
                    "desc": "Section for growing tomatoes",
                    "type": "plant:fyvgukhl",
                    "value": map[string]interface{}{
                        "soil_ph":           6.5,
                        "watering_schedule": "daily",
                        "fertilizer":        "compost",
                        "max_height":        2.0,
                        "max_width":         1.5,
                        "harvest_time":      "60 days",
                    },
                    "mode": "crop",
                    "parents": []interface{}{
                        "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p",
                    },
                    "children": []interface{}{},
                },
                map[string]interface{}{
                    "id":   "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p",
                    "name": "Irrigation-System",
                    "desc": "Automated irrigation system",
                    "type": "infrastructure:water",
                    "value": map[string]interface{}{
                        "water_source": "rainwater_tank",
                        "flow_rate":    "10 liters/minute",
                    },
                    "mode":    "support",
                    "parents": []interface{}{},
                    "children": []interface{}{
                        "3f5a6d8e-8235-4d1a-8f37-e5c9f1a5c7b3",
                    },
                },
            },
        }
    
        expected := map[string]map[string]interface{}{
            "id": {
                "before": "example",
                "now":    "example2",
            },
            "name": {
                "before": "oldName",
                "now":    "newName",
            },
        }
    
        result := FindDifferences(m1, m2)
    
        if !reflect.DeepEqual(result, expected) {
            t.Errorf("Expected %v, but got %v", expected, result)
        }
    }
    

    测试用例失败,输出以下信息:

    Expected map[string][]map[string]map[string]string{
        "nodes": {
            {
                "type": {
                    "before": "plant:solanaceae",
                    "now":    "plant:fyvgukhl",
                },
            },
        },
    }
    

    看起来该函数错误地将未更改的字段包含在结果中。我该如何修改该函数以正确识别并仅列出已更改的字段?

    该代码适用于 1 层对象,但我想要一个适用于 3 层的代码。

  • 引用 16

    @CeriseLimón 我改变了问题来解释我的问题:此代码适用于 1 层对象,但我想要一个适用于 3 层的代码。

  • @ScottHunter 是的,此代码适用于 1 层对象,但我想要一个适用于 3 层的代码。

  • 在这个 jQuery 代码中,我想要实现的是,当登录用户点击关注按钮时,他们所关注的人的推文应该出现在仪表板上,并且关注...

    在这个 jQuery 代码中,我想要实现的是,当登录用户点击关注按钮时,他们关注的人的推文应该出现在仪表板上,并且关注文本应该变为取消关注。

    当我运行此代码时,它确实会关注用户并将其保存到数据库,但关注文本不会更改为取消关注,我需要手动刷新页面才能显示推文。 我希望这自动发生,推文直接显示在屏幕上,并且关注文本也会更改为取消关注。 我需要在此代码中更改或做什么?

    // Follow or unfollow function
    document.addEventListener('click', function (event) {
        if (event.target.classList.contains('follow-btn')) {
            var userId = event.target.getAttribute('data-userid');
            var followBtn = event.target;
    
            $.ajax({
                type: "POST",
                url: '/Home/Follow', // URL to send the follow action
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify({ UserId: userId }), // UserId property in the FollowUnfollowViewModel model
                success: function (response) {
                    if (response.success) {
                        // Append the received tweets to the screen
                        response.tweets.forEach(function (tweet) {
                            $('#tweets-container').append(
                                `<div class="tweet" id="tweet-${tweet.Id}">
                            <time>${new Date(tweet.CreatedAt).toLocaleString()}</time>
                            <p>
                                <strong>${tweet.TwitterUser.FirstName} ${tweet.TwitterUser.LastName}</strong>
                                <span class="text-muted">${tweet.TwitterUser.UserName}</span>
                            </p>
                            <p>${tweet.Content}</p>
                            <div class="tweet-actions">
                                <i class="fas fa-comment"></i>
                                <i class="fas fa-retweet"></i>
                                <i class="fas fa-heart"></i>
                            </div>
                        </div>`
                            );
                        });
    
                        // Change the follow button to unfollow button
                        followBtn.classList.remove('follow-btn');
                        followBtn.classList.add('unfollow-btn');
                        followBtn.textContent = 'Unfollow';
                    }
                },
                error: function () {
                   
                }
            });
        }
    
        if (event.target.classList.contains('unfollow-btn')) {
            var userId = event.target.getAttribute('data-userid');
            var unfollowBtn = event.target;
    
            $.ajax({
                type: "POST",
                url: '/Home/Unfollow', // URL to send the unfollow action
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify({ UserId: userId }), // UserId property in the FollowUnfollowViewModel model
                success: function (response) {
                    if (response.success) {
                        // Remove the tweets of the unfollowed user from the screen
                        response.tweets.forEach(function (tweet) {
                            document.getElementById(`tweet-${tweet.Id}`).remove();
                        });
    
                        // Change the unfollow button to follow button
                        unfollowBtn.classList.remove('unfollow-btn');
                        unfollowBtn.classList.add('follow-btn');
                        unfollowBtn.textContent = 'Follow';
                    }
                },
                error: function () {
                   
                }
            });
        }
    });
    
    
  • 引用 19

    @fdomn-m 这是我正在使用 C# 开发的 Razor 应用程序。我使用断点检查了 Home/Follow 端点,在该方法的末尾,有一个

  • 您的代码难道不应该是 if 和 else if 而不是 2 个 if 条件吗?您的页面应该在 follow-btn 和 unfollow-btn 之间切换,对吗?

返回
作者最近主题: