Python爬虫之爬取B站首页热门推荐视频

Posted 汤米先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫之爬取B站首页热门推荐视频相关的知识,希望对你有一定的参考价值。


前言

众所周知,b站上有很多视频资源,非常诱人,但是这些视频又不好下载,于是我就琢磨着爬取了一下b站首页的热门推荐视频。

原理

一.首先先找出推荐视频栏所在位置并找到各个视频的url

通过xpath解析定位

urls="https://www.bilibili.com/"
page_text= send_request(urls).text
tree = etree.html(page_text)
li_list= tree.xpath('//div[@class="rcmd-box"]/div')

for li in li_list:
    detail_url= 'https:'+li.xpath('./div/a/@href')[0]
    name = li.xpath('./div/a/div/p[1]/text()')[0]

二. 找到音频相关标签和url

找到类似的标签

用正则解析写出音频对应的url

  json_data = re.findall(r'<script>window.__playinfo__=(.*?)</script>', html_data)[0]
    json_data = json.loads(json_data)
    audio_url = json_data["data"]["dash"]["audio"][0]["backupUrl"][0]
    video_url = json_data["data"]["dash"]["video"][0]["backupUrl"][0]

三. 进行UI伪装

网站又反爬虫机制,也就是UI检测,这里只有进行UI伪装进行反反爬虫操作才能爬取到音频内容

headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36","referer": "https://message.bilibili.com/"}

四. 音视频合并

由于音频和视频是分开下载的,所以要将他们合并到一起,这里需要用到ffmpeg插件。

 os.rename(name + ".mp3","1.mp3")
    os.rename(name + ".mp4","1.mp4")
    subprocess.call("ffmpeg -i 1.mp4 -i 1.mp3 -c:v copy -c:a aac -strict experimental output.mp4", shell=True)
    os.rename("output.mp4", name + ".mp4")
    os.remove("1.mp3")
    os.remove("1.mp4")
    print("完成合并 " + name + "的视频!")

完整代码

import requests
import re
import json
import os
import subprocess
from multiprocessing.dummy import Pool
from lxml import html
etree = html.etree
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36","referer": "https://message.bilibili.com/"
}
def send_request(url):
    response = requests.get(url=url, headers=headers)
    response.encodings=''
    return response
#对下述url发起请求解析出视频详情页的url和视频名称
urls="https://www.bilibili.com/"
page_text= send_request(urls).text
tree = etree.HTML(page_text)
li_list= tree.xpath('//div[@class="rcmd-box"]/div')
#储存所有的视频连接

for li in li_list:
    detail_url= 'https:'+li.xpath('./div/a/@href')[0]
    name = li.xpath('./div/a/div/p[1]/text()')[0]
    #对详情页的url发起请求
    print(detail_url+name)
    # detail_page_text = requests.get(url=detail_url,headers=headers).text
    html_data = send_request(detail_url).text
    #从详情页中解析出视频的url
    json_data = re.findall(r'<script>window.__playinfo__=(.*?)</script>', html_data)[0]
    json_data = json.loads(json_data)
    audio_url = json_data["data"]["dash"]["audio"][0]["backupUrl"][0]
    video_url = json_data["data"]["dash"]["video"][0]["backupUrl"][0]
    audio_data = send_request(audio_url).content
    video_data = send_request(video_url).content
    with open(name + ".mp3", "wb") as f:
        f.write(audio_data)
    with open(name + ".mp4", "wb") as f:
        f.write(video_data)
    print(name, '下载成功!')
    os.rename(name + ".mp3","1.mp3")
    os.rename(name + ".mp4","1.mp4")
    subprocess.call("ffmpeg -i 1.mp4 -i 1.mp3 -c:v copy -c:a aac -strict experimental output.mp4", shell=True)
    os.rename("output.mp4", name + ".mp4")
    os.remove("1.mp3")
    os.remove("1.mp4")
    print("完成合并 " + name + "的视频!")

运行结果

红色部分不是报错,是音视频合并提示
后面还有视频,由于下载时间有点长,我终止了下载,只下了一个给大家看看样子。

以上是关于Python爬虫之爬取B站首页热门推荐视频的主要内容,如果未能解决你的问题,请参考以下文章

爬虫之爬取豆瓣热门图书的名字

Python爬虫爬取各大热门短视频平台视频

Python漫画爬虫:B站!热血动漫番太好看了!用Python爬取热门的岛国动漫大片,内存都爆了,爬虫这也太牛了!

python爬虫实例详细介绍之爬取大众点评的数据

Scrapy爬虫爬取B站视频标题及链接

scrapy初探之爬取武sir首页博客