python数据采集练习 根据指定av号下载bilibili视频(五)【获取视频信息】

def getDetails(arcUrl):  # 获取视频长度,标题,子视频数,打印视频质量选项,让用户输入,获得quailty(顺便修改refer)
    global quality
    global headers
    global fps
    global quality
    global title
    global pages
    global titles
    headers["Referer"] = arcUrl  # 修改referer

    driver.get("view-source:" + arcUrl)  # 浏览器黑魔法
    data = driver.page_source
    """fp = open("data.txt", 'w')
    fp.write(data)
    fp.close()"""

    titleScripText = re.findall("window.__INITIAL_STATE__=.*?;\(function\(\)", data, re.S)[0]
    titleScripText = titleScripText.replace("window.__INITIAL_STATE__=", '')
    titleScripText = titleScripText.replace(";(function()", '')

    """fp = open("datatitle.txt", 'w')
    fp.write(titleScripText)
    fp.close()"""

    titleScripText = json.loads(titleScripText)
    title = titleScripText['videoData']['title']
    print("本视频为:  %s " % title)

    pages = len(titleScripText['videoData']['pages'])
    if pages != 1:
        if not int(input("其中包含%d个视频,是否全部下载[1=是,0=否(请输入数字,默认只下载第一个视频)]:" % pages)):
            titles.append(titleScripText['videoData']['pages'][0]['part'])
            pages = 1
        else:
            print("\n视频列表为:")
            for i in range(pages):
                titles.append(titleScripText['videoData']['pages'][i]['part'])  # 如果titles不为空那么需要下载titles内所有视频
                print('--' + titles[i])
    else:
        titles.append(titleScripText['videoData']['title'])

    qualityScripText = re.findall("window.__playinfo__=.*?/script", data)[0]
    qualityScripText = qualityScripText.replace("window.__playinfo__=", '')
    qualityScripText = qualityScripText.replace("""<span class="html-tag">&lt;/script""", '')

    """fp = open("dataquality.txt", 'w')
    fp.write(qualityScripText)
    fp.close()"""

    qualityScripText = json.loads(qualityScripText)  # 视频信息解析完成
    print("\n本视频清晰度有:")
    for i in range(len(qualityScripText['accept_description'])):
        print(i, qualityScripText['accept_description'][i])
    qualityValue = int(input("请输入序号以选择下载视频的清晰度(1080+需要大会员): "))
    quality = qualityValue
    qualityValue = qualityScripText['accept_quality'][qualityValue]
    if qualityValue == 112:
        fps = 60
    print("清晰度选择完成")

这里无非就是通过正则表达式提取页面信息罢了。

但是,还是有几点要注意的:

1.审查元素与查看网页源代码的区别

在提取多P视频信息时,有一个window.__INITIAL_STATE__ 项属于javascript,包含着其他视频的题目,个数等信息。它在网页源代码中存在,而在审查元素中却消失了。

网页源代码是服务器直接发给浏览器的代码,浏览器将代码渲染执行后变为审查元素并在浏览器上展示出来。selenium会尽力模仿浏览器的行为,driver.page_source 提取的网页元素基本与审查元素等价,而不是网页源代码。

我搜索了很多地方,也没能找到那个库或方法能直接将网页源代码提取出来,因为urllib是不会处理javascript的,自然被排除在外,处理javacript最好的方法貌似就是selenium,但它不会返回网页源码,只会返回处理过的源码。

这里我想到一点,Chrome浏览器中在任何链接前加入view-source: 后打开会直接显示当前链接获得的源码,所以我抓去这一页面的page_source,最终将我所需要的信息提取出来了。

2.header的修改

headers = {
    'User-Agent': '[]',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-cn',
    'Referer': 'https://www.bilibili.com',
    'Origin': 'https://www.bilibili.com',
    'Accept': '*/*',
    'Cache-Control': 'no-cache',
    'Pragma': 'no-cache'
}

最开始获得bilibili下载链接调用下载函数下载视频时,经常会报403,954等错误。bilibili对于下载视频的请求似乎一定要加上header才能成功访问(证明你是个浏览器,而不是机器人之类的)。然而加上header后访问失败的概率依然不低。

