python爬⾍B站每周热榜
⼀、选题的背景
为什么要选择此选题?要达到的数据分析的预期⽬标是什么?(10 分)
从社会、经济、技术、数据来源等⽅⾯进⾏描述(200 字以内)
在现今短视频洪流的影响下,拥有众多年轻⼈所钟爱的b站⽆疑是⾮常具有发展前景的,B站平均年龄21岁,新注册⽤户不到20岁,⽽且12个⽉80%以上会留下来,这个留存率是特别惊⼈的,这代表未来社会的中流砥柱以及现在社会上的主⼒的三⼗岁以下的年轻⼈都在B站或者说都在⾼速涌⼊B站并且来了就不⾛了。上⼀个这样的数据还是在QQ,腾讯帝国的根基正是始于此,⽽抓住了年轻⼈的b站在我看来是会有⼀个不错的未来的。在学习完⽹络爬⾍等章节后,以及某天在b站看到爬取⾖瓣top250的视频,我不由得想到爬取B站每周热榜。
⼆、主题式⺴络爬⾍设计⽅案
1.主题式⽹络爬⾍名称
2.主题式⽹络爬⾍爬取的内容与数据特征分析
3.主题式⽹络爬⾍设计⽅案概述(包括实现思路与技术难点)
1. 基于B站每周必看从第1期到140期的数据爬取
该⽹页链接只是第141期的每周必看的页⾯。然后开始检查⽹页的数据是存在于HTML⾥⾯是通过JSON的⽅式获取的。
2. 爬取的主要是B站每周的必看排⾏榜,爬⾍内容基于异步加载,数据以json的格式返回,⽐起将js放在head中,默认⽅式是同步加载,这样更为简洁和⽅便。
3. 数据不直接从⽹页获得,⽽是通过异步加载获得。
(1)    思路:模仿异步请求⽅式获取接⼝数据
(2)    难点:json数据结构,数据持久化,追加excel
三、主题⻚⾯的结构特征分析
1.主题页⾯的结构与特征分析
2.Htmls 页⾯解析
3.节点(标签)查⽅法与遍历⽅法(必要时画出节点树结构)
1. 页⾯的格式类似 ul 和li标签的格式但是数据没在其中
2. 不进⾏html⽹页的解析,⽽是对接⼝数据进⾏json提取。
3. 获取到json中的list然后循环获取到指定的数据如:up主id,播放量等信息。
详细页⾯分析:
1.打开源码
2.复制数据
3. 检查HTML源码是否存在数据:
由此我们可以得出⽹页的数据来源并没有镶嵌在HTML中。所以应该存在JSON当中,接下来就是查看json数据来源
1. 打开开发者模式操作如图或则F12
2.进⼊network
3.刷新页⾯获取到JSON数据的数据链接:(通过刚才复制的内容到JSON所在的位置)
4. 获取链接并进⾏数据爬取:
(1)JSON数据预览。
(2)获取请求链接以及请求时的headers模拟浏览器访问服务器。
(3)    参数设置(从图中可以得到,我们只需要修改其中的number就可以改变我们想要每周的数据了)URL JSON
Headers
{达梦update语句实例
"accept": "application/json, text/plain, */*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7",
"cache-control": "no-cache",
"cookie": "buvid3=2689D680-DEA5-4931-F5A5-936A858E0A4818066infoc;
blackside_state=1; fingerprint=307d2df668b86c9b801f9011702c0d18;html设置字体颜渐变
buvid_fp=2689D680-DEA5-4931-F5A5-936A858E0A4818066infoc;
buvid_fp_plain=2689D680-DEA5-4931-F5A5-936A858E0A4818066infoc;
SESSDATA=a9a08d06%2C1647702446%2C6703b%2A91;
bili_jct=af2e618bad59c5549d3244e6147d4a47; DedeUserID=149746646;
DedeUserID__ckMd5=94ffcc3be97f858f; sid=7o9phjau; rpdid=|
(u~)llJJmuk0J'uYJkul|R~m; LIVE_BUVID=AUTO7316362940569687;
_uuid=DFE7584C-1FFE-4B31-DCCC-6D33292BAEFD15306infoc;
video_page_version=v_old_home;
bp_video_offset_149746646=602899376982656364;
bp_t_offset_149746646=605905738122554029; CURRENT_QUALITY=0; i-
wanna-go-back=-1; b_ut=5; CURRENT_BLACKGAP=0;
CURRENT_FNVAL=2000; innersign=0",
"origin": "www.bilibili",
"pragma": "no-cache",
"referer": "www.bilibili/",
"sec-ch-ua": "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"96\", \"Google
Chrome\";v=\"96\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110
Safari/537.36"
}
四、⽹络爬⾍程序设计
爬⾍程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后⾯提供输出结果的截图。
1.数据爬取与采集
1import requests
2import pandas as pd
3from requests_html import HTMLSession
4 session = HTMLSession() # ⾃带了user-agent
5def get_data():
6"""
7    get_data函数是⽤于爬取B站每周必看的视屏数据信息
8"""
9for i in range(1, 142):
10        res = (
11# 该数据并不在⽹页上,⽽是通过异步加载的⽅式获取的数据
12# 然后我们通过访问接⼝活得json数据
13            url="api.bilibili/x/web-interface/popular/series/one?number={}".format(i)
14        )
15        all_data = []
16# 查看是否爬取成功
17print(i, res.status_code, "数据获取成功!")
18# 获取接⼝返回的数据
19        js = res.json()
20# 读取json⽂件的每个视频信息并存放到⼀个列表⾥⾯,⽤于后期的持久化
21        week = i
22        videos = js["data"]["list"]
23for rank, video in enumerate(videos):
汇编语言实例经典
24            all_data.append(
25                [
26                    week,
27                    rank + 1,
28                    video["aid"],
29                    video["tname"],
30                    video["title"],
31                    video["pubdate"],
32                    video["owner"]["mid"],
33                    video["owner"]["name"],
34                    video["owner"]["face"],
35                    video["pic"],
36                    video["stat"]["view"],
37                    video["stat"]["danmaku"],
38                    video["stat"]["reply"],
39                    video["stat"]["favorite"],
40                    video["stat"]["coin"],
41                    video["stat"]["share"],
42                    video["stat"]["like"],
ht怎么转换成视频播放43                    video["short_link"],
44                    video["bvid"],
45                    video["rcmd_reason"],
46                ]
47            )
48#        print(all_data)
49
50        src_data = pd.read_excel("hot_week.xlsx")
51
52        data = pd.DataFrame(all_data,
53                            columns=["week", "rank", "aid", "tname", "title", "pubdate", "owner_mid", "owner_name",
54"owner_face", "pic", "view", "danmaku", "reply", "favorite", "coin",
55"share", "like", "link", "bvid", "rcmd_reason"])
56
57        pd.DataFrame(src_data).append(data).to_excel("hot_week.xlsx", index=False)
开始数据爬取
# 初始化excel表格⽤于数据存放
# pd.DataFrame([], columns=["week", "rank","aid", "tname", "title", "pubdate", "owner_mid", "owner_name",
#                              "owner_face", "pic", "view", "danmaku", "reply", "favorite", "coin",
#                              "share", "like", "link", "bvid", "rcmd_reason"]).to_excel("hot_week.xlsx", index=False)
# 调⽤爬⾍⽅法
# get_data()
2.对数据进⾏清洗和处理
读取数据
1 data = pd.read_excel("./hot_week.xlsx")
2 data
查看数据的columns
有以下步骤:
1.获取columns
2.得到需要处理和分析的column name
3.获得新的DataFrame
lumns
1 need_columns = ['week','tname', 'title', 'owner_name','view', 'danmaku', 'reply','favorite', 'coin', 'share', 'like']
2 need_data = pd.DataFrame(data, columns=need_columns)
3 need_data
need_data.clip()
1# need_data.plot.scatter()
2 pd.DataFrame(need_data, columns=["view", "like"]).plot.scatter(x=["view"], y=["like"])
3.⽂本分析(可选):jieba 分词、wordcloud 的分词可视化
以下是思路
(1)将所有的标题进⾏分词统计查看140周中标题中最热的词是那些,并使⽤pyecharts制作词云。(2)统计tname也即是视频类型的分布情况,使⽤柱状图进⾏分析。
(3)⽤折线图来分析从第⼀周到140周热门每周必看视频的增加情况。
⽤到收集⼯具collections和绘图⼯具pyecharts
1from collections import Counter # ⽤作词频统计
2import jieba
3from pyecharts import options as opts
4from pyecharts.charts import WordCloud
5 titles = need_data.loc[:, "title"]
6 titles
1def my_counter(words):
2    counter = {}
3for word in words:
(word) is None:
5            counter[word] = 1
6else:
7            counter[word] += 1
8return counter
1 titles = need_data.loc[:, "title"]
2 titles
1 words = jieba.lcut("".join(titles))
2 words[:10]
1 word_counter = Counter(words)
2 word_counter
从上⾯可以得出我们的分词效果有很多不好的,所以这样分词是不好的,所以我们选择下⾯的⽅式进⾏1# 导⼊jieba中的的tag抽取包
2from jieba import analysejava数组拼接
3 word_data = []
4for title in titles:
5    word_list = act_tags(title)
6    word_data += word_list
7 new_word_counter = Counter(word_data)
可以看出得出来⽐较好的效果,不⽤⼈为的去定义要少了那些停⽤词
接下来就是词云可视化
1from wordcloud import WordCloud
2 font = r'C:\Windows\Fonts\STCAIYUN.TTF'#字体路径
3
4# 关键⼀步
5 my_wordcloud = WordCloud(scale=4,font_path=font,background_color='white',
6                          max_words = 100,max_font_size = 60,random_state=40).generate("".join(word_data))
7
8
9#显⽰⽣成的词云
10 plt.figure(figsize=[15, 10])
python请求并解析json数据11 plt.imshow(my_wordcloud)
12 plt.axis("off")
13 plt.show()
4.数据分析与可视化(例如:数据柱形图、直⽅图、散点图、盒图、分布图)
柱状图分析视频类型分布
1 types = need_data.loc[:, "tname"]
2 types[:10]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。