写点什么

Python 抓取 B 站"卡塔尔 世界杯"的视频数据

作者:勇士
  • 2022-12-10
    山东
  • 本文字数:2192 字

    阅读完需:约 7 分钟

Python抓取B站"卡塔尔 世界杯"的视频数据

最近什么最火?非 #卡塔尔世界杯 #莫属,今日凌晨两场点球大战,巴西败北(我巴西球迷,祝马儿加油吧),梅西晋级。那么编程怎么蹭蹭世界杯的热点呢?先用 python 爬一些世界杯视频数据看看吧。

分析

一、步骤

  1. 打开 B 站,在首页输入搜索关键字,点击查询跳转到搜索结果页面


  1. 读取页面信息,并抓取所需数据,然后点击下一页


  1. 循环上面过程直至最后一页。


所需数据: 标题、播放量、弹幕数、UP 主、发布时间

二、技术

Python + selenium + beautifulsoup + xlwt


使用命令 pip list 检查下面包是否已经安装,没有安装可以使用下面命令进行安装,我的是 Pip3

pip3 install selenium==3.8.0 ## 4.0版本之后不支持plantomJspip3 install beautifulsoup4pip3 install lxmlpip3 install xlwt
复制代码


安装 chrome 驱动,先查看 chrome 浏览器版本,找到对应的版本号(最接近自己的),下载,然后解压到任意目录即可。


chrome 驱动下载地址:

https://registry.npmmirror.com/binary.html?path=chromedriver/

代码示例

1、打开 B 站

# 创建chrome浏览器驱动,加载上面下载的驱动安装路径driver = webdriver.Chrome(executable_path = '/Users/warrior/opt/chromedriver')# 打开网址driver.get('https://www.bilibili.com/')
复制代码

2、点击首页搜索并返回页码

# 取得浏览器中的搜索框 并输入查询关键字input = WAIT.until(EC.presence_of_element_located((By.XPATH,"//div[@class='nav-search-content']/input[@class='nav-search-input']")))input.send_keys(key_words)
# 点击查询按钮submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='nav-search-btn']")))submit.click()
# 选中第二个标签页all_h = driver.window_handlesdriver.switch_to_window(all_h[1])
## 取最大页码maxbtn = WAIT.until(EC.presence_of_element_located((By.XPATH, "//div[@class='vui_pagenation--btns']//button[last()-1]")))return int(maxbtn.text)
复制代码

3、页面加载并读取

# 等待页面加载完成(判断是否有下一页按钮)WAIT.until(EC.presence_of_element_located((By.XPATH, "//div[@class='vui_pagenation--btns']//button[contains(text(), '下一页')]")))
# 获得页面源代码html = driver.page_source
复制代码

4、bs 获取页面中数据

soup = BeautifulSoup(html, 'lxml')# 得到视频listvidos = soup.find(class_='video-list').find_all(class_='bili-video-card')# 全局list变量,用于存储抓取的数据global vlist
for item in vidos: # 取标题 title = item.find("h3",class_="bili-video-card__info--tit").get('title') # 取视频链接 link = item.find("a", class_="").get('href') link = "https://" + link # 播放数 view_num = item.find("span",class_="bili-video-card__stats--item").span.string # 弹幕数 danmu = item.find_all("span",class_="bili-video-card__stats--item")[1].span.string # UP主 author = item.find("span", class_="bili-video-card__info--author").string # 日期 datee = item.find("span",class_="bili-video-card__info--date").string datee = datee.strip()[1:] print(title + " " + link + " " + view_num) # 将数据放入到vlist中 vlist.append([title, link, view_num, danmu, author, datee])
复制代码

5、点击下一页

# 取得下一页按钮nextbtn = WAIT.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='vui_pagenation--btns']//button[contains(text(), '下一页')]")))# 点击nextbtn.click()
复制代码

6、保存数据到 Excel

# 创建excelwb = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = wb.add_sheet('b站搜索结果',cell_overwrite_ok=True)sheet.write(0,0,'序号')sheet.write(0,1,'名称')sheet.write(0,2,'链接')sheet.write(0,3,'观看次数')sheet.write(0,4,'弹幕数')sheet.write(0,5,'作者')sheet.write(0,6,'发布时间')
global index# 遍历并且填入数据for m in vlist: sheet.write(index, 0, index) sheet.write(index, 1, m[0]) sheet.write(index, 2, m[1]) sheet.write(index, 3, m[2]) sheet.write(index, 4, m[3]) sheet.write(index, 5, m[4]) sheet.write(index, 6, m[5]) index = index + 1
# 保存输出Excel 文件wb.save(key_words + "b站搜索结果.xlsx")
复制代码

7、入口函数

if __name__ == '__main__':  try:    # 打开页面并搜索,返回最大页码    total = first_search(key_words)    # 循环    for i in range(2, total+1):      # 点击下一页      next_page(i)  except:    print("异常")  finally:    # 关闭浏览器    driver.close()  ## 保存数据到Excel  save_to_excel(vlist)
复制代码

结果

如图所示

分别搜索了"卡塔尔 世界杯" 和"梅西 阿根廷",生成了两个 Excel 文件,可以修改变量 key_words 检索 B 站任意数据结果

问题

  1. 主要是 XPath 取页面元素的问题,取不到页面元素,多检查是否漏(多)括号。

  2. 读不到页面元素,可能是网络加载慢导致的,一:可以 time.sleep(1) 1-2 秒一下试试;二:重新运行试试。

  3. B 站有反爬机制,UI 有可能升级更新,程序报错找不到对应 html 元素,这个只能事先说明:2022-12-10 日的代码

完整代码

Github: https://github.com/BraveChi/bzscrpy.git

PS

  1. WebDriveWait 类selenium 之WebDriveWait类的等待机制


发布于: 刚刚阅读数: 3
用户头像

勇士

关注

士勇赴知己,义重身固轻 2020-07-30 加入

还未添加个人简介

评论

发布
暂无评论
Python抓取B站"卡塔尔 世界杯"的视频数据_Python_勇士_InfoQ写作社区