def get_video_list(uid, s=10): """获取UP主视频列表""" # 视频aid号列表 aid_list1 = [] url = "http://space.bilibili.com/ajax/member/getSubmitVideos?mid=" + \ str(uid) + "&pagesize=" + str(s) + "&page=1" res = get_url(url, "1") #获取url内容 match1 = re.findall(r'"aid":[0-9]\d+', res) # print(match1) match2 = re.findall(r'[0-9]\d+', str(match1)) print(match2) with open('{}/{}的视频列表.json'.format(date(), uid), 'a', encoding="utf-8") as json_file: for i in match2: aid_list1.append(int(i)) json.dump(aid_list1, json_file, ensure_ascii=False)
def leaderboard(): ''' 爬取B站现在各个分区的日排行、三日排行、周排行、月排行 ''' os.chdir("./数据/排行榜") # 切换工作目录 """ VC code 的相对目录和其他IDE有不同,貌似是工作区的原因 VC code的./是打开的主文件夹的下的路径 PyCharm,IELD以运行文件的文件夹的路径为./ 如果要在PyCharm,IELD下调试需要把部分./改为../ """ j = 0 # 统计循环次数,用于显示爬取进程 save_path = date() # 爬取结果的文件保存目录 # 各项数据存储列表 aid_list = [] coins_list = [] play_list = [] pts_list = [] title_list = [] uid_list = [] date_type = ['aid', 'coins', 'play', 'pts', 'title', 'uid'] """ date_type 相关值说明 aid:视频代号 coins:视频受到的硬币数 (硬币是B站用户每日登录时获得的一种虚拟物品,每日每人一个,对一个稿件每人最多投两个硬币,反映对视频的喜爱程度) paly:视频播放数 pts:B站按一定公式计算出是综合得分 title:视频标题 """ # 如果文件名称重复则将旧文件夹重命名以尾部加0开始依次递推,防止文件夹重复 if os.path.exists(save_path): try: os.rename(save_path, save_path + "0") except FileExistsError: i = 0 while os.path.exists(save_path + str(i)): i = i + 1 continue os.rename(save_path, save_path + str(i)) os.makedirs(save_path + '\\' + '结果展示') # 循环创建子目录 for fl in date_type: os.makedirs(save_path + '\\' + str(fl)) # B站不同分区字典,对应url的rid=值 area_dict = { "全站": 0, "动画": 1, "国创相关": 168, "音乐": 3, "舞蹈": 129, "游戏": 4, "科技": 36, "数码": 188, "生活": 160, "鬼畜": 119, "时尚": 155, "娱乐": 5, "影视": 181 } # 排行榜时间范围字典,对应url的day=值 day_dict = {"日排行": 1, "三日排行": 3, "周排行": 7, "月排行": 30} # for循环将分区字典的值分次分别写入到k1和v for k1, v in area_dict.items(): # items()返回字典中所有的一一对应的值 # for循环排行时间字典 for k2, d in day_dict.items(): # B站排行榜API的url 修改rid=可以改变分区,修改day=可以改变排行榜时间范围 url = "https://api.bilibili.com/x/web-interface/ranking?rid={}&day={}".format( v, d) res = get_url(url, "json") # 输出类型为json的对象,json是一种轻量级的数据交换格式 # 必要时检查res是否有错误 # print(json.dumps(res, indent=2)) # break # 也可以采用正则表达式进行数据匹配,例如下面 # res = get_url(url,'text') # aid = re.findall(r'"aid":"\d+",',res) # 但受到网友启发,发现像这种api保存到python中正好是字典类型 # 通过处理,相较于正则表达式有着更好的一条条数据对应起来 # 在逻辑有上更条理 # 并且在爬取其他类似api接口时可以适当修改使用 # 详见function/deal_fuc.py的get_value函数 rank_list = get_value(res, "list") for i in range(len(rank_list)): aid0 = get_value(rank_list[i], "aid") # 视频aid author0 = get_value(rank_list[i], "author") # up主 coins0 = get_value(rank_list[i], "coins") # 投币数 play0 = get_value(rank_list[i], "play") # 播放数 pts0 = get_value(rank_list[i], "pts") # 综合得分 title0 = get_value(rank_list[i], "title") # 视频标题 uid0 = get_value(rank_list[i], "mid") # UP主代号 # 将数据保存为列表 aid_list.append(int(aid0)) coins_list.append(int(coins0)) play_list.append(int(play0)) pts_list.append(int(pts0)) title_list.append(title0) uid_list.append(int(uid0)) for k3 in date_type: with open("{}/{}/BiliBili-{}-{}-{}.json".format( save_path, k3, k1, k2, k3), "w", encoding="utf-8") as json_file: json.dump(eval("{}_list".format(k3)), json_file, ensure_ascii=False) # eval()将字符串str当成有效的表达式来求值并返回计算结果 json_file.close() # 将数据保存为txt文件 with open("{}/结果展示/BiliBili-{}-{}.txt".format( save_path, k1, k2), "a", encoding="utf-8") as data_file: data_file.write("排名: {}\n".format(i + 1)) data_file.write("投币数: {}\n".format(coins0)) data_file.write("播放数: {}\n".format(play0)) data_file.write("视频aid: {}\n".format(aid0)) data_file.write("综合得分: {}\n".format(pts0)) data_file.write("UP主: {}\n".format(author0)) data_file.write("视频标题: {}\n".format(title0)) data_file.write("*" * 70 + "\n") data_file.close() # 显示打印进程 j = j + 1 # print(j) print_info(j) # 一次循环后清空列表 aid_list = [] coins_list = [] play_list = [] pts_list = [] title_list = []
import sys from functions.date_fuc import date from functions.get_url_fuc import get_url danmu_list = [] cid_list = [] j = 0 # cid = 93489702 try: os.chdir("./数据/视频弹幕") except: os.makedirs("./数据/视频弹幕") os.chdir("./数据/视频弹幕") save_path = date() if not os.path.exists(save_path): os.makedirs(save_path) with open("../排行榜/{}/BiliBili-{}-{}-cid.json".format(date(), "全站", "日排行"), 'r', encoding='utf-8') as f2: cid_list = json.load(f2) print(cid_list) f2.close() for cid in cid_list: url = "http://comment.bilibili.com/{}.xml".format(cid) # 备用api接口 # url = "https://api.bilibili.com/x/v1/dm/list.so?oid={}".format(cid)
aid:视频代号 爬取得到: cid:视频弹幕代号(之后爬取弹幕用) 关注点: aid_change()函数 """ import json import os from functions.date_fuc import date from functions.get_url_fuc import aid_change save_path = date() os.chdir("../数据/排行榜") # 切换工作目录 if not os.path.exists(save_path): os.makedirs(save_path) # print(os.getcwd())uid:视频投稿者代号 area_dict = { "全站": 0, "动画": 1, "国创相关": 168, "音乐": 3, "舞蹈": 129, "游戏": 4, "科技": 36, "数码": 188, "生活": 160,
""" import json import os import re from functions.date_fuc import date from functions.get_url_fuc import get_url try: os.chdir("./数据/UP主视频") except: os.makedirs("./数据/UP主视频") os.chdir("./数据/UP主视频") save_path = date() if not os.path.exists(save_path): os.makedirs(save_path) # 获取指定UP的所有视频的aid号 uid:UP主代号 s:视频数量 def get_video_list(uid, s=10): """获取UP主视频列表""" # 视频aid号列表 aid_list1 = [] url = "http://space.bilibili.com/ajax/member/getSubmitVideos?mid=" + \ str(uid) + "&pagesize=" + str(s) + "&page=1" res = get_url(url, "1") #获取url内容 match1 = re.findall(r'"aid":[0-9]\d+', res) # print(match1)