当前位置:   article > 正文

python爬虫利用selenium爬取b站近期热门视频_selenium爬取b站视频信息

selenium爬取b站视频信息

1.准备工作

配置:

python3版本

selenium 库(如果没有就pip 安装)+ Chrome driver(根据自己的chrome浏览器版本找到对应的)我这里使用的是119版本。

Chrome driver版本查找:CNPM Binaries Mirror

如果上述网站没有对应的Chrome版本,可以到Chrome for Testing availability  找最新的Chrome driver版本。

数据提取:

这里使用的是xpath分离

  1. import requests
  2. import json
  3. import time
  4. # 伪造请求头
  5. from fake_useragent import UserAgent
  6. from selenium import webdriver
  7. ua = UserAgent()

2.开始爬虫代码编写

1.找目标接口

目标网站:

首先打开检查,选择network(网络),刷新当前页面,通过size倒序,找到请求数据的接口

可以看到请求这个接口的返回数据是json格式

同时对这个接口的param参数进行分析不难看出,ps是每一页请求20条内容,pn是页数,经过测试,最大请求页数在30页。

2.构造请求头,准备发送请求

我们这里先写入文件,后续可以根据个人需要写入excel表格或者数据库中

  1. # 页数不写死
  2. url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='
  3. header = {
  4. "User-Agent":ua.chrome,
  5. }
  6. # 打开准备写入文件 默认每次重写
  7. f = open("hot_bilibili3.txt",'w',encoding='utf-8')
  8. if __name__ == '__main__':
  9. # 启动浏览器
  10. path = 'chromedriver.exe'
  11. browser = webdriver.Chrome(path)
  12. cookie_url = 'https://www.bilibili.com/v/popular/all'
  13. browser.get(cookie_url)
  14. # 计数
  15. count=1
  16. # 中间写爬取内容
  17. print("爬取完毕")
  18. browser.close()
  19. f.close()

尝试发送请求:

  1. def get_content(url, pn, count):
  2. try:
  3. response = requests.get(url=url, headers=header, timeout=3)
  4. # print("状态码:",response.status_code)
  5. # print(response.text)
  6. json_list = json.loads(response.text)
  7. video_lists = json_list["data"]["list"]
  8. # print(response.text)
  9. # 先看一下第一个列表的内容
  10. print(video_lists[0])
  11. print("任务完成")

我们先看一下第一条数据列表里都有什么属性

根据返回的json数据列表提取出的各个属性,我们可以根据各个属性简单提取出我们需要的信息

  1. import datetime as dt
  2. # 时间戳转换
  3. def timestamp_to_timestr(timestamp):
  4. # 可以根据自己想要的格式进行设置
  5. # return dt.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S.%f")
  6. return dt.datetime.fromtimestamp(timestamp)
  7. def get_content(url, pn, count):
  8. try:
  9. response = requests.get(url=url, headers=header, timeout=3)
  10. # print("状态码:",response.status_code)
  11. # print(response.text)
  12. json_list = json.loads(response.text)
  13. video_lists = json_list["data"]["list"]
  14. # print(response.text)
  15. # 遍历列表
  16. print(video_lists[0])
  17. for item in video_lists:
  18. title = item['title'] # 标题
  19. pic = item['pic'] # 封面图片
  20. duration = item['duration'] # 时长
  21. owner = item['owner'] # up主信息
  22. owner_name = owner['name'] # up主名字
  23. owner_face = owner['face'] # up主头像图片链接
  24. video_link = item['short_link_v2'] # 视频链接
  25. des = item['item'] # 视频简介
  26. #去掉开头结尾以及中间的所以空格
  27. des = des.strip().replace(" ","")
  28. if 'pub_location' in item:
  29. location = item['pub_location'] # 发布ip
  30. else:
  31. location = '未知'
  32. view = item['stat']['view'] # 观看次数
  33. like = item['stat']['like'] # 点赞数量
  34. coin = item['stat']['coin'] # 投币数量
  35. share = item['stat']['share'] # 分享数量
  36. favorite = item['stat']['favorite'] # 收藏量
  37. reply = item['stat']['reply'] # 评论数量
  38. pubdate = item['pubdate'] # 发布日期 这里是时间戳类型 需要进行转化
  39. pubdate = timestamp_to_timestr(pubdate) # 时间转换
  40. rcmd_reason = item['rcmd_reason']['content'] # 推荐原因
  41. print(title, owner_name, view, video_link)
  42. # 写入文件
  43. f.write(str(count) + "." + title + '\n')
  44. f.write("发布日期:"+pubdate+"\n")
  45. f.write("视频简介:"+des+"\n")
  46. f.write("时长:" + str(duration) + '秒\n')
  47. f.write("up主昵称:" + owner_name + '\n')
  48. f.write("视频链接:" + video_link + '\n')
  49. f.write("观看次数:" + str(view) + '\n')
  50. f.write("点赞量:" + str(like) + '\n')
  51. f.write("发布ip:" + location + '\n')
  52. f.write("\n")
  53. count+=1
  54. print("第", pn, "页爬取完毕")
  55. except Exception as r:
  56. print(pn, "页爬取异常:", r)
  57. # f.close()
  58. print("任务完成")

我们简单获取了部分属性

当我们即将大功告成运行时,发现当我们连续请求时,第三页开始之后返回的json格式中,