经过仔细研究,发现对于每个视频的下载,所提交的headerreferer都是有变化的。referer会变为当前视频链接。我将每个视频的referer更改后视频下载的成功率飙升,基本没再遇到下载问题。所以说header中的referer是一定要修改的。

当然,这里的headerreferer之类的都是下载视频时需要用到的东西,如果不懂,将下载之前我会再详细讲。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,可以使用Python中的第三方库"you-get"来下载Bilibili视频。具体操作步骤如下: 1. 安装you-get库:在命令行中输入"pip install you-get",等待安装完成。 2. 打开Bilibili网站,找到想要下载视频,复制视频链接。 3. 在命令行中输入"you-get [视频链接]",等待下载完成。 注意:you-get支持下载Bilibili视频的原画、高清、普通等多种清晰度,可以在命令行中添加"-o [清晰度]"来指定下载清晰度。例如:"you-get -o 108P [视频链接]"表示下载108P清晰度的视频。 ### 回答2: Python是一种极其流行的编程语言,也是许多数据科学、爬虫等领域的首选编程语言。如果您想要下载Bilibili视频而又不想费力气去找相关软件,Python可以为您提供一种更好的解决办法。 首先,您需要确保您的电脑上装有Python解释器,可以在官方网站上进行下载。接下来,您需要安装一个Python模块——you-get。You-get是一个开源的终端下载器,支持多种网站的视频下载,包括Bilibili。 安装you-get非常简单,只需要在终端输入: ```python pip install you-get ``` 安装完成后,您就可以在终端输入以下命令来下载Bilibili视频了: ```python you-get -o [保存路径] [Bilibili视频链接] ``` 其中,-o选项是用来指定保存路径的,例如我想要把视频保存在桌面上,可以输入以下命令: ```python you-get -o ~/Desktop https://www.bilibili.com/video/av72866042 ``` 如果您想要下载Bilibili视频的弹幕,只需要在命令后加上-D选项即可: ```python you-get -o ~/Desktop -D https://www.bilibili.com/video/av72866042 ``` 这样您就可以轻松地使用Python下载Bilibili视频了。不过需要注意的是,这种下载方式只适用于下载个人使用的视频,不要用于商业用途或传播侵权内容。 ### 回答3: Python作为一种高级编程语言,目前在数据分析、人工智能等领域得到了广泛的应用,在各种技术中,Python也扮演着重要的角色。本文将介绍如何使用Python下载Bilibili视频。而Python是一种通用语言,新手也可以通过学习Python,掌握这项技能。 使用Python下载Bilibili视频的方法如下: 1.安装相关库 在Python中,有一些库可以让我们很容易地下载Bilibili视频,比如youtube-dl和you-get等。在安装这些库之前,确保你的Python环境已经搭建好了。 使用pip安装youtube-dl 运行以下代码: ``` pip install youtube_dl ``` 使用pip安装you-get 运行以下代码: ``` pip install you-get ``` 2.选择要下载视频 使用Bilibili官方网站或手机应用程序,选择想要下载视频并获得视频的url地址。 3.使用命令行下载视频 a.使用youtube-dl下载 打开终端,输入以下代码: ``` youtube-dl -f <video format> <video url> ``` 其中video format是你想下载视频格式,video url是你想要下载视频链接。 例如:如果你想下载BiliBili上的MP4格式视频,可以使用以下代码: ``` youtube-dl -f mp4 <video url> ``` b.使用you-get下载 打开终端,输入以下代码: ``` you-get <video url> ``` 例如:如果你想下载BiliBili上的视频,可以使用以下代码: ``` you-get https://www.bilibili.com/video/BVXXXXXXXXX/ ``` 4.下载到本地 视频下载完成后,你可以在你选择的文件夹中找到已下载视频。 总结: Python为后来的程序提供了许多快速高效的解决方案,并且在下载Bilibili视频时提供了优越的扩展性和强大的媒体技术。无论是初学者还是专业人士,都可以学习和使用这些库,通过Python语言的优势来下载Bilibili视频。希望这篇文章可以帮助你快速地下载自己喜欢的Bilibili视频
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值