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 相关文章推荐
python读取浮点数和读取文本文件示例
May 06 Python
python快速查找算法应用实例
Sep 26 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
Python中断言Assertion的一些改进方案
Oct 27 Python
Python使用asyncio包处理并发详解
Sep 09 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
matplotlib绘制多子图共享鼠标光标的方法示例
Jan 08 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中使用与Perl兼容的正则表达式
2006/11/26 PHP
php $_SERVER["REQUEST_URI"]获取值的通用解决方法
2010/06/21 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
微信小程序实现自定义modal弹窗封装的方法
2018/06/15 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
python实现雨滴下落到地面效果
2018/06/21 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
python pycharm的安装及其使用
2019/10/11 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
市场营销专业毕业生自荐信
2013/11/02 职场文书
应届生自荐信范文
2014/02/21 职场文书
大学毕业寄语大全
2014/04/10 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
人大调研汇报材料
2014/08/14 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
2015年圣诞节寄语
2015/08/17 职场文书