返回
B站关注列表的Python爬取方法
闲谈
2023-09-15 08:46:07
一、数据库的设计与操作
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_view
和 attention
等字段。
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 站关注列表