"no_more":true

属性被置为true,返回的列表自然也是空的了。

因此我们借用selenium来模拟真实浏览器请求数据,每次请求完一页的20条数据,就执行滑到底部的操作,加载出新的数据后再进行数据请求,这样,每一页的数据都能完美请求得到了。

3.利用selenium模拟浏览器请求

  1. if __name__ == '__main__':
  2. # 启动浏览器
  3. path = 'chromedriver.exe'
  4. browser = webdriver.Chrome(path)
  5. cookie_url = 'https://www.bilibili.com/v/popular/all'
  6. browser.get(cookie_url)
  7. count=1
  8. for pn in range(1,21):
  9. url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='+str(pn)
  10. get_content(url=url,pn=pn,count=count)
  11. browser.execute_script('window.scrollBy(0,500)')
  12. # 停留
  13. time.sleep(1)
  14. count+=20
  15. print("爬取完毕")
  16. browser.close()
  17. f.close()

最终效果展示

写入的文件展示

如图,这里提取的信息并未全部写入,只是拿了部分信息写入。

我们成功地拿到了所有的热门视频的信息。由于这个榜单会不定时变动,可以利用定时器功能,每天定时提取。

完整代码

  1. # 爬取哔哩哔哩热门视频数据
  2. import requests
  3. import json
  4. import time
  5. from fake_useragent import UserAgent
  6. from selenium import webdriver
  7. ua = UserAgent()
  8. import datetime as dt
  9. # 时间戳转换
  10. def timestamp_to_timestr(timestamp):
  11. # return dt.datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S.%f")
  12. return dt.datetime.fromtimestamp(timestamp)
  13. # 页数不写死
  14. url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='
  15. header = {
  16. "User-Agent":ua.chrome,
  17. }
  18. # 打开准备写入文件 文件名自定义
  19. f = open("hot_bilibili4.txt",'w',encoding='utf-8')
  20. def get_content(url, pn, count):
  21. try:
  22. response = requests.get(url=url, headers=header, timeout=3)
  23. # print("状态码:",response.status_code)
  24. # print(response.text)
  25. json_list = json.loads(response.text)
  26. video_lists = json_list["data"]["list"]
  27. # print(response.text)
  28. # 遍历列表
  29. print(video_lists[0])
  30. for item in video_lists:
  31. title = item['title'] # 标题
  32. pic = item['pic'] # 封面图片
  33. duration = item['duration'] # 时长
  34. owner = item['owner'] # up主信息
  35. owner_name = owner['name'] # up主名字
  36. owner_face = owner['face'] # up主头像图片链接
  37. video_link = item['short_link_v2'] # 视频链接
  38. des = item['desc'] # 视频简介
  39. #去掉开头结尾以及中间的所以空格
  40. des = des.strip().replace(" ","")
  41. if 'pub_location' in item:
  42. location = item['pub_location'] # 发布ip
  43. else:
  44. location = '未知'
  45. view = item['stat']['view'] # 观看次数
  46. like = item['stat']['like'] # 点赞数量
  47. coin = item['stat']['coin'] # 投币数量
  48. share = item['stat']['share'] # 分享数量
  49. favorite = item['stat']['favorite'] # 收藏量
  50. reply = item['stat']['reply'] # 评论数量
  51. rcmd_reason = item['rcmd_reason']['content'] # 推荐原因
  52. pubdate = item['pubdate'] # 发布日期 这里是时间戳类型 需要进行转化
  53. pubdate = timestamp_to_timestr(pubdate) # 时间转换
  54. print(title, owner_name, view, video_link)
  55. # 写入文件
  56. f.write(str(count) + "." + title + '\n')
  57. f.write("发布日期:"+str(pubdate)+"\n")
  58. f.write("视频简介:"+des+"\n")
  59. f.write("时长:" + str(duration) + '秒\n')
  60. f.write("up主昵称:" + owner_name + '\n')
  61. f.write("视频链接:" + video_link + '\n')
  62. f.write("观看次数:" + str(view) + '\n')
  63. f.write("点赞量:" + str(like) + '\n')
  64. f.write("发布ip:" + location + '\n')
  65. f.write("\n")
  66. count+=1
  67. print("第", pn, "页爬取完毕")
  68. except Exception as r:
  69. print(pn, "页爬取异常:", r)
  70. # f.close()
  71. print("任务完成")
  72. if __name__ == '__main__':
  73. # 启动浏览器
  74. path = 'chromedriver.exe'
  75. browser = webdriver.Chrome(path)
  76. cookie_url = 'https://www.bilibili.com/v/popular/all'
  77. browser.get(cookie_url)
  78. cookies = browser.get_cookies()
  79. # 计数
  80. count=1
  81. for pn in range(1,21):
  82. url = 'https://api.bilibili.com/x/web-interface/popular?ps=20&pn='+str(pn)
  83. get_content(url=url,pn=pn,count=count)
  84. browser.execute_script('window.scrollBy(0,500)')
  85. # 停留
  86. time.sleep(1)
  87. count+=20
  88. print("爬取完毕")
  89. browser.close()
  90. f.close()

此外,获取到的视频信息可以用作词频分析,词云制作,构图等等,更多功能可以自行探索。

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

闽ICP备14008679号