网页视频抓取脚本(B站在小视频功能处提供了API接口,(图))

优采云 发布时间: 2021-11-09 08:14

  网页视频抓取脚本(B站在小视频功能处提供了API接口,(图))

  B站在小视频功能上提供了API接口。今天的任务是爬取哔哩哔哩视频~

  B 站视频网址:#/?tab=all

  

  这次爬取视频,爬到了前100~

  我们准备好了~

  API 查找和提取

  我们用F12打开开发者模式,然后在Networking->Name栏下找到这个链接:

  

http://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset=&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc

  让我们检查一下 Headers 属性

  

  

非诚勿扰:正在学习python的小伙伴或者打算学习的,可以私信小编“01”领取资料!

  我们可以看到Request URL的属性值。当我们向下滑动加载视频时,发现只有这个网址没有变化。

  

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

  Next_offset 会不断变化。我们可以猜测,这可能是为了获取下一个视频序列号。我们只需要取出这部分参数,将next_offset写成一个变量值,以JSON格式返回给目标网页即可。

  

  代码实现

  我们通过上面的尝试写了一段代码,发现B站做了一定程度的反爬虫操作,所以需要先获取头部信息,否则下载的视频为空,然后定义params参数存储JSON数据,然后通过requests.get获取参数值信息,以JSON格式返回目标网页。实现代码如下:

  

def get_json(url):

headers = {

'User-Agent':

'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

params = {

'page_size': 10,

'next_offset': str(num),

'tag': '今日热门',

'platform': 'pc'

}

try:

html = requests.get(url,params=params,headers=headers)

return html.json()

except BaseException:

print('request error')

pass

  为了能清楚的看到我们的下载情况,我们折腾了一个下载器,实现代码如下:

  

def download(url,path):

start = time.time() # 开始时间

size = 0

headers = {

'User-Agent':

'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

response = requests.get(url,headers=headers,stream=True) # stream属性必须带上

chunk_size = 1024 # 每次下载的数据大小

content_size = int(response.headers['content-length']) # 总大小

if response.status_code == 200:

print('[文件大小]:%0.2f MB' %(content_size / chunk_size / 1024)) # 换算单位

with open(path,'wb') as file:

for data in response.iter_content(chunk_size=chunk_size):

file.write(data)

size += len(data) # 已下载的文件大小

  效果如下:

  

  总结以上代码,整个实现过程如下:

  

#!/usr/bin/env python#-*-coding:utf-8-*-import requestsimport randomimport timedef get_json(url):

headers = {

'User-Agent':

'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

params = {

'page_size': 10,

'next_offset': str(num),

'tag': '今日热门',

'platform': 'pc'

}

try:

html = requests.get(url,params=params,headers=headers)

return html.json()

except BaseException:

print('request error')

passdef download(url,path):

start = time.time() # 开始时间

size = 0

headers = {

'User-Agent':

'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'

}

response = requests.get(url,headers=headers,stream=True) # stream属性必须带上

chunk_size = 1024 # 每次下载的数据大小

content_size = int(response.headers['content-length']) # 总大小

if response.status_code == 200:

print('[文件大小]:%0.2f MB' %(content_size / chunk_size / 1024)) # 换算单位

with open(path,'wb') as file:

for data in response.iter_content(chunk_size=chunk_size):

file.write(data)

size += len(data) # 已下载的文件大小

if __name__ == '__main__':

for i in range(10):

url = 'http://api.vc.bilibili.com/board/v1/ranking/top?'

num = i*10 + 1

html = get_json(url)

infos = html['data']['items']

for info in infos:

video_url = info['item']['video_playurl'] # 小视频的下载链接

print(title)

# 为了防止有些视频没有提供下载链接的情况

try:

download(video_url,path='%s.mp4' %title)

print('成功下载一个!')

except BaseException:

print('凉凉,下载失败')

pass

time.sleep(int(format(random.randint(2,8)))) # 设置随机等待时间

  爬取效果图如下:

  

  结果:

  

  好像爬行效果还可以。当然喜欢的朋友不要忘记点赞、分享和转发哦。

  最后,我是一名python开发工程师。这里我整理了一套最新的python系统学习教程,包括基础python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等,想要这些资料的可以关注小编,私信给后台编辑器:“01”接收。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线