你是否曾经想过如何从Bilibili网站上获取有关UP主的信息,并将其可视化呈现出来?本教程将向你展示如何使用Python、Selenium、Pandas和Matplotlib优化你的爬虫和数据可视化流程,以更轻松地收集和分析数据。
前言
在这个信息爆炸的时代,我们有许多方法来获取数据。而对于喜欢Bilibili的用户来说,UP主的粉丝数量和内容质量是非常关键的信息。我们将使用Python编程语言来自动抓取Bilibili上UP主的信息,并通过数据可视化来更好地理解这些数据。
准备工作
在开始之前,确保你已经安装了以下Python库:
- Pandas:用于数据处理和分析。
- Matplotlib:用于数据可视化。
- Selenium:用于网页自动化操作。
你还需要下载Microsoft Edge浏览器驱动,确保与你的浏览器版本相匹配。现在,让我们开始吧!
第一步:设置环境
首先,让我们设置Python环境并导入必要的库:
import pandas as pd
import matplotlib.pyplot as plt
from selenium import webdriver
from selenium.webdriver.common.by import By
import pinyin
在这里,我们导入了所需的库,包括Pandas用于数据处理、Matplotlib用于可视化、Selenium用于网页自动化操作以及pinyin用于处理拼音。
第二步:设置中文显示
由于我们将处理中文字符,我们需要设置Matplotlib以正确显示中文字符:
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
这将确保你的可视化图表中可以正确显示中文。
第三步:编写辅助函数
在进行爬取和数据处理之前,我们将编写一些辅助函数来处理文字数据:
def getStrAllAlpha(string):
return pinyin.get_initial(string, delimiter="").upper()
def getStrFirstAlpha(string):
string = getStrAllAlpha(string)
string = string[0:1]
return string.upper()
这两个函数将用于将UP主的名字转换为拼音,并提取首字母,以便后续的数据整理。
第四步:爬取UP主信息
现在,让我们开始爬取Bilibili上UP主的信息。我们将使用Selenium来自动化这个过程。首先,设置Bilibili的搜索页面URL:
url = "https://search.bilibili.com/upuser?keyword=mc&from_source=webtop_search&spm_id_from=333.1007&order=fans"
接下来,设置浏览器的User-Agent,以模拟用户操作:
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'}
opt = webdriver.EdgeOptions()
opt.add_argument('--user-agent=%s' % header)
edge = webdriver.Edge(options=opt)
然后,让浏览器打开Bilibili的搜索页面:
edge.get(url)
现在,我们准备开始爬取UP主信息。我们将循环爬取100个UP主的名字和粉丝数量,并将它们存储在两个列表中:
name_list = []
people_list = []
for i in range(1, 101):
try:
# 使用XPath定位UP主信息
li = edge.find_element(by=By.XPATH, value='//*[@id="user-list"]/div[1]/ul/li[' + str(i) + ']')
txt = li.text
name = txt.split("\n")[0].split("+")[0]
people = txt.split("\n")[2].split(":")[1].split("万")[0]
name_list.append(name)
people_list.append(float(people))
print(name, people)
except:
print("切页")
# 点击下一页按钮
button = edge.find_element(by=By.XPATH, value='//*[@id="user-list"]/div[1]/div[2]/div/ul/li[' + str(page) + ']/button').click()
page += 1
这个循环将遍历100个UP主的信息,并将它们存储在两个列表中。如果需要翻页,它还会自动点击下一页按钮。
第五步:数据整理
现在,我们已经成功爬取了UP主的信息,接下来让我们对数据进行整理。首先,我们将按照首字母对UP主进行分类:
abc_name = []
abc_name2 = []
abc_people = []
abc_people2 = []
abc = "A"
for i in range(26):
for j in name_list:
if getStrFirstAlpha(j) == abc:
abc_name.append(j)
tt = name_list.index(j)
abc = chr(ord(abc) + 1)
for id in abc_name:
if id not in abc_name2:
abc_name2.append(id)
for i in abc_name2:
abc_people2.append(people_list[name_list.index(i)])
这段代码会将UP主按照首字母进行分类,并创建两个新的列表,分别存储UP主的名字和粉丝数量。
第六步:数据保存
我们将整理好的数据保存为CSV文件,以备后续分析和可视化使用:
data = pd.DataFrame({"UP主名字": name_list, "粉丝数量/万": people_list})
data.to_csv("up主信息.csv")
data = pd.DataFrame({"UP主名字": abc_name2, "粉丝数量/万": abc_people2})
data.to_csv("按首字母分类.csv")
这将创建两个CSV文件
,分别存储UP主的详细信息和按首字母分类的信息。
第七步:数据可视化
现在,我们已经成功获取和整理了UP主的信息,接下来让我们使用Matplotlib进行数据可视化。我们将创建两个柱状图,一个显示所有UP主的粉丝数量,另一个按首字母分类显示:
plt.subplot(1, 2, 1)
bar1 = plt.bar(name_list, people_list, color=['r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'])
plt.xticks(rotation=90, fontsize=13)
plt.bar_label(bar1, label_type='edge')
plt.subplot(1, 2, 2)
bar2 = plt.bar(abc_name2, abc_people2, color=['r', 'r', 'r', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'])
plt.bar_label(bar2, label_type='edge')
plt.xticks(rotation=90, fontsize=13)
plt.show()
这段代码会创建两个子图,一个显示所有UP主的粉丝数量,另一个按首字母分类显示。最后,通过plt.show()
将图表显示出来。
总结
通过这个教程,你学会了如何使用Python、Selenium、Pandas和Matplotlib来爬取Bilibili上UP主的信息,并将其进行数据整理和可视化。这对于分析UP主的粉丝数量和分类是非常有用的。
现在,你可以探索更多的数据分析和可视化方法,或者将这些数据用于其他有趣的项目。希望这个教程对你有所帮助!