每日学习总结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)

浙公网安备 33010602011771号