当前位置:   article > 正文

B站关键词视频信息爬虫(可直接运行)_爬虫爬取bilibili关键词

爬虫爬取bilibili关键词

目录

1.爬取内容

2.代码及解析

1)导入库

2)发送请求

 3)解析结果

 4)进入视频链接,爬更多内容


1.爬取内容

搜索关键词:跨年

视频标题、发布时间、视频链接、up主id、up主首页链接

2.代码及解析

1)导入库

  1. import requests # 导入用于发送HTTP请求的requests库
  2. from bs4 import BeautifulSoup # 导入用于解析HTML的BeautifulSoup库
  3. import pandas as pd # 导入用于处理数据的pandas库

2)发送请求

网址(只需修改文字即可),page为第1页,设置请求头(跳过反爬)

  1. # 网址
  2. url = "https://search.bilibili.com/all?vt=53655423&keyword=跨年&page=1"
  3. # 设置请求头,用于模拟浏览器发送请求
  4. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
  5. # 发送 HTTP 请求并获取响应内容
  6. response = requests.get(url=url, headers=headers)
  7. soup = BeautifulSoup(response.content, "html.parser")

 3)解析结果

       在B站搜索界面,按F12或者浏览器右上角菜单,可以打开开发者工具然后在网页结构中,鼠标移动到指定位置,左边会有对应的颜色显示,当前网页结构是哪部分内容,然后找到自己想要的内容, 就可以开始解析了

  1. # 解析搜索结果
  2. items = soup.find_all("div", class_="bili-video-card__info __scale-disable")
  3. # 创建空的DataFrame,用于存储解析后的数据
  4. titles = pd.DataFrame([], columns=['标题'])
  5. times = pd.DataFrame([], columns=['发布时间'])
  6. urls = pd.DataFrame([], columns=['网址'])
  7. ups = pd.DataFrame([], columns=['up主id'])
  8. upurls = pd.DataFrame([], columns=['up主首页'])
  9. for item in items:
  10. # 提取视频标题
  11. title = item.find('h3', class_='bili-video-card__info--tit').text
  12. title = pd.DataFrame([title], columns=['标题'])
  13. # 提取发布时间
  14. time = item.find('span', class_='bili-video-card__info--date').get_text(strip=True)
  15. time = pd.DataFrame([time], columns=['发布时间'])
  16. # 提取视频链接
  17. url = item.find('a', href=True)['href']
  18. url = pd.DataFrame([url], columns=['网址'])
  19. # 提取up主id
  20. up = item.find('span', class_='bili-video-card__info--author').get_text(strip=True)
  21. up = pd.DataFrame([up], columns=['up主id'])
  22. # 提取up主首页链接
  23. upurl = item.find('a', class_='bili-video-card__info--owner').get('href')
  24. upurl = pd.DataFrame([upurl], columns=['up主首页'])
  25. # 将提取的数据添加到相应的DataFrame中
  26. titles = pd.concat([titles, title], ignore_index=True)
  27. times = pd.concat([times, time], ignore_index=True)
  28. urls = pd.concat([urls, url], ignore_index=True)
  29. ups = pd.concat([ups, up], ignore_index=True)
  30. upurls = pd.concat([upurls, upurl], ignore_index=True)
  31. # 合并所有DataFrame为一个内容DataFrame
  32. contents_1 = pd.concat([titles, times, urls, ups, upurls], axis=1, ignore_index=False)

 4)进入视频链接,爬更多内容

 进入刚才搜索关键词所爬到的,各个视频的链接,然后爬取视频的点赞量、投币量、收藏量、转发量、播放量、弹幕量

  1. # 创建空的DataFrame,用于存储解析后的数据
  2. dianzan = pd.DataFrame([], columns=['点赞量'])
  3. toubi = pd.DataFrame([], columns=['投币量'])
  4. shoucang = pd.DataFrame([], columns=['收藏量'])
  5. zhuanfa = pd.DataFrame([], columns=['转发量'])
  6. bofang = pd.DataFrame([], columns=['播放量'])
  7. danmu = pd.DataFrame([], columns=['弹幕量'])
  8. for www in contents_1['网址']:
  9. url = "https:"+www
  10. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
  11. # 发送 HTTP 请求并获取响应内容
  12. response = requests.get(url=url, headers=headers)
  13. soup = BeautifulSoup(response.content, "html.parser")
  14. # 点赞量的位置
  15. dian = soup.find_all("div", class_="video-like video-toolbar-left-item")
  16. # 投币量的位置
  17. tou = soup.find_all("div", class_="video-coin video-toolbar-left-item")
  18. # 收藏量的位置
  19. shou = soup.find_all("div", class_="video-fav video-toolbar-left-item")
  20. # 转发量的位置
  21. zhuan = soup.find_all("div", class_="video-share-wrap video-toolbar-left-item")
  22. # 播放量的位置
  23. bo = soup.find_all("div", class_="video-info-detail-list")
  24. # 弹幕量的位置
  25. dan = soup.find_all("div", class_="video-info-detail-list")
  26. for d in dian:
  27. d = d.find('span', class_='video-like-info video-toolbar-item-text').get_text(strip=True)
  28. d = pd.DataFrame([d], columns=['点赞量'])
  29. for t in tou:
  30. t = t.find('span', class_='video-coin-info video-toolbar-item-text').get_text(strip=True)
  31. t = pd.DataFrame([t], columns=['投币量'])
  32. for s in shou:
  33. s = s.find('span', class_='video-fav-info video-toolbar-item-text').get_text(strip=True)
  34. s = pd.DataFrame([s], columns=['收藏量'])
  35. for z in zhuan:
  36. z = z.find('span', class_='video-share-info video-toolbar-item-text').get_text(strip=True)
  37. z = pd.DataFrame([z], columns=['转发量'])
  38. for b in bo:
  39. b = b.find('span', class_='view item').get_text(strip=True)
  40. b = pd.DataFrame([b], columns=['播放量'])
  41. for da in dan:
  42. da = da.find('span', class_='dm item').get_text(strip=True)
  43. da = pd.DataFrame([da], columns=['弹幕量'])
  44. # 将提取的数据添加到相应的DataFrame中
  45. dianzan = pd.concat([dianzan, d], ignore_index=True)
  46. toubi = pd.concat([toubi, t], ignore_index=True)
  47. shoucang = pd.concat([shoucang, s], ignore_index=True)
  48. zhuanfa = pd.concat([zhuanfa, z], ignore_index=True)
  49. bofang = pd.concat([bofang, b], ignore_index=True)
  50. danmu = pd.concat([danmu, da], ignore_index=True)
  51. # 合并所有DataFrame为一个内容DataFrame
  52. contents_2 = pd.concat([dianzan, toubi, shoucang, zhuanfa, bofang, danmu], axis=1, ignore_index=False)

5)爬取结果

合并 '在搜索页面爬到的数据' 和 '进入视频链接后爬到的数据'

  1. # 合并
  2. contents = pd.concat([contents_1, contents_2], axis=1)

以下是部分结果展示

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

闽ICP备14008679号