Python爬虫——b站分区分类标题+词云图

通过 Python requests 库向b站的 API 请求获取某分区分类下的 n 页视频,取标题生成词云。这种获取方式不需要获取 html 页面,不需要 bs 库。请求的结果直接就是 json 格式,方便操作

获取分区url
  • 以游戏区单机游戏为例:
    单机游戏分类
  • 进入单机游戏分类,F12 或右键检查,进入调速界面如上,点击网络(Network),下面就是一堆请求,在其中找到 newlist 字样,点击请求,右边的标头(header)下面的 url 即为我们需要爬取的请求。
  • 会发现每次点击不同分类都会有一个这样的请求,对比发现只有 rid 是不一样的,这代表不同分类的 rid 值不相同。想要爬取任意区的分类只要像这样获取其 rid 即可。ps 是指每次请求会给你的视频条数,这里一次请求就有 30 个视频给到你。pn 是当前请求的页数,如果想要获取多页只要更改这个值即可。type 按理说应该是推送的类型,可能0是视频,1是文章可能,但是这里不纠结这个。
爬虫代码
import requests
import json
import time

# 设置请求头,模拟浏览器请求
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
}
# 游戏区单机游戏分类
url = 'https://api.bilibili.com/x/web-interface/newlist?rid=17&type=1&ps=30&pn={}'
# 存储视频标题和链接的列表
data = []
# 爬取前n页的视频信息
for i in range(1, 51):
    # 构造完整的API接口url
    api_url = url.format(i)
    # 发送请求,获取json数据
    response = requests.get(api_url, headers=headers)
    json_data = json.loads(response.text)
    # 获取视频列表
    video_list = json_data['data']['archives']
    # 遍历视频列表,提取标题和链接,并存储到data列表中
    for video in video_list:
        title = video['title']
        print(title)
        link = 'https://www.bilibili.com/video/' + video['bvid']
        # data.append({'title': title, 'link': link})
        data.append(title)
    print(f"---------------{i}----------------")
    time.sleep(0.2)

# 将列表写入json文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False)
  • response直接获取了json数据,进行解析获取标题和链接(这个用不到),具体探索步骤就是打印json_data观察其数据结构逐步获取即可。
  • url 的 pn 处以 format 格式输入页码,可以获取多页数据
  • 我们爬取50页,在控制台输出,并进行分割以方便看页码。
    控制台输出
  • 在同级文件夹也获得了 data.json
词云生成
"""
功能:根据stopwords_cn.txt的过滤对data.json产生词云
"""
from collections import Counter
from wordcloud import WordCloud
import itertools
import jieba
import jieba.posseg
import json
stopwords = set(open("stopwords_cn.txt", encoding="utf-8").read().splitlines())
# Enable the deep learning based model for word cutting.
jieba.enable_paddle()
# Load scrawled data
data = json.load(open(r"data.json", encoding="utf-8"))
# Extract all words
words = [word for title in data for word, _ in jieba.posseg.cut(title)]
# Filter out stop words
words = filter(lambda x: x not in stopwords, words)
# Filter out words with length <= 1
words = filter(lambda x: len(x) > 1, words)
# Filter out empty strings
words = filter(lambda x: x != '', words)
# Select top 100 words based on their occurrence
counter = Counter(list(words))
most_common_words = counter.most_common(100)
print(most_common_words)
# Set font path for displaying Chinese characters
font_path = r'C:\Windows\Fonts\simhei.ttf'
wordcloud = WordCloud(
    width=1920, height=1080, font_path=font_path
).generate_from_frequencies(dict(most_common_words))
im = wordcloud.to_image()
im.save("word-cloud.png")
  • 使用 jieba 库和 WordCloud 类,根据 json 文件生成词云,无脑用就完事,其中 stopwords_cn.txt 是屏蔽词,有些符号和词缀经常出现在标题但是本身意义不大,所有要通过排除进行结果的优化 ‘C:\Windows\Fonts\simhei.ttf’ 是你的字体存放路径,必须选择支持中文的字体否则无法生成中文。
  • 最后结果保存在 png 文件,可以直观反映当前分类的热门内容
    词云

    这个地方可以下载到 stopwords_cn.txt
    https://github.com/rossning92/web-scraping
    可以根据分区特点完善

  • Copyrights © 2023-2025 LegendLeo Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信