使用python爬取B站千万级数据

yizhihongxing

下面我来为您详细讲解“使用python爬取B站千万级数据”的完整攻略。

引言

B站是一家知名的弹幕视频网站,拥有海量的视频资源。如果您是一名数据分析师,想要进行B站数据分析,那么获取B站数据就成为了必备的一部分。本文就是为大家介绍如何使用Python爬虫获取B站数据。

工具准备

本文涉及到以下工具:

  • Python 3.x
  • pymongo (Python的MongoDB驱动)
  • requests (Python的HTTP请求库)
  • BeautifulSoup4 (Python的HTML解析库)
  • Chrome浏览器

获取B站数据的思路

B站提供了开放的API,但是这些API都需要申请key才能使用。如果数据量较小,我们可以向B站申请key。但是如果要获取海量的数据,那么多申请几个key也不太现实。由于这篇文章旨在爬取“千万级数据”,所以我们采用爬虫的方式获取数据。

爬取B站视频数据的思路如下:

  1. 首先获取视频的链接和ID
  2. 根据视频ID获取视频的详细信息
  3. 解析数据并保存到MongoDB数据库

爬取B站视频链接和ID

我们可以使用Chrome浏览器进行调试,找到B站的视频列表页,通过分析HTML代码找到有效的请求URL,然后使用requests库向URL发送请求。此处以B站哔哩哔哩2021年4月新番推荐为例,代码如下:

import requests
from bs4 import BeautifulSoup

url = "https://www.bilibili.com/anime/timeline/?spm_id_from=333.6.b_7072696d6172795f6d656e75.33#/2021/4/1/1/"

r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

for video in soup.select(".main-section > .section > .bangumi-list.bangumi-list-a > .bangumi-item"):
    video_title = video.select_one(".title").text.strip()
    video_url = video.select_one("a")["href"]
    video_id = video.select_one("a")["data-id"]
    print(video_id, video_title, video_url)

结果如下:

121246247 爆笑迷宫OVA:橙绮季 番外篇 /video/BV1E64y1c7nB/
121075255 吸血鬼马上死 第二季 /video/BV19v411t7H7/
121334208 睡觉·睡觉·睡觉 /video/BV1pL411a7fd/
121127266 异世界魔王与召唤少女的奴隶魔术Ω 第二季 /video/BV1JE411p7Le/
121145129 双重奏 /video/BV1JS4y1t79p/
121258372 木兰少女 /video/BV1gK4y1S7Ar/
121195313 86─不存在的战区─ 第2季 /video/BV1Zi4y1P7Wz/
121027045 魔法纪录 魔法少女小圆外传 第二季 /video/BV1kA411N78z/
121054021 末日时在做什么?有没有空?可以来拯救吗?第二季 /video/BV1vK4y1z7o7/
120147162 进击的巨人 The Final Season /video/BV1mk4y1J7sb/

我们可以看到,每一个视频都有一个唯一的ID,需要保存这个ID,后面会用到。

爬取B站视频详细信息

根据上一步获取的视频ID,我们可以向B站发送请求获取视频的详细信息。此处我们还是使用requests库发送请求,但是B站的API返回的数据是JSON格式的,我们需要使用Python内置的json库进行解析。最后解析出来数据后,我们将它保存到MongoDB数据库。代码如下:

import requests
import json
from pymongo import MongoClient

client = MongoClient() # 连接MongoDB
db = client["bilibili"]

def save_video_info(video_id, video_info):
    """
    将视频信息保存到MongoDB
    """
    db["videos"].update({"_id": video_id}, {"$set": video_info}, upsert=True)

def get_video_info(video_id):
    """
    获取视频信息
    """
    url = f"https://api.bilibili.com/x/web-interface/view?aid={video_id}"
    r = requests.get(url)
    if r.status_code == 200:
        data = json.loads(r.text)["data"]
        video_info = {
            "_id": data["aid"], # 将视频ID作为MongoDB文档的唯一标识
            "title": data["title"],
            "description": data["desc"],
            "view_count": data["view"],
            "danmaku_count": data["danmaku"],
            "like_count": data["like"],
            "coin_count": data["coin"],
            "favorite_count": data["favorite"],
            "share_count": data["share"],
            "category": data["tname"],
            "tags": data["tag"]
        }
        save_video_info(video_id, video_info)
        print(f"视频 {video_id} 信息获取成功")
    else:
        print(f"视频 {video_id} 信息获取失败,原因:{r.reason}")

注意,在爬取数据时,为了防止造成对B站服务器的过度压力,我们需要加入一些延迟操作。具体可以用time库的sleep函数来实现。

代码示例

下面我们以获取B站哔哩哔哩2021年4月新番推荐为例,来放一下完整代码:

import requests
import json
import time
from pymongo import MongoClient
from bs4 import BeautifulSoup

client = MongoClient() # 连接MongoDB
db = client["bilibili"]

def save_video_info(video_id, video_info):
    """
    将视频信息保存到MongoDB
    """
    db["videos"].update({"_id": video_id}, {"$set": video_info}, upsert=True)

