当前位置:   article > 正文

b站爬虫大作业(大二)--(利用selenium模块爬取数据、利用pyecharts模块制作可视化图表)(bilibili数据可视化)

b站爬虫

目录

一、爬取前期准备工作

二、爬取目标

三、爬取过程(重点)

四、生成可视化图表

五、全部代码

一、爬取前期准备工作

1.安装selenium模块及其相关驱动

安装selenium模块(以PyCharm为例)

方法一:打开PyCharm,依次点击 “文件”--->“设置”--->“python解释器”--->选择适合的环境(环境可以自己新建,也可以使用基础环境,不过建议新建一个)--->“加号”进入如下页面,

输入“selenium”,选择版本为“3.141.0”(这里一定要使用这个版本或者附近的版本,不要用最新的版本,最新的版本有些老的指令被废掉了,使用起来不方便,用这个版本就行了)

方法二:打开命令行,进入自己指定的环境或者基础环境,输入“pip install selenium==3.141.0”,一样也可以下载selenium模块。

2.安装chrome以及chromedriver(以chrome为例,firefox等等参考其他教程吧,这里我只用了chrome)

chrome可以随便百度搜索安装一下,但是要注意版本问题,最好使用114版本一下的,因为chromedriver的目前版本114以上的不好用,很少,chromedriver版本要和chrome版本对应,不然运行的时候会报错。

我使用的是109版本的chrome

下载链接:Chromev109.0.5414.120下载-Chrome2023最新版下载_3DM软件

安装完成后大多数人会遇到一个问题------chrome会自动升级,它会自动升级到116版本甚至116版本以上,这个时候就需要我们手动设置来阻止chrome自动升级。

如何阻止chrome自动升级呢:

在下载完chrome后,先别急着打开chrome。一般下载完chrome后桌面会自动创建快捷方式,右键点击快捷方式,然后点击“打开文件所在位置”,进入程序所在根目录

之后,按照操作,选择>>>Google目录

选择>>>Update

右键>>>属性

安全>>>SYSTEM>>>编辑

全部勾选拒绝

继续选择>>>高级

最重要的一步

首先点击禁用继承

然后将所有类型为允许的条目删除

最后检查一下是否成功,点击Update文件夹,发现无权访问,那么就差不多成功了!

打开Chrome,点击右上角的设置>>>帮助>>>关于Google Chrome,发现检查更新报错,那么就成功了。

接下来我们安装chromedriver,这个东西可以帮助我们运行爬虫代码,实时测试网页。

安装地址:

CNPM Binaries Mirror

ChromeDriver - WebDriver for Chrome - Downloads

Download older versions of Google Chrome for Windows, Linux and Mac

注意:你的chrome浏览器是什么版本的,那你下载的这个chromedriver也要对应

我下载的chrome是109.0.5414.120

那么下载的chromedriver也要对应,不一定要完全一样,选最接近的版本就行了。

下载好之后将我们的chromedriver放到和我们python安装路径相同的目录下

其实这个时候差不多已经可以正常运行了,但有些人可能运行不了,可能是对应的环境变量没有添加(如果你把python安装目录已经添加到环境变量里面就应该没问题,有问题可能是没有完全添加进去,导致这个chromedriver系统识别不到)

打开我们的查看高级系统设置,点击环境变量,打开系统变量里面的path环境。添加我们的驱动路径进去。

完成之后我们可以打开PyCharm运行一段代码:

  1. from selenium import webdriver
  2. if __name__ == '__main__':
  3. url = "https://www.bilibili.com/"
  4. driver = webdriver.Chrome()
  5. driver.get(url)

如果成功跳出chrome浏览器并显示已经到b站主页,那么安装就算完成了!

二、爬取目标

我们要爬取什么数据,并且该利用这些数据制作什么图表。这应该是我们要最先明确的,有了目标才能事半功倍。

我们小组在进行爬取信息决策时,想出了以下5条爬取目标:

1.bilibili热门榜top100视频相关数据的爬取

需要爬取内容: 当前榜单top100视频的标题,up主,观看量,弹幕数, 点赞数,投币数,收藏数,转发数。

分析点: 比较观看量,弹幕数, 点赞数,投币数,收藏数,转发数的差异。

2.bilibili热歌排行榜数据爬取

需要爬取内容: 各个种类歌曲排行榜,MV排行榜。

分析点: 统计各个种类歌曲的播放量,得出b站用户最爱哪种类型的歌曲。

3.bilibili美食区视频标签的数据爬取

需要爬取内容: 视频标题,各个视频的相关标签。

分析点: 分析标签词条出现频次,分析当前最热标签词条。

