B站视频爬虫

今天更新一个B站视频爬取的爬虫

#相互交流,相互学习,有不足之处,还请交流探讨
#导入所需要的python第三方库

import requests
#import pprint     #调用pprint.pprint()函数,让json数据输出格式优化   pprint.pprint(r.json())
import random
import time
import os
from urllib.parse import urlencode     #用于编码url连接

#设置请求头,模拟浏览器,可以多添加参数防止反爬

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3754.400 QQBrowser/10.5.3981.400',
    'Referer': 'https://www.bilibili.com/v/life/daily/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.96'
}

base_url = "http://api.vc.bilibili.com/board/v1/ranking/top?"

##获取页面连接url,num为获取的页数,num=1为获取一页

def get_Pageurl(num):     #获取页面连接url,num为获取的页数,num=1为获取一页
    Pageurls = []
    for i in range(num):
        parms = {
            "page_size":"10",
            "next_offset":i*10 + 1,
            "tag":"今日热门",
            "platform":"pc"
        }
        PageUrl = base_url + urlencode(parms)
        Pageurls.append(PageUrl)
    print("===获取页面url连接成功===")
    return Pageurls

##获取视频名称以及地址

def get_Video(url):     #获取视频名称以及地址
    videos = []
    r = requests.get(url)
    r_json = r.json()    #因请求返回的为一个json数据,用r.json()解析出来,实质可以看作一个字典数据和列表数据类型不断相互嵌套
    for itme in (r_json["data"]["items"]):   #data在字典数据类型,items在列表数据类型 
        item = itme["item"]       #第一个视频
        # pprint.pprint(itmes)
#        name = item['description']
        url = item['video_playurl']
        video = {
#            'name':name,
            'url':url
        }
        videos.append(video)
    print("===获取视频名称及地址成功===")
    return videos

##保存视频

def Save_Video(url,num):     ##保存视频
    dir=os.path.abspath('.')  #返回当前目录的绝对路径
    root=os.path.join(dir,'video\\')   #连接两个或更多的路径名
    #root = "dir\\video\\"
    path = root + "{}.mp4".format(num)
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            r_mp4 = requests.get(url,headers=headers,stream=True)   #如果视频较大,加入stream参数,分段下载
            if r_mp4.status_code == 200:
                for data in r_mp4.iter_content(chunk_size=1024):     #定义每次读取的数据量
                    with open(path,mode="ab") as f:      #ab为追加写二进制模式
                        f.write(data)     #数据流写入
                print("文件保存成功{}项".format(num))
        else:
            print("文件已存在")
    except:
        print("爬取失败")

#爬虫部分

def Spider(num):
    count = 1
    Pageurls = get_Pageurl(num)      #获取页面url
    for Pageurl in Pageurls:
        Video_urls = get_Video(Pageurl)      #获取视频名称以及地址
        for Video_url in Video_urls:        #Video_url为一个字典类型,Video_urls为一个列表类型
            Save_Video(Video_url['url'],count)       #保存视频
            count +=1
            time.sleep(random.randint(2,6))   #加入随机延时,防止网站反爬
            # break

#主函数部分

if __name__ == '__main__':
    Spider(1)     #参数为爬取页数
此次爬虫编写也是比较头疼,网页中的视频连接地址存在json数据中,并非直接放在网页的html代码上,通过几番查找才最终确定连接所在位置,由于还在初学阶段,顺便请教以下各位大佬,如何才能快速定位网页中数据位置,特别是不是在直接的网页html代码中显示的,谢谢!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值