今天更新一个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代码中显示的,谢谢!