4.单一视频的评论数据爬取

需要爬取内容: 选择一个内容新颖的视频,爬取其评论信息

分析点: 分析各个评论传达出的情感态度,进行情感态度词条的统计,分析出该视频内容的好坏。

5.单一视频一周内各个参数数据的爬取

需要爬取内容: 该视频一周内的观看量, 弹幕数, 点赞数, 投币数, 收藏数, 转发数。

分析点: 分析该视频一周内各个数据的变化,推断出该视频的热度以及受欢迎度。

有了目标后,我们就可以开始干活了!

三、爬取过程

1.bilibili热门榜top100视频相关数据的爬取

由于这个top100榜单肯定是实时变化的,所以我们的这个榜单肯定不一样,但是爬取的过程是一样的,只是爬取下来的数据不一样。

这是我写这篇文章时的榜单

接下来是爬取过程:

先说一下我的爬取过程思考:

第一步:先将这个总页面中的100个视频的url(链接)都爬取下来,写入一个文件url.csv里面

第二部:循环读取url.csv文件里面的100个url(链接),进入每个视频的页面,然后将每个视频的具体信息爬取下来,写入一个文件top100.csv里面。

这样视频的相关信息就被我顺利爬取下来了(其实也可以直接在读取到每个视频url时就进入每个视频页面直接爬取信息,这就省略了第一步。但是当时我没有考虑这个,坚持一步一步来,所以这里就分享这个稍微麻烦一点的方法)

1.直接给出代码,下面这个是爬取top100所有视频链接的代码。

  1. import csv # csv模块在生成、写入文件时用到
  2. from selenium import webdriver # selenium模块下的webdriver是爬虫要用的
  3. if __name__ == '__main__': # 入口
  4. url = 'https://www.bilibili.com/v/popular/rank/all' # top100总页面链接
  5. driver = webdriver.Chrome() # 启动chromediver进行调试
  6. driver.get(url) # 传入url
  7. csv_file = "data/top100_url.csv" # 新建一个名为top100_url的csv类型的文件放在data文件夹下(data文件夹可以自己新建,代码运行后也会自动生成)
  8. with open(csv_file, 'a',newline='', encoding='utf-8') as f: # 打开刚刚定义的文件,'a'是追加模式,也可以换成'w','w'为重写模式,encoding为编码,设置为'utf-8'
  9. writer = csv.writer(f) # 自定义一个名为writer的变量,这句就直接抄,不解释
  10. writer.writerow(['b站实时排行榜前一百视频url','up主昵称']) # 写入列标题
  11. i = 1 # i的初始值设置为1
  12. print()
  13. while(i < 101): # 循环爬取100个视频的url
  14. all_datas = driver.find_elements_by_xpath(f'//*[@id="app"]/div/div[2]/div[2]/ul/li[{i}]/div/div[2]/a') # 这里是通过xpath来定位视频的链接,all_datas返回的值为当前视频所在小模块的所有信息,当然也包括了url
  15. all_up_name = driver.find_elements_by_xpath(f'//*[@id="app"]/div/div[2]/div[2]/ul/li[{i}]/div/div[2]/div/a/span') # 这里通过xpath爬取up的名字,all_up_name返回值为一个list
  16. href_values = [element.get_attribute("href") for element in all_datas] # 从all_datas中提取每个视频的url(链接)
  17. up_name = all_up_name[0].text # 从all_ip_data中提取up主名字
  18. writer.writerow([href_values[0], up_name]) # 将每个视频的url与对应up主名字写入文件
  19. print(f'第{i}个视频已经爬取完成') # 显示进度
  20. i += 1

要注意的是:在爬取的过程中,需要我们实时加载页面,因为页面如果不加载,数据就无法被系统检测到,会导致程序卡死,这个时候我们大概率只能重新来过,如果你看懂了代码,稍微修改一下就能够实现在对应的地方继续爬虫或者重复爬虫。

爬取下来的数据差不多是这样的(这里只展示了前一部分,一共应该有100行)----第一列是url,第二列是up主名字,其实只需要第一列,第二列没啥用。

欧克!现在我们第一步就算完成了

