python爬取斗鱼房间的弹幕

斗鱼弹幕服务api:https://open.douyu.com/source/api/63

基本步骤

  1. 连接斗鱼api服务器
  2. 构造登录请求
  3. 进入房间并构造获取弹幕请求
  4. 保持心跳
  5. 断开连接
import multiprocessing
import socket
import time
import re
import signal
import jieba
import requests
from bs4 import BeautifulSoup as bs4
from openpyxl import Workbook
from wordcloud.wordcloud import WordCloud
import matplotlib.pyplot as plt
import json# 构造socket连接,和斗鱼api服务器相连接
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("danmuproxy.douyu.com")
port = 8601
client.connect((host, port))# 弹幕查询正则表达式
danmu_re = re.compile(b'txt@=(.+?)/cid@')
username_re = re.compile(b'nn@=(.+?)/txt@')
level_re = re.compile(b'/level@=(.+?)/sahf@')# 根据房间号获取房间名
def get_room_name(roomid):res = requests.get('http://www.douyu.com/' + str(roomid))soup = bs4(res.text, 'lxml')total=soup.find(name='div', attrs={"class":'layout-Player-title'})t=total.find(name='h2', attrs={"class":'Title-anchorNameH2'})try:name=''.join(t.get_attribute_list('title'))except:name=''return namedef send_req_msg(msgstr):'''构造并发送符合斗鱼api的请求'''msg = msgstr.encode('utf-8')data_length = len(msg) + 8code = 689# 构造协议头msgHead = int.to_bytes(data_length, 4, 'little') \+ int.to_bytes(data_length, 4, 'little') + \int.to_bytes(code, 4, 'little')client.send(msgHead)sent = 0while sent < len(msg):tn = client.send(msg[sent:])sent = sent + tn# 数据保存至Excel中
def save_to_excel(room_name, barrage_list):wb = Workbook()ws = wb.activecount = 0for bl in barrage_list:try:ws.append([bl[0], bl[1], bl[2]])except:print('第%d条弹幕信息保存失败' % count)count += 1if room_name == None:room_name = '未知房间'wb.save(r'danmu' + '.xlsx')#获取弹幕信息
def DM_start(roomid,barrage_num):# 构造登录授权请求msg = 'type@=loginreq/roomid@={}/\0'.format(roomid)send_req_msg(msg)# 构造获取弹幕消息请求msg_more = 'type@=joingroup/rid@={}/gid@=-9999/\0'.format(roomid)send_req_msg(msg_more)room_name = get_room_name(roomid)print('已连接至\"{}\"的直播间'.format(room_name))barrage_list = []barrage_list.append(['等级', '昵称', '弹幕'])print("弹幕正在获取中...")flag = Truewhile flag:# 服务端返回的数据data = client.recv(1024)# 通过re模块找发送弹幕的用户名和内容danmu_level = level_re.findall(data)danmu_username = username_re.findall(data)danmu_content = danmu_re.findall(data)if not data:continueelse:for i in range(0, len(danmu_content)):try:# 输出信息level_deutf8 = danmu_level[0].decode( 'utf8')username_deutf8 = danmu_username[0].decode( 'utf8')barrage_deutf8 = danmu_content[0].decode(encoding='utf8')# print('[{}]:{}'.format(danmu_username[0].decode(#     'utf8'), danmu_content[0].decode(encoding='utf8')))except:continuebarrage_list.append([level_deutf8, username_deutf8 ,barrage_deutf8])barrages = len(barrage_list)if barrages > barrage_num:print('已成功获得%d条弹幕' % (barrages - 1))flag = Falsebreak#制作词云all_barrages = ''for bl in barrage_list:all_barrages += str(bl[2])all_barrages = filterword(all_barrages)words = ' '.join(jieba.cut(all_barrages))# 这里设置字体路径Words_Cloud = WordCloud(background_color="black",width=900,height=600, max_words=100, font_path="simkai.ttf")process_word=WordCloud.process_text(Words_Cloud,words)Words_Cloud.generate_from_frequencies(process_word)print('成功生成词云...')image=Words_Cloud.to_image()plt.imshow(image) # 显示图片plt.axis('off') # 不显示坐标轴plt.savefig('barrages_cloud.jpg')plt.show()print('数据开始导入Excel中')save_to_excel(room_name, barrage_list)print('导入成功,保存在桌面')print(words)logout()# 过滤函数:清洗数据,删除不必要的符号。
def filterword(filterdata):symbol = ',。“”~!@#¥%……&*()——+=【】{}、|;:‘’《》?!#$^&()[]{};:",.<>/?\\-\n'for sym in symbol:filterdata = filterdata.replace(sym, '')filterdata = filterdata.strip(' ')return filterdatadef keeplive():'''保持心跳,45秒心跳请求一次'''while True:#msg = 'type@=keeplive/tick@=' + str(int(time.time())) + '/\0'msg = "type@=mrkl/"send_req_msg(msg)print('发送心跳包')time.sleep(45)def logout():'''与斗鱼服务器断开连接关闭线程'''msg = 'type@=logout/'send_req_msg(msg)print('已经退出服务器')def signal_handler(signal, frame):'''捕捉 ctrl+c的信号 即 signal.SIGINT触发hander:登出斗鱼服务器关闭进程'''p.terminate()logout()print('Bye')#保存直播间信息
def save_to_excel2(zhibo):wb = Workbook()ws = wb.activews.append(['主播','房间号','房间名','热度'])for i in zhibo:try:ws.append(i)except:print('第%条信息保存失败!'%i)wb.save(r'直播间信息' + '.xlsx')print('写入成功!')#爬取英雄联盟直播间信息
def catch(): urls = ['https://www.douyu.com/gapi/rkc/directory/mixList/2_1/{}'.format(page) for page in range(1,3)]zhibo=[]for url in urls:res = requests.get(url)j = json.loads(res.text) #将已编码的 JSON 字符串解码为 Python 对象l1 = j['data']     # 通过观察可以发现要的数据在data下l2 = l1['rl']     #在观察发现在data的rl中for i in range(len(l2)):   # 这里用到for循环来处理一个列表下多个字典的数据Anchor = l2[i]['nn']              # 获取主播名字RoomNumber = l2[i]['rid']         # 获取房间号Heat = l2[i]['ol']                # 获取热度RoomName = l2[i]['rn']            # 获取房间名zhibo.append([Anchor,RoomNumber,RoomName,int(Heat)])zhibo=sorted(zhibo,key=lambda x:x[3]) #按热度高的排序zhibo.reverse()save_to_excel2(zhibo)#输出热度前10名直播间信息tplt =  '{0:{4}<10}\t{1:{4}<7}\t{2:{4}^15}\t{3:{4}<8}'print(tplt.format('主播', '房间号', '房间名', '热度', chr(12288)))for j in zhibo[:10]:print(tplt.format(j[0], str(j[1]), j[2], str(j[3]), chr(12288)))return zhiboif __name__ == '__main__':zhibo=catch()room_id = input('请输入房间ID:')barrage_num = input('请输入需要的弹幕数量:')barrage_num = int(barrage_num)# 开启signal捕捉signal.signal(signal.SIGINT, signal_handler)DM_start(room_id,barrage_num)# 开启弹幕和心跳进程p = multiprocessing.Process(target=keeplive)p.start()

