python爬虫搭配起Bilibili唧唧的流程分析


Posted in Python onDecember 01, 2020

前言

最近需要大规模下载B站视频,同时要将下载好的视频用BV号进行重命名,最后上传至服务器。这个工作一开始我是完全手工完成的,通过游猴来下载,可是下载几十个视频还好,再多一点的话真是太烦了,而且生产力低下,因此诞生了编写脚本的想法。
一开始我需要在B站搜索关键词,然后不断点开视频后进行下载,同时在视频下载后还需要找到这个视频来修改BV号,效率实在太低,特别是当下载的视频多了,再返回来寻找它对应的BV号时也是个很繁琐的过程,因此决定进行编写python脚本。
本次的脚本可以大幅度提高工作效率,但是它并不是全自动完成任务的,毕竟我们用到了Bilibili唧唧。(唧唧真的很好用,其实也可以完全做成全自动,但我觉得没什么必要了,效率已经很高啦~)
大家如果还有什么更好的建议欢迎评论告诉我。
最后,给个赞吧,亲~

概述

简要介绍一下工作流程:
(1)通过爬虫爬取一堆视频BV号,存放于txt文件中,如下所示:

python爬虫搭配起Bilibili唧唧的流程分析

(2)不断复制BV号,唧唧便会自动进行下载视频

(3)通过脚本将下载好的视频一键化改名

python爬虫搭配起Bilibili唧唧的流程分析

正文

爬虫部分

1.依赖库

requestsl

xml

2.代码
相关讲解已在注释标注。

'''
author:Ericam
description: 用于爬取b站视频链接
'''
import requests
import re
from lxml import etree
import time

'''
该函数用于解析爬取的网页。
提取出网页里视频的url链接以及对应的视频名。
'''
def getHref(url,page):
 try:
 req = requests.get(url,timeout=5,headers=headers)
 html = req.text
 data = etree.HTML(html)
 '''
 page-1://*[@id="all-list"]/div[1]/div[2]/ul[@class="video-list"]/li
 other://*[@id="all-list"]/div[1]/ul[@class="video-list"]/li
 '''
 pattern = '//*[@id="all-list"]/div[1]/div[2]/ul[contains(@class,"video-list")]/li' if page == 1 else '//*[@id="all-list"]/div[1]/ul[contains(@class,"video-list")]/li'
 vurlList = data.xpath(pattern)
 for li in vurlList:
  vurl = li.xpath(".//a/attribute::href")[0]
  title = li.xpath(".//a/attribute::title")[0]
  yield vurl,title
 except:
 print('第%d页爬取失败' % page)
 print('Unfortunitely -- An Unknow Error Happened, Please wait 3 seconds')
 time.sleep(3)

'''
该函数用于正则提取,将url内的BV号提取出来
'''
def getBv(href):
 pattern = re.compile('(BV.*?)\?')
 data = re.search(pattern,href)
 if data == None:
 return ''
 return data.group(1)

if __name__ == "__main__":

 #头部伪装
 headers = {
 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'
 }
 hrefList = []
 titleList = []
 #需要爬取多少页,自行进行修改,本代码测试1~2页
 for i in range(1,3): 
 url = "https://search.bilibili.com/all?keyword=歪嘴战神&page={0}".format(i) #修改keyword后的关键字即可
 l = getHref(url,i)
 for vurl,title in l:
  hrefList.append(vurl)
  titleList.append(title)
 print("第{0}页爬取结束".format(i))
 time.sleep(2)
 
 print("---------------------------开始截取BV号-----------------------------")
 for i in range(len(hrefList)):
 hrefList[i] = getBv(hrefList[i])
 with open("bv.txt",'w',encoding='utf-8') as f:
 for i in range(len(hrefList)): 
  f.write(hrefList[i]+"\t"+titleList[i]+"\n")
 print("爬取结束")

3.爬取结果

python爬虫搭配起Bilibili唧唧的流程分析

唧唧下载视频

给出唧唧的链接,唧唧,很好用的小工具。
我们只需要将刚才爬取好的链接放在一边,不断复制BV号,然后唧唧进行下载即可。

python爬虫搭配起Bilibili唧唧的流程分析

视频重命名

唧唧下载好的视频如下所示:

python爬虫搭配起Bilibili唧唧的流程分析

为什么需要将它们进行改名呢,因为如果当视频数量越来越多时,比如几千几万时,通过名字便会越来越难以管理,同时也难以进行去重,很大概率会不断下载重复的视频。
在B站,BV号便是每个视频的“身份证”(主键),因此用其进行视频命名可以方便日后管理,同时也方便进行去重。

代码

'''
author:Ericam
description: 用于将下载下来的b站视频重命名,命名格式为bv号
'''
import os
import difflib

if __name__ == '__main__':
 
 bvpath = os.path.join("D:/","Coding","python","Python爬虫")
 os.chdir(bvpath)
 d = {}
 '''
 bvdownload.txt里存放bv号与title名
 若之前爬虫爬取了几千个,而唧唧只下载了几百个,便可以将这些已下载的bv和title复制到
 bvdownload.txt中,将已下载的视频进行改名
 '''
 with open("bvdownload.txt",'r',encoding='utf-8')as f:
 lines = f.readlines()
 for val in lines:
  val = val.strip("\n")
  data = val.split("\t")
  bv = data[0]
  title = data[1]
  d[title] = bv
 
 #视频存放位置
 path = 'F:/bilibili视频/'
 os.chdir(path)
 videoList = os.listdir()
 
 #开始进行模糊匹配
 for key in d:
 video = difflib.get_close_matches(key,videoList,1, cutoff=0.3)
 if len(video) == 0:
  continue
 video = video[0]
 #检查视频是否已存在,若存在则删除视频
 if os.path.isfile(d[key]+".mp4") and os.path.isfile(video):
  os.remove(video)
 else:
  if os.path.isfile(video):
  os.rename(video,d[key]+".mp4")
 print("重命名完成!")

结果演示

重命名完成的视频列表如下:

python爬虫搭配起Bilibili唧唧的流程分析

到此这篇关于python爬虫搭配起Bilibili唧唧的流程分析的文章就介绍到这了,更多相关python爬虫Bilibili内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
Flask框架学习笔记之消息提示与异常处理操作详解
Aug 15 Python
python3实现微型的web服务器
Sep 03 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
python匿名函数的使用方法解析
Oct 10 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
python 中的[:-1]和[::-1]的具体使用
Feb 13 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 #Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 #Python
使用python爬取抖音app视频的实例代码
Dec 01 #Python
基于Python实现粒子滤波效果
Dec 01 #Python
Django集成MongoDB实现过程解析
Dec 01 #Python
基于Django快速集成Echarts代码示例
Dec 01 #Python
Python更改pip镜像源的方法示例
Dec 01 #Python
You might like
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
JavaScript如何操作css
2020/10/24 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
Python中的Classes和Metaclasses详解
2015/04/02 Python
python中__call__内置函数用法实例
2015/06/04 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
中学生运动会入场词
2014/02/12 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
英文产品推荐信
2015/03/27 职场文书
旅行社计调工作总结
2015/08/12 职场文书
2016党校学习心得体会
2016/01/07 职场文书
Django与数据库交互的实现
2021/06/03 Python
python基础之模块的导入
2021/10/24 Python
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server
redis protocol通信协议及使用详解
2022/07/15 Redis