2.直接给出代码,这里是根据上面我们爬下来的url(链接)循环爬取每个视频的相关信息

  1. # 导入模块
  2. import csv
  3. from selenium import webdriver
  4. import pandas as pd
  5. # 提取上一步爬取下来的文件中的url
  6. all_urls = pd.read_csv('./data/top100_url.csv') # 利用pandas模块读取csv文件
  7. all_video_urls = all_urls['b站实时排行榜前一百视频url'] # 利用类标题获取url所在列的信息,all_video_urls返回值类型为(pandas.core.series.Series),这个理解为一个表格就行了
  8. all_video_up = all_urls['up主昵称'] # 同上这里获取up名字
  9. driver = webdriver.Chrome() # 启动chromedriver
  10. csv_file = "data/top100_details.csv" # 新建一个文件,存储所有视频的相关信息
  11. with open(csv_file, 'a', newline='', encoding='utf-8') as f: # 打开文件,循环写入信息
  12. writer = csv.writer(f)
  13. writer.writerow(['视频标题', 'up主', '观看量', '弹幕数', '点赞数', '投币数', '收藏数', '转发数']) # 我们要爬取的视频信息包括(1.视频标题 2.up主 3.观看量 4.弹幕数 5.点赞数 6.投币数 7.收藏数 8.转发数)
  14. i = 0
  15. for url in all_video_urls: # 循环遍历all_video_urls中的每一个url(链接)
  16. driver.get(url) # 打开每一个链接
  17. ###############################################################################
  18. data_title = driver.find_elements_by_xpath('// *[ @ id = "viewbox_report"] / h1')
  19. title = data_title[0].text ###### 视频标题
  20. ###############################################################################
  21. up = all_video_up[i] ###### up主
  22. ###############################################################################
  23. data_watch_dm = driver.find_elements_by_xpath('// *[ @ id = "viewbox_report"] / div / div / span') # data_watch_dm包含了播放量和弹幕数的相关数据
  24. ######################################################################
  25. ####因为爬取出来的数据都是数字加上汉字“万” ###
  26. ####所以我处理了一下,将“万”全部都变成×10000,使得所有数据都为数字形式###
  27. #####################################################################
  28. watch = data_watch_dm[0].text ###### 播放量
  29. # 处理汉字‘万’
  30. if watch[-1] in '万':
  31. num = float(watch[0:-1])
  32. num *= 10000
  33. watch = str(num)
  34. ###############################################################################
  35. dm = data_watch_dm[1].text ###### 弹幕数
  36. # 处理汉字‘万’
  37. if dm[-1] in '万':
  38. num = float(dm[0:-1])
  39. num *= 10000
  40. dm = str(num)
  41. ###############################################################################
  42. data_dz_tb_sc_fx = driver.find_elements_by_xpath('// *[ @ id = "arc_toolbar_report"] / div[1] / div') # data_dz_tb_sc_fx包含了带你赞数,投币数,收藏数,分享数的相关数据
  43. ######################################################################
  44. ####因为爬取出来的数据都是数字加上汉字“万” ###
  45. ####所以我处理了一下,将“万”全部都变成×10000,使得所有数据都为数字形式###
  46. #####################################################################
  47. video_like_info = data_dz_tb_sc_fx[0].text ###### 点赞数
  48. # 处理汉字‘万’
  49. if video_like_info[-1] in '万':
  50. num = float(video_like_info[0:-1])
  51. num *= 10000
  52. video_like_info = str(num)
  53. ###############################################################################
  54. video_coin_info = data_dz_tb_sc_fx[1].text ###### 投币数
  55. # 处理汉字‘万’
  56. if video_coin_info[-1] in '万':
  57. num = float(video_coin_info[0:-1])
  58. num *= 10000
  59. video_coin_info = str(num)
  60. ###############################################################################
  61. video_fav_info = data_dz_tb_sc_fx[2].text ###### 收藏数
  62. # 处理汉字‘万’
  63. if video_fav_info[-1] in '万':
  64. num = float(video_fav_info[0:-1])
  65. num *= 10000
  66. video_fav_info = str(num)
  67. ###############################################################################
  68. video_share_info = data_dz_tb_sc_fx[3].text ###### 分享数
  69. # 处理汉字‘万’
  70. if video_share_info[-1] in '万':
  71. num = float(video_share_info[0:-1])
  72. num *= 10000
  73. video_share_info = str(num)
  74. ###############################################################################
  75. row = [title, up, watch, dm, video_like_info, video_coin_info,
  76. video_fav_info, video_share_info] # 将数据打包为一个list(列表)
  77. writer.writerow(row) # 写入文件
  78. print(f'第{i + 1}个视频已经爬取成功!') # 提示进度
  79. i += 1

到这里所有得视频信息就都被我们爬取下来了,可以检查一下爬取的数据集,下面是我爬取的部分数据。