运行结果如图所示:

利用斗鱼api学习爬取斗鱼直播间信息相关推荐

  1. python爬斗鱼直播_Python爬虫:利用API实时爬取斗鱼弹幕

    原标题:Python爬虫:利用API实时爬取斗鱼弹幕 这些天一直想做一个斗鱼爬取弹幕,但是一直考试时间不够,而且这个斗鱼的api接口虽然开放了但是我在github上没有找到可以完美实现连接.我看了好多 ...

  2. jsoup爬取虎牙直播的信息

    jsoup爬取虎牙直播的信息,实时得到主播名字,直播间链接,推荐位,标题,人气的数据 主要代码如下: package main;import java.util.ArrayList;import or ...

  3. 【爬虫实战】python爬取虎牙直播间封面美女图片

    Python爬虫爬取虎牙直播间封面美女图片 本文目录 Python爬虫爬取虎牙直播间封面美女图片 写作缘起 上代码 效果展示 思路分析 写作缘起 这篇文章主要是介绍如何使用python爬虫来爬取虎牙直 ...

  4. python斗鱼抽奖_python3爬取斗鱼某些版块的主播人气

    python 3爬取斗鱼某些版块的主播人气 1.爬虫版块 import Test3 import urllib.request from bs4 import BeautifulSoup import ...

  5. python3 [爬虫入门实战]爬取熊猫直播用户信息

    爬取国内各大直播平台直播信息是以后要做的一个功课,还必须是做成一个系列的,可能远没有其他大神那么厉害,毕竟自己经历过的就是有用的,在此做个记录一下 首先我们需要爬取的内容: 这里我们要爬取的有 直播房 ...

  6. 利用CnkiSpider包快速爬取知网文献信息

    CnkiSpider使用指南(by@zemengchuan) GitHub链接:https://github.com/zemengchuan/CnkiSpider 用途: CnkiSpider可以通过 ...

  7. python爬取斗鱼_python selenium爬取斗鱼所有直播房间信息过程详解

    还是分析一下大体的流程: 首先还是Chrome浏览器抓包分析元素,这是网址:https://www.douyu.com/directory/all 发现所有房间的信息都是保存在一个无序列表中的li中, ...

  8. 利用Python爬虫爬取斗鱼直播间信息,以及直播的实际人数!

    首先我准备利用mysql来存储我爬取的信息,建一个host表如下: 然后下载pymysql ,利用它与数据库链接,因为在这里我只涉及到写入的操作: Unit_Mtsql 然后就是使用Beautiful ...

  9. 使用selenium自动爬取斗鱼直播平台的所有房间信息

    使用selenium自动爬取斗鱼直播平台的所有房间信息 文章目录 使用selenium自动爬取斗鱼直播平台的所有房间信息 使用selenium实现动态页面模拟点击 什么是selenium? selen ...

最新文章

  1. 如何在Hadoop上编写MapReduce程序
  2. 2017计算机发展,【2017年整理】计算机发展的四个阶段.doc
  3. EAS BOS 发布
  4. 【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序
  5. 如何像阿里巴巴一样高效跨企业项目协作
  6. java 标志一个方法为过时方法
  7. 单片机和微型计算机硬件组成的异同,嵌入式和单片机的区别是什么?两者有什么联系...
  8. 用递归方法求一个list的最大值
  9. javascript 操作服务器 文件,使用javascript读取服务器文件
  10. 基于STM32的小说阅读器
  11. EAN13条形码生成器
  12. 为什么比同龄人显老?原来基因变异在作怪
  13. 华三交换机怎么样?H3C交换机产品系列介绍!
  14. 墨天轮沙龙 | 麦杰科技卢学东:openPlant 实时数据库系统及应用
  15. 沈阳大学博客网站的设计与实现
  16. 2019年西工大附中分校民办小升初电脑随机派位录取结果
  17. Introduction to Fabric.js. Part 3(介绍Fabric.js第三部分)
  18. 飞蛾逐月优化算法(Matlab实现)
  19. 抖音四神xa,xl,xg,xt - 22.5版本
  20. TI CC1310 sub1G的SDK开发之唯一识别号MAC地址读取

热门文章

  1. 应用WSDK-实现和使用DIME的Web Services(下)
  2. SpringBoot在线考试系统
  3. php x20,贝加莱(BR)X20系列新亮点
  4. 影像篡改与识别(一):胶片时代
  5. 红蓝对抗-2022年蓝队初级护网测试总结
  6. python自动化:实现自动回复QQ消息
  7. 谷歌浏览器查看HTTP请求头与响应头
  8. MySQL 关键字和保留字汇总(MySQL 8.0)
  9. 大话西游2服务器维护,《大话西游2》4月2日维护公告
  10. UNI-APP/VUE 项目集成 微信SDK /微信开放标签 教程和避坑指南(下)——微信开放标签篇