大家平时空闲的时候都会有刷小视频的习惯吧,我也会在B站上看一些视频,今天就和大家分享一个用Python写的一个自动爬取Bilibili小视频的脚本,下面是项目实现的全部过程。
1.确定爬取目标
这次项目,我们爬取的是B站的每日小视频排行榜前100的视频资源,爬取的网址为:「http://vc.bilibili.com/p/eden/rank#/?tab=全部」。
2.寻找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
在这个页面中,再看一下Heagers属性,找到Request URL这个属性值,当我们向下滑动加载视频的过程中,发现只有这个(http://api.vc.bilibili.com/board/v1/ranking/top?)URL是不变的。
next_offest属性值会一直变化,它是获取下一个视频的序号,现在我们需要把这部分参数取出来,把next_offest写成变量值,用JSON格式返回到目标网页即可。
3. 编写代码
根据上面分析过程编写代码,写代码的时候要注意B站在一定程度上做了反爬操作,所以我们需要通过添加请求头来伪装浏览器,否则下载的视频是空的;然后定义参数来储存JSON数据,再通过requests.get去获取其参数值信息。代码如下:
defget_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)
returnhtml.json()
exceptBaseException:
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']) # 总大小
ifresponse.status_code ==200:
print('[文件大小]:%0.2f MB'%(content_size / chunk_size /1024)) # 换算单位
withopen(path,'wb')asfile:
fordatainresponse.iter_content(chunk_size=chunk_size):
file.write(data)
size+=len(data) # 已下载的文件大小
效果如下:
这个小项目适合爬虫入门的同学作为练手项目,如果有感兴趣的同学,后台可以回复「b站」获取完整源代码。