3.下面是完整代码,可以直接复制使用,爬取的是b站热门榜top100视频的相关链接与具体数据,代码会生成两个csv文件-------第一个是top100_url.csv,存储100个视频的链接;第二个是top100_details.csv,存储100个视频的具体参数及数据。(包括 1.视频标题 2.up主 3.观看量 4.弹幕数 5.点赞数 6.投币数 7.收藏数 8.转发数)(数据是粗数据,只能精确到万位,对于大作业来说应该到这里就差不多了)

  1. import csv
  2. from selenium import webdriver
  3. import pandas as pd
  4. if __name__ == '__main__':
  5. url = 'https://www.bilibili.com/v/popular/rank/all'
  6. driver = webdriver.Chrome()
  7. driver.get(url)
  8. csv_file = "data/top100_url.csv"
  9. with open(csv_file, 'a',newline='', encoding='utf-8') as f:
  10. writer = csv.writer(f)
  11. writer.writerow(['b站实时排行榜前一百视频url','up主昵称'])
  12. i = 1
  13. print()
  14. while(i < 101):
  15. all_datas = driver.find_elements_by_xpath(f'//*[@id="app"]/div/div[2]/div[2]/ul/li[{i}]/div/div[2]/a')
  16. all_up_name = driver.find_elements_by_xpath(f'//*[@id="app"]/div/div[2]/div[2]/ul/li[{i}]/div/div[2]/div/a/span')
  17. href_values = [element.get_attribute("href") for element in all_datas]
  18. up_name = all_up_name[0].text
  19. writer.writerow([href_values[0], up_name])
  20. print(f'第{i}个视频已经爬取完成')
  21. i += 1
  22. ########################################################################################################################
  23. # 提取上一步爬取下来的文件中的url
  24. all_urls = pd.read_csv('./data/top100_url.csv')
  25. all_video_urls = all_urls['b站实时排行榜前一百视频url']
  26. all_video_up = all_urls['up主昵称']
  27. driver = webdriver.Chrome()
  28. csv_file = "data/top100_details.csv"
  29. with open(csv_file, 'a', newline='', encoding='utf-8') as f:
  30. writer = csv.writer(f)
  31. writer.writerow(['视频标题', 'up主', '观看量', '弹幕数', '点赞数', '投币数', '收藏数', '转发数'])
  32. i = 0
  33. for url in all_video_urls:
  34. driver.get(url)
  35. data_title = driver.find_elements_by_xpath('// *[ @ id = "viewbox_report"] / h1')
  36. title = data_title[0].text ###### 视频标题
  37. up = all_video_up[i] ###### up主
  38. data_watch_dm = driver.find_elements_by_xpath('// *[ @ id = "viewbox_report"] / div / div / span')
  39. watch = data_watch_dm[0].text ###### 播放量
  40. if watch[-1] in '万':
  41. num = float(watch[0:-1])
  42. num *= 10000
  43. watch = str(num)
  44. dm = data_watch_dm[1].text ###### 弹幕数
  45. if dm[-1] in '万':
  46. num = float(dm[0:-1])
  47. num *= 10000
  48. dm = str(num)
  49. data_dz_tb_sc_fx = driver.find_elements_by_xpath('// *[ @ id = "arc_toolbar_report"] / div[1] / div')
  50. video_like_info = data_dz_tb_sc_fx[0].text ###### 点赞数
  51. if video_like_info[-1] in '万':
  52. num = float(video_like_info[0:-1])
  53. num *= 10000
  54. video_like_info = str(num)
  55. video_coin_info = data_dz_tb_sc_fx[1].text ###### 投币数
  56. if video_coin_info[-1] in '万':
  57. num = float(video_coin_info[0:-1])
  58. num *= 10000
  59. video_coin_info = str(num)
  60. video_fav_info = data_dz_tb_sc_fx[2].text ###### 收藏数
  61. if video_fav_info[-1] in '万':
  62. num = float(video_fav_info[0:-1])
  63. num *= 10000
  64. video_fav_info = str(num)
  65. video_share_info = data_dz_tb_sc_fx[3].text ###### 分享数
  66. if video_share_info[-1] in '万':
  67. num = float(video_share_info[0:-1])
  68. num *= 10000
  69. video_share_info = str(num)
  70. row = [title, up, watch, dm, video_like_info, video_coin_info,
  71. video_fav_info, video_share_info]
  72. writer.writerow(row)
  73. print(f'第{i + 1}个视频已经爬取成功!')
  74. i += 1

欧克欧克!到这里所有的数据就爬取完成了,第一个目标就算完成了,看到这里,你应该差不多了解这个爬虫的具体过程(上面的注释详细看看)

如果你不了解的话,可以找我问问,看到了问题私信的话我会回的

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/799399
推荐阅读
相关标签