def get_video_info(video_id):
    """
    获取视频信息
    """
    url = f"https://api.bilibili.com/x/web-interface/view?aid={video_id}"
    r = requests.get(url)
    if r.status_code == 200:
        data = json.loads(r.text)["data"]
        video_info = {
            "_id": data["aid"], # 将视频ID作为MongoDB文档的唯一标识
            "title": data["title"],
            "description": data["desc"],
            "view_count": data["view"],
            "danmaku_count": data["danmaku"],
            "like_count": data["like"],
            "coin_count": data["coin"],
            "favorite_count": data["favorite"],
            "share_count": data["share"],
            "category": data["tname"],
            "tags": data["tag"]
        }
        save_video_info(video_id, video_info)
        print(f"视频 {video_id} 信息获取成功")
    else:
        print(f"视频 {video_id} 信息获取失败,原因:{r.reason}")

def main():
    url = "https://www.bilibili.com/anime/timeline/?spm_id_from=333.6.b_7072696d6172795f6d656e75.33#/2021/4/1/1/"

    r = requests.get(url)
    soup = BeautifulSoup(r.text, "html.parser")

    for video in soup.select(".main-section > .section > .bangumi-list.bangumi-list-a > .bangumi-item"):
        video_title = video.select_one(".title").text.strip()
        video_url = video.select_one("a")["href"]
        video_id = video.select_one("a")["data-id"]
        print(video_id, video_title, video_url)

        get_video_info(int(video_id)) # 获取视频详细信息
        time.sleep(1) # 延迟1秒

if __name__ == "__main__":
    main()

总结

到这里,我们就完成了使用Python爬虫获取B站数据的任务。当然,这只是个简单的示例,如果要获取更多、更详细的数据,我们需要考虑更多的细节问题,比如:防止被反爬,数据写入的优化等。希望本文能够对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用python爬取B站千万级数据 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • python dict remove数组删除(del,pop)

    下面是关于“Python字典中元素删除的两种方式——del和pop”的攻略。 Python字典 Python的字典是一种无序的键值对(Key-Value)的数据类型,可以通过键来对值进行访问。在字典中,键必须是唯一的,而值则不必。 方法一:使用del语句删除字典元素 在Python中,可以使用del语句来删除字典中的元素。最基础的用法是通过键值对中的键来删除…

    python 2023年6月5日
    00
  • Python进程,多进程,获取进程id,给子进程传递参数操作示例

    下面是详细的Python进程、多进程相关操作攻略。 Python进程 首先我们需要了解什么是进程。进程是指正在运行的程序,让电脑处理我们所需要的任务。在Python中,我们可以使用 os 模块来进行进程相关操作。 获取进程ID 要获取当前进程的ID,可以使用 os 模块的 getpid() 函数. 下面是一个示例程序: import os print(&qu…

    python 2023年6月5日
    00
  • win7安装python生成随机数代码分享

    下面是“Win7安装Python生成随机数代码分享”的完整攻略: 安装Python 首先需要下载Python安装包,可以在官网 https://www.python.org/downloads/windows/ 下载适合自己系统的Python版本,推荐下载最新的稳定版。 下载完成后,点击安装包进行安装,一路默认即可。最后记得将Python的安装路径加入系统的…

    python 2023年6月3日
    00
  • 详解Django的MVT设计模式

    详解Django的MVT设计模式 Django是一个基于Python的Web框架,采用了MVT(Model-View-Template)设计模式。MVT是一种基于MVC(Model-View-Controller)设计模式的变体,它将控制器(Controller)分解为模板(Template)和视图(View),以更好地实现业务逻辑和数据处理。以下是Djan…

    python 2023年5月14日
    00
  • 一文带你了解Python 四种常见基础爬虫方法介绍

    在Python中,我们可以使用多种方法来实现基础的网络爬虫。本文将介绍四种常见的基础爬虫方法。 1. 使用urllib库发送HTTP请求 urllib库是Python标准库中的一个HTTP客户端库,可以用于发送HTTP请求和处理HTTP响应。以下是一个使用urllib库发送HTTP请求的示例: import urllib.request url = &quo…

    python 2023年5月14日
    00
  • pip报错“OSError: [Errno 13] Permission denied: ‘/usr/local/lib/python3.6/dist-packages/pip/_internal/utils/subprocess.py’”怎么处理?

    当使用pip安装Python包时,可能会遇到“OSError: [Errno 13] Permission denied”错误。这个错误通常是由以下原因之一引起的: 权限不足:如果您没有足够的权限来安装Python包,则会出现此错误。在这种情况下,需要使用管理员权限运行pip。 文件或目录权限:如果您尝试安装Python包到没有写入权限的目录,则会出现此错误…

    python 2023年5月4日
    00
  • python实现类似ftp传输文件的网络程序示例

    实现类似FTP传输文件的网络程序,需要用到Python提供的socket和os模块。下面是实现的完整攻略: 前置知识 对于实现网络通信,需要对socket的原理和使用方法有一定的了解;对于文件操作,需要理解OS模块中的文件读写和路径操作。 功能实现 创建服务器端ftpserver.py和客户端ftpclient.py,通过socket建立连接。 实现用户输入…

    python 2023年6月2日
    00
  • Python 登录网站详解及实例

    Python登录网站是一种常见的自动化测试方法,可以帮助我们更好地测试网站的功能和稳定性。本文将介绍如何使用Python登录网站,并提供两个示例。 1. 使用requests库实现登录 我们可以使用requests库实现登录。以下是一个示例,演示如何使用requests库实现登录: import requests login_url = ‘http://ex…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部