返回

B站关注列表的Python爬取方法

闲谈

一、数据库的设计与操作

1、数据的分析

B站的关注列表在 此处 中,一页最多50条信息。 我们大致分析一下信息, 首先,列表内容存在 data: 中,如下:

data: [
  {
    "uid": "27676288",
    "name": "一个阳光沙雕 UP 主",
    "fans": "6.9w",
    "video_view": "1.3亿",
    "article_view": "8.3w",
    "attention": "53",
    "official_verify": {
      "type": -1,
      "desc": ""
    }
  },
  ...
]

由此,可知每一个关注的人的信息都存储在一个列表中,而每个关注的人的信息都有 uid, name, fans, video_view, article_viewattention 等字段。

2、数据库的设计

根据以上分析,我们可以设计一个数据库来存储这些信息。数据库的表结构如下:

CREATE TABLE bilibili_follows (
  uid INT NOT NULL,
  name VARCHAR(255) NOT NULL,
  fans VARCHAR(255) NOT NULL,
  video_view VARCHAR(255) NOT NULL,
  article_view VARCHAR(255) NOT NULL,
  attention VARCHAR(255) NOT NULL,
  official_verify VARCHAR(255) NOT NULL,
  PRIMARY KEY (uid)
);

3、数据的插入

我们可以使用 Python 的 pymysql 库来将数据插入到数据库中。以下是一个示例代码:

import pymysql

# 连接数据库
conn = pymysql.connect(host='localhost', port=3306, user='root', password='password', db='bilibili')

# 创建游标
cursor = conn.cursor()

# 准备 SQL 语句
sql = """
INSERT INTO bilibili_follows (uid, name, fans, video_view, article_view, attention, official_verify)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""

# 遍历数据列表
for follow in data:
    # 将数据插入到数据库中
    cursor.execute(sql, (follow['uid'], follow['name'], follow['fans'], follow['video_view'], follow['article_view'], follow['attention'], follow['official_verify']))

# 提交事务
conn.commit()

# 关闭游标和连接
cursor.close()
conn.close()

二、数据的抓取

1、使用 BeautifulSoup

我们可以使用 BeautifulSoup 库来抓取 B 站关注列表的数据。以下是一个示例代码:

import requests
from bs4 import BeautifulSoup

# 请求 B 站关注列表页面
response = requests.get('https://space.bilibili.com/follow/Followed')

# 解析 HTML 文档
soup = BeautifulSoup(response.text, 'html.parser')

# 查找关注的人的信息
follows = soup.find_all('li', class_='item')

# 提取数据
data = []
for follow in follows:
    uid = follow.find('a')['href'].split('/')[-1]
    name = follow.find('a').text
    fans = follow.find('span', class_='fans').text
    video_view = follow.find('span', class_='video-view').text
    article_view = follow.find('span', class_='article-view').text
    attention = follow.find('span', class_='attention').text
    official_verify = follow.find('span', class_='official-verify')
    if official_verify:
        official_verify = official_verify.text
    else:
        official_verify = ''

    data.append({
        'uid': uid,
        'name': name,
        'fans': fans,
        'video_view': video_view,
        'article_view': article_view,
        'attention': attention,
        'official_verify': official_verify
    })

# 打印数据
print(data)

2、使用 Scrapy

我们也可以使用 Scrapy 来抓取 B 站关注列表的数据。以下是一个示例代码:

import scrapy

class BilibiliFollowsSpider(scrapy.Spider):
    name = 'bilibili_follows'
    allowed_domains = ['bilibili.com']
    start_urls = ['https://space.bilibili.com/follow/Followed']

    def parse(self, response):
        # 查找关注的人的信息
        follows = response.xpath('//li[@class="item"]')

        # 提取数据
        for follow in follows:
            uid = follow.xpath('@data-id').extract_first()
            name = follow.xpath('.//a[@class="name"]/text()').extract_first()
            fans = follow.xpath('.//span[@class="fans"]/text()').extract_first()
            video_view = follow.xpath('.//span[@class="video-view"]/text()').extract_first()
            article_view = follow.xpath('.//span[@class="article-view"]/text()').extract_first()
            attention = follow.xpath('.//span[@class="attention"]/text()').extract_first()
            official_verify = follow.xpath('.//span[@class="official-verify"]/text()').extract_first()

            yield {
                'uid': uid,
                'name': name,
                'fans': fans,
                'video_view': video_view,
                'article_view': article_view,
                'attention': attention,
                'official_verify': official_verify
            }

# 运行爬虫
scrapy crawl bilibili_follows

3、使用 Selenium

我们还可以使用 Selenium 来抓取 B 站关注列表的数据。以下是一个示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建 Selenium 驱动器
driver = webdriver.Chrome()

# 访问 B 站关注列表页面
driver.get('https://space.bilibili.com/follow/Followed')

# 等待页面加载完成
driver.implicitly_wait(10)

# 查找关注的人的信息
follows = driver.find_elements(By.XPATH, '//li[@class="item"]')

# 提取数据
data = []
for follow in follows:
    uid = follow.get_attribute('data-id')
    name = follow.find_element(By.XPATH, './/a[@class="name"]').text
    fans = follow.find_element(By.XPATH, './/span[@class="fans"]').text
    video_view = follow.find_element(By.XPATH, './/span[@class="video-view"]').text
    article_view = follow.find_element(By.XPATH, './/span[@class="article-view"]').text
    attention = follow.find_element(By.XPATH, './/span[@class="attention"]').text
    official_verify = follow.find_element(By.XPATH, './/span[@class="official-verify"]').text

    data.append({
        'uid': uid,
        'name': name,
        'fans': fans,
        'video_view': video_view,
        'article_view': article_view,
        'attention': attention,
        'official_verify': official_verify
    })

# 关闭 Selenium 驱动器
driver.quit()

# 打印数据
print(data)

三、数据的分析

1、使用 Pandas

我们可以使用 Pandas 库来分析 B 站关注列表的数据。以下是一个示例代码:

import pandas as pd

# 读取数据
data = pd.read_csv('bilibili_follows.csv')

# 查看数据信息
print(data.info())

# 查看数据概况
print(data.describe())

# 分组统计
data = data.groupby('name').agg({
    'fans': 'sum',
    'video_view': 'sum',
    'article_view': 'sum',
    'attention': 'sum'
})

# 排序
data = data.sort_values('fans', ascending=False)

# 打印数据
print(data)

四、结语

本文介绍了如何使用 Python 爬取 B 站关注列表