每日学习总结2

1.python数据获取爬虫相关

b站弹幕格式:

数据所在位置:api.bilibili.com/x/v1/dm/list.so?oid=7633504

弹幕xml文件解析
获取的弹幕xml格式如下:


<d p="533.67199707031,1,25,41194,1498943949,0,7edeebe9,3511616609">刀还是没有枪快</d>
<d p="4698.16100,1,25,16777215,1664710281,0,6e4de550,1154432524785869568,10">如果我们能活着出去,万水千山,你愿意陪我一起看吗?</d>
p这个字段里面的内容: 
0,1,25,16777215,1312863760,0,eff85771,42759017中几个逗号分割的数据 
第一个参数是弹幕出现的时间以秒数为单位。 
第二个参数是弹幕的模式1..3 滚动弹幕 4底端弹幕 5顶端弹幕 6.逆向弹幕 7精准定位 8高级弹幕 
第三个参数是字号, 12非常小,16特小,18小,25中,36大,45很大,64特别大 
第四个参数是字体的颜色以HTML颜色的十进制为准 
第五个参数是Unix格式的时间戳。基准时间为 1970-1-1 08:00:00 
第六个参数是弹幕池 0普通池 1字幕池 2特殊池【目前特殊池为高级弹幕专用】 
第七个参数是发送者的ID,用于“屏蔽此弹幕的发送者”功能 
第八个参数是弹幕在弹幕数据库中rowID 用于“历史弹幕”功能。 作者:有陆个硬币不知道干啥 https://www.bilibili.com/read/cv6997749/ 出处:bilibili

 

第一部分:获取数据

def get_barrage():
    url = "https://api.bilibili.com/x/v1/dm/list.so?oid=7633504"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    response = requests.get(url=url, headers=headers)
    # print(response.encoding)
    # response.encoding = 'utf-8'
    # response_xml = response.content.decode('utf-8')

    barrage_all = []
    # pattern = re.compile('<d.*?>(.*?)</d>')
    #
    # global barrage_list
    # barrage_list = pattern.findall(response_xml)
    # print(barrage_list)

    html = response.text
    soup = BeautifulSoup(html,'html.parser')
    for target in soup.find_all('d'):
        value = target.get('p').split(',')
        barrage_all.append({'时间': value[0], '弹幕模式': value[1], '弹幕字号': value[2],
                            '弹幕颜色': value[3], '时间戳': value[4],'弹幕池': value[5],
                            '发送者ID': value[6], '历史弹幕': value[7]}
                           )
    return barrage_all


if __name__ == "__main__":
    barrage_all = get_barrage()
    with open('./barrage.json','w') as fp:
        json.dump(barrage_all,fp=fp,ensure_ascii=False,indent=4)
  

第二部分:数据展示

from datetime import datetime
from get_comments import get_barrage
import pandas as pd


def data_processing(barrage_df):
    barrage_time = (barrage_df['时间'].astype(float).astype(int))
    time_list = []
    for a_time in barrage_time:
        m, s = divmod(a_time, 60)
        h, m = divmod(m, 60)
        a_time = str(h) + ':' + str(m) + ':' + str(s)
        time_list.append(a_time)

    barrage_df['时间'] = time_list

    barrage_type = barrage_df['弹幕模式'].astype(int)
    areas = [0, 3, 4, 5, 6, 7, 8]
    pattern = ['滚动弹幕', '底端弹幕', '顶端弹幕', '逆向弹幕', '精准定位', '高级弹幕']
    barrage_df['弹幕模式'] = pd.cut(barrage_type, areas, right=True, labels=pattern)

    barrage_tool = barrage_df['弹幕池'].astype(int)
    areas = [-1, 0, 1, 2]
    pattern = ['普通池','字幕池', '特殊池']
    barrage_df['弹幕池'] = pd.cut(barrage_tool, areas, right=True, labels=pattern)

    barrage_timestamp = barrage_df['时间戳'].astype(int)
    timestamp_list = []
    for timestamp in barrage_timestamp:
        timestamp_list.append(datetime.fromtimestamp(timestamp))
    barrage_df['时间戳'] = timestamp_list

    barrage_df.to_csv('./狐妖小红娘王权总集弹幕.csv',encoding='utf_8_sig')


if __name__ == "__main__":
    barrage_df = pd.DataFrame(get_barrage())
    data_processing(barrage_df)

  

 

 

参考:1.爬取国产动漫视频弹幕数据分析 - 大数据黄坤 - 博客园 (cnblogs.com)

  2.python爬虫之Beautifulsoup模块用法详解 - 知乎 (zhihu.com)

  3.数据分箱之pd.cut() - 知乎 (zhihu.com)

  4.样式美化matplotlib.pyplot.style.use定制画布风格 - 知乎 (zhihu.com)

 tips:

 
import re
 
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456') #在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
result2 = pattern.findall('run88oob123google456', 0, 10)

  

 

posted @ 2023-07-31 13:42  ChouchouYa  阅读(31)  评论(0)    收藏  举报