专栏首页Python小二当 Python 爬虫搭配起 Bilibili 唧唧,奇怪的生产力出现了

当 Python 爬虫搭配起 Bilibili 唧唧,奇怪的生产力出现了

作者:Ericam_ http://suo.im/6mM4Ur


前言

最近需要大规模下载B站视频,同时要将下载好的视频用BV号进行重命名,最后上传至服务器。这个工作一开始我是完全手工完成的,通过游猴来下载,可是下载几十个视频还好,再多一点的话真是太烦了,而且生产力低下,因此诞生了编写脚本的想法。

一开始我需要在B站搜索关键词,然后不断点开视频后进行下载,同时在视频下载后还需要找到这个视频来修改BV号,效率实在太低,特别是当下载的视频多了,再返回来寻找它对应的BV号时也是个很繁琐的过程,因此决定进行编写python脚本。

本次的脚本可以大幅度提高工作效率,但是它并不是全自动完成任务的,毕竟我们用到了Bilibili唧唧。(唧唧真的很好用,其实也可以完全做成全自动,但我觉得没什么必要了,效率已经很高啦~)

大家如果还有什么更好的建议欢迎评论告诉我

最后,给个赞吧,亲~

概述

简要介绍一下工作流程:

(1)通过爬虫爬取一堆视频BV号,存放于txt文件中,如下所示:

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

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

正文

爬虫部分

1.依赖库

  • requests
  • lxml

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.爬取结果

唧唧下载视频

给出唧唧的链接:http://jijidown.com/,很好用的小工具。

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

视频重命名

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

为什么需要将它们进行改名呢,因为如果当视频数量越来越多时,比如几千几万时,通过名字便会越来越难以管理,同时也难以进行去重,很大概率会不断下载重复的视频。

在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小二(chengxuzhijian)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python自动化办公之Word,全网最全看这一篇就够了

    使用Python操作word大部分情况都是写操作,也有少许情况会用到读操作,在本次教程中都会进行讲解,本次课程主要用到以下4个库,请大家提前安装。

    Python小二
  • Python 进阶(五):数据库操作之 SQLite

    SQLite 是一种嵌入式关系型数据库,其本质就是一个文件,它占用资源低、处理速度快、跨平台、可与 Python、Java 等多种编程语言结合使用。

    Python小二
  • 《民国奇探》的弹幕有点逗比,用 Python 爬下来看看

    电视剧《民国奇探》是一部充斥着逗比风的探案剧,剧中主要角色:三土、四爷、白小姐,三土这个角色类似于《名侦探柯南》中的柯南但带有搞笑属性,四爷则类似于毛利小五郎但...

    Python小二
  • 鼠标一键定位文献,谷歌学术就该这样用。

    小通之前分享过一键下载sci文章的方法,受到大家的热烈欢迎。此外,童鞋希望小通再推荐一种检索文献的高效方法。

    百味科研芝士
  • 开始 Flutter 实战项目-女装大佬

    《Flutter 入门指南》差不多就到了要完结说再见的时候了,这两天在家里想了想要做一个什么样的项目来练一下手,顺便也为 Flutter 学习小组交出一份合理的...

    icepy
  • 海康大华网络摄像头视频直播流媒体服务器视频广场显示暂无快照的问题解决

    我们的EasyNVR视频流媒体服务器分为Windows版本和linux版本,两个版本没有任何区别,是为了适应不同使用者的操作习惯。一般我在进行新版本测试的时候,...

    EasyNVR
  • 如何跨app对其他应用进行虚拟点击

    可能很多人在Android开发中会有这样的想法,如何模拟屏幕点击,向另外的app发送点击事件,来达到某种目的。 就像我们平时用 adb shell sendev...

    PhoenixZheng
  • CDH5升级到CDP7.1

    将Cloudera Enterprise CDH升级到更高版本的CDH和CDP数据中心版。

    大数据杂货铺
  • Spark Core快速入门系列(5) | RDD 中函数的传递

    我们进行 Spark 进行编程的时候, 初始化工作是在 driver端完成的, 而实际的运行程序是在executor端进行的. 所以就涉及到了进程间的通讯, 数...

    不温卜火
  • 基于hadoop生态圈的数据仓库实践 —— 进阶技术(十五)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    用户1148526

扫码关注云+社区

领取腾讯云代金券