首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

Python实时爬取斗鱼弹幕

实现目标: 输入斗鱼房间号实时获取弹幕信息,实现效果如下: douyu.gif 逻辑梳理 首先说明下斗鱼是开放了弹幕API的,可以直接去他们开发者论坛查看文档,按照文档中要求一步一步的来就好了,我这边就简单梳理下: 建立两个线程:一个与弹幕服务器建立连接然后获取数据,一个定时发送心跳信息给弹幕服务器保持连接。 建立连接 通过TCP协议连接到弹幕服务器; IP 地址:openbarrage.douyutv.com 端口:8601 向弹幕服务器发送登录请求,登录弹幕服务器,消息格式type@=loginreq/roomid@=房间号/,不需要账号密码; 登陆成功之后服务器会给你返回一个登录成功信息,这部分不用管,继续向服务器发送一个进入弹幕分组请求,格式type@=joingroup/rid@=房间号/gid@=-9999/,gid使用-9999就好,表示海量弹幕模式; 接下来接收消息就好了,当然服务器返回的不止弹幕信息,还包括礼物/特殊人物进入房间等消息,这部分可以通过返回消息的type进行判断,选择自己需要的就好,详细的参见文档; 心跳消息 为保持连接需要每隔段时间向弹幕服务器发送心跳消息,长时间未收到心跳消息服务器就会断开连接了,心跳消息格式:type@=keeplive/tick@=1439802131/,其中tick为当前秒级时间戳。 代码部分 # -*- coding:utf-8 -*- import socket import re import time import struct import threading def connect(): ''' 第三方客户端通过 TCP 协议连接到弹幕服务器(依据指定的 IP 和端口); 第三方接入弹幕服务器列表: IP 地址:openbarrage.douyutv.com 端口:8601 ''' print '-----*-----DouYu_Spider-----*-----\n' host = socket.gethostbyname("openbarrage.douyutv.com") port = 8601 global s s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port)) def send_msg(msg): data_length = len(msg) + 8 code = 689 msgHead = struct.pack('<i',data_length) \ + struct.pack('<i',data_length) + struct.pack('<i',code) s.send(msgHead) sent = 0 while sent < len(msg): tn = s.send(msg[sent:]) sent = sent + tn def danmu(room_id): ''' 1.客户端向弹幕服务器发送登录请求 2.客户端收到登录成功消息后发送进入弹幕分组请求给弹幕服务器 ''' login = 'type@=loginreq/roomid@=%s/\0'%room_id login = login.encode('utf-8') send_msg(login) joingroup = 'type@=joingroup/rid@=%s/gid@=-9999/\0'%room_id joingroup = joingroup.encode('utf-8') send_msg(joingroup) while True: content = s.recv(1024) if judge_chatmsg(content): nickname = nick_name(content) chatmsg = chat_msg(content) print '%s : %s'%(nickname,chatmsg) else: pass def keep_alive(): ''' 客户端每隔 45 秒发送心跳信息给弹幕服务器 ''' while True: msg = 'type@=keeplive/tick@=%s/\0'%str(int(time.time())) send_msg(msg) time.sleep(45) def nick_name(content): ''' 弹幕消息: type@=chatmsg/rid@=301712/gid@=-9999/uid@=123456/nn@=test /txt@=666/level@=1/ 判断type,弹幕消息为chatmsg,txt为弹幕内容,nn为用户昵称 ''' pattern = re.compile(r'nn@=(.*)/txt@') nickname = pattern.findall(content)[0] return nickname def chat_msg(content): ''' 弹幕消息: type@=chatmsg/rid@=301712/gid@=-9999/uid@=123456/nn@=test /txt@=666/level@=1/ 判断type,弹幕消息为chatmsg,txt为弹幕内容,nn为用户昵称 ''' pattern = re.compile(r'txt@=(.*)/cid@') chatmsg = pattern.findall(content)[0] return chatmsg def judge_chatmsg(content): ''' 判断是否为弹幕消息 ''' pattern = re.compile(r'type@=(.*)/rid@') data_type = pattern.findall(content) try: if data_type[0] == 'chatmsg': return True else: return False except Exception, e: return False if __name__ == '__main__': connect() t1 = threading.Thread(target=danmu,args=(2947432,)) t2 = threading.Thread(target=keep_alive) t1.start() t2.start() 最后 斗鱼提供的文档已经是一年前的了,里面传回的消息内容增加了不少,但整体逻辑还是没变,我这边只取了弹幕里面的昵称和文本内容,其他的消息各位可以先打印出来看了再写正则表达式去匹配就好。 我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=4smxcktb7utn

优秀的个人博客,低调大师

Python L.sort 与sorted

L.sort() Definition : sort(key=None, reverse=False) Type : Function of None module L.sort(key=None, reverse=False) -> None -- stable sort IN PLACE sorted() Definition : sorted(iterable, *, key=None, reverse=False) Type : Function of builtins module Return a NEW sorted list from the items in iterable. *key* specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly). *reverse* is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed. L.sort()是对L进行就地排序,只适用于列表。 sorted()会新建列表,适用于可迭代对象。 默认升序排列。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册