早就对斗鱼等直播平台的观看人数好奇,今天进来爬取以下斗鱼到底有多少人观看,目前是新冠状病毒时期,看直播的人数应该不会太少,也希望各位保护好自己和自己的家人,祝身体健康。话不多说直接上过程:
第一步构想 使用xpath获取信息
打开谷歌,进入到斗鱼TV的直播页面
F12 调处谷歌检查窗口,右击页面查看网页源代码,搜索页面中的关键字,如搜索,脑力直播间(图片没显示全),结果如下:
代表是可以通过xpath进行提取数据的。
这里我们使用第二种方式进行爬取,抓包
点击NetWork窗口,进行抓包,当我们选择第二页时,发现数据包
抓取到请求:
发现正好是我们需要用到的数据,请求如下
那么第一页的数据是不是将后面的2改成1就行了啊,意境尝试,果然如此,如此一来就简单了。下面直接贴出我所有代码,供大家参考。如对xpath提取有兴趣可留言,我到时候再进行补充。
from pprint import pprint
import requests
import json
import time
from openpyxl import Workbook
# 要求 保存每个直播间的房间号 标题 直播类别 主播 观看人数等信息至Excel表格 最后打印出 在斗鱼直播中 在线观看总人数
class DouYuInfo():
ol_person = 0 # 在线观看人数
page = 1 # 当前页
def __init__(self):
self.wb = Workbook()
self.ws = self.wb.active
self.ws["A1"] = "主播"
self.ws["B1"] = "标题"
self.ws["C1"] = "房间号"
self.ws["D1"] = "直播类别"
self.ws["E1"] = "观看人数"
self.ws["F1"] = "观看链接"
self.ws["G1"] = "主播头像"
self.headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
}
self.douyu_url = "https://www.douyu.com/gapi/rkc/directory/0_0/{}"
def get_response(self):
"""获取响应"""
res = requests.get(self.douyu_url.format(DouYuInfo.page), headers=self.headers)
if res.status_code == 200:
content = res.content.decode()
return content
else:
print("数据已经请求完毕")
return
def get_room_list(self,content):
"""获取房间号信息"""
data = json.loads(content)
room_list = data["data"]["rl"]
return room_list
def save_msg(self,room_list):
for room in room_list:
print("正在保存信息:")
pprint(room)
self.ws.append(
[room["nn"], room["rn"], room["rid"], room["c2name"], room["ol"], "https://www.douyu.com" + room["url"],
room["rs16"][:-4:]])
DouYuInfo.ol_person += int(room["ol"])
def run_rever(self):
while True:
con = self.get_response()
room_list = self.get_room_list(con)
self.save_msg(room_list)
DouYuInfo.page += 1
print("总人数:%s" % DouYuInfo.ol_person)
self.wb.save("斗鱼直播信息.xlsx")
time.sleep(1)
def __del__(self):
print("总人数:%s"%DouYuInfo.ol_person)
self.wb.save("斗鱼直播信息.xlsx")
if __name__ == '__main__':
douyu = DouYuInfo()
douyu.run_rever()
最后数据我没有爬取完,因为到后面一些小主播基本没人看,人数基本没啥增加,总结果为:
总共只爬取了一万多条信息: