python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)

爬取平台:芒果TV
爬取内容:《乘风破浪的姐姐》弹幕数据(以前6期为例)
爬取工具:Anaconda3 Spyder
爬取日期:2020年7月1日

打开节目网页,通过开发者工具Network中的XHR我们可以发现,随着节目的播放,每隔一分钟XHR中会新增一个json文件。
python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)_第1张图片
查看json文件,可以发现每个json文件都存储着前一分钟内所有的弹幕数据,主要包括用户名、弹幕内容、点赞数等,因此,节目时长(min)=json文件数。

在本次实验中,主要爬取用户id、用户名uname、弹幕内容content、发布时间time、弹幕点赞数v2_up_count。
python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)_第2张图片
在Headers中可以获取每个json文件的url(图是7.14补的,所以和代码里的url有差异,问题不大),发现同一期节目json文件的url日期后两个数字是一样的,可以通过这两个数字定位到节目的某一集。
python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)_第3张图片python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)_第4张图片
找到url的规律后开始写代码。
首先导入requests库、json库、pandas库。

import requests
import json
import pandas as pd

构建get_danmu(num1,num2,page)函数,其中num1、num2为url日期后的两个数字,page是json文件后缀前的数字(即节目分钟数)。

代码中用到的函数:
format():格式化输出,即将format()后面的内容,填入大括号中(可以按位置,可以按变量)
requests.get():向指定的资源发出请求
res.text:获取文本信息(否则只返回HTTP状态码)
json.loads():将json格式数据(字符串)转换为字典

#提取某一期的弹幕
def get_danmu(num1,num2,page):
    try:
        url='https://bullet-ws.hitv.com/bullet/2020/07/1/{}/{}/{}.json'
        danmuurl = url.format(num1,num2,page)
        res=requests.get(danmuurl)
        res.encoding = 'utf-8'
        jd=json.loads(res.text)
    except:
        print("无法连接")
    
    details=[]
    for i in range(len(jd['data']['items'])): #弹幕数据在json文件'data'的'items'中
        result={}
        result['stype']=num2 #通过stype可识别期数
        result['id']=jd['data']['items'][i]['id'] #获取id
        
        try: #尝试获取uname
            result['uname']=jd['data']['items'][i]['uname']
        except:
            result['uname']=''
            
        result['content']=jd['data']['items'][i]['content'] #获取弹幕内容
        result['time']=jd['data']['items'][i]['time'] #获取弹幕发布时间
        
        try: #尝试获取弹幕点赞数
            result['v2_up_count']=jd['data']['items'][i]['v2_up_count']
        except:
            result['v2_up_count']=''
        details.append(result)
    
    return details

设置输入关键信息的代码(也可以自己新建一个list写循环)

#输入关键信息
def count_danmu():
    danmu_total=[]
    num1=input('第一个数字')
    num2=input('第二个数字')
    page=int(input('输入总时长'))
    for i in range(page):
        danmu_total.extend(get_danmu(num1,num2,i))
        
    return danmu_total

设置需要循环爬取的次数

def main():
    danmu_end=[]
    
    #爬前六集,设置循环6次
    for j in range(6):
        danmu_end.extend(count_danmu())
    df=pd.DataFrame(danmu_end)
    df.to_excel('test\data\danmu.xlsx')

if __name__ == '__main__':
    main()

运行后即可获得danmu.xlsx文件。
截止至7月1日17:00,共爬取弹幕201,633条,其中:
第一期(上)36,043条,第一期(下)48,022条;
第二期35,822条,第二期(加更版)12,299条;
第三期57,479条,第三期(加更版)11,968条。
python爬取芒果TV《乘风破浪的姐姐》弹幕数据(已完成)_第5张图片
本次实验参考https://blog.csdn.net/bo_gu/article/details/106947576,并在此基础上进行了更详细的解说,感谢这位博主。

你可能感兴趣的:(python,python)