目录

  • 1. 批量爬取B站小视频
  • 2. 获取动态请求的JSON数据
  • 3. 随机生成浏览器的头部信息
  • 4. 获取要下载视频的大小
  • 5. 实时打印文件下载进度

1. 批量爬取B站小视频

哔哩哔哩网站(英文名称: bilibili),是年轻人的文化社区,被粉丝们亲切的称为B站。该网站中拥有动画、番剧、国创、音乐、舞蹈、游戏、科技、生活、鬼畜、娱乐、时尚等多个内容分区。那么我们能不能爬取一些视频以后离线观看呢?答案是肯定的。本任务要求使用Python语言中的爬虫技术,实现批量爬取B站小视频的爬虫程序。爬取后的效果下图所示。

分析过程如下:


点击上面的排行榜之后,按F12调出浏览器控制台调试界面,点击Network,第一次进入Network可能是空的,按F5或者点击浏览器左上角刷新一下即可,最后如图所示。

但是需要注意的是,不是所有的数据都是根据一个固定的url返回的,如图所示。

接下来就可以去完成代码了,注意,因为爬虫需要使用第三方模块requests,所以读者需要使用如下命令进行安装。

pip install --user  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com requests

如图所示:

示例代码如下:

import requests  # 网络请求模块
import os  # 系统模块
import time  # 时间模块
import re  # 正则模块
import random  # 随机模块json_url = "https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset={}1&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc"  # 哔哩哔哩小视频json地址class MySpider(object):  # 定义一个spider类# 初始化def __init__(self):# 构造请求头self.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit"      "/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"}# 请求json数据def get_json(self, url):response = requests.get(url, headers=self.headers)# 根据返回的状态码判断是否请求成功if response.status_code == 200:return response.json()  # 返回json信息else:print("获取json信息的请求没有成功~")#  下载视频def download_video(self, url, video_name):# 下载视频的网络请求response = requests.get(url, headers=self.headers, stream=True)if not os.path.exists("video"):  # 判断本地是否存在video文件夹 不存在则创建os.mkdir("video")# 根据返回的状态码判断是否请求成功if response.status_code == 200:with open("video/" + video_name + ".mp4", "wb") as file:  # 非纯文本都以字节的方式写入for data in response.iter_content(chunk_size=1024):  # 循环写入file.write(data)  # 写入视频文件file.flush()  # 刷新缓存print("视频下载完成~")else:print("视频下载失败~")if __name__ == '__main__':  # 程序的入口spider = MySpider()for i in range(10):  # 100条数据 需要发送10次循环 所以需要循环10次json = spider.get_json(json_url.format(i))video_infos = json["data"]["items"]  # 信息集 一个列表# 遍历 获取每一个video的信息for video_info in video_infos:# 视频的名字只保留标题中英文、数字与汉字 便于写入文件title = video_info["item"]["description"]comp = re.compile("[^A-Z^a-z^0-9^\u4e00-\u9fa5]")title = comp.sub("", title)  # 其他字符一律替换为空video_url = video_info["item"]["video_playurl"]  # 视频地址print(title, video_url)  # 打印提取的视频标题与视频地址spider.download_video(video_url, title)  # 下载视频 视频标题作为视频的名字time.sleep(random.randint(3, 6))  # 避免频繁发送请求 ip被封

2. 获取动态请求的JSON数据

在上面的批量爬取B站小视频任务中,我们已经通过发送动态请求的方式,获取到视频的标题与视频地址。为了更好的掌握JSON数据的提取技术,此次任务要求获取JSON中视频发布时间用户名称以及观看人数并打印。在PyCharm控制台输出的结果如图所示。

这个任务的话其实就是在之前代码的基础上修改了一小部分,如图所示:

3. 随机生成浏览器的头部信息

有时在请求一个网页内容时,如果频繁地使用一个固定的浏览器头部信息发送网络请求时,可能会出现403错误。产生这种错误是由于该网页为了防止恶意采集信息而使用了反爬虫设置,从而拒绝了用户的访问。所以本任务要求实现每发送一个网络请求,就更换一个浏览器的头部信息,避免使用固定的浏览器头部信息。在PyCharm控制台输出的结果如图所示。

安装fake_useragent模块并初步了解其基本应用,使用pip命令安装fake_useragent模块的命令如下:

pip install --user  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com  fake_useragent

如图所示:

在这次的任务中,还需要一个json格式的文件,下载地址为:

链接:https://pan.baidu.com/s/1IeW70k6pd1HMZqOQ0jw1FQ  密码:t67s

示例代码如下:

import requests  # 网络请求模块
import os  # 系统模块
import time  # 时间模块
import re  # 正则模块
import random  # 随机模块
from fake_useragent import UserAgent  # 导入伪造头部信息的模块json_url = "https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&ne" \"xt_offset={}1&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc"  # 哔哩哔哩小视频json地址class MySpider(object):  # 定义一个spider类def get_json(self, url):  # 请求json数据headers = {"User-Agent": UserAgent(path="fake_useragent.json").random}  # 创建随机生成的头部信息print(f"当前下载请求的浏览器头部信息为: {headers}")response = requests.get(url, headers=headers)# 根据返回的状态码判断是否请求成功if response.status_code == 200:return response.json()  # 返回json信息else:print("获取json信息的请求没有成功~")#  下载视频def download_video(self, url, video_name):headers = {"User-Agent": UserAgent(path="fake_useragent.json").random}  # 创建随机生成的头部信息# 下载视频的网络请求response = requests.get(url, headers, stream=True)if not os.path.exists("video"):  # 判断本地是否存在video文件夹 不存在则创建os.mkdir("video")# 根据返回的状态码判断是否请求成功if response.status_code == 200:with open("video/" + video_name + ".mp4", "wb") as file:  # 非纯文本都以字节的方式写入for data in response.iter_content(chunk_size=1024):  # 循环写入file.write(data)  # 写入视频文件file.flush()  # 刷新缓存print("视频下载完成~")else:print("视频下载失败~")if __name__ == '__main__':  # 程序的入口spider = MySpider()for i in range(10):  # 100条数据 需要发送10次循环 所以需要循环10次json = spider.get_json(json_url.format(i))video_infos = json["data"]["items"]  # 信息集 一个列表# 遍历 获取每一个video的信息for video_info in video_infos:# 视频的名字只保留标题中英文、数字与汉字 便于写入文件title = video_info["item"]["description"]comp = re.compile("[^A-Z^a-z^0-9^\u4e00-\u9fa5]")title = comp.sub("", title)  # 其他字符一律替换为空video_url = video_info["item"]["video_playurl"]  # 视频地址upload_time = video_info["item"]["upload_time"]  # 视频发布日期user_name = video_info["user"]["name"]  # 用户名字watched_num = video_info["item"]["watched_num"]  # 观看人数print(f"视频标题为: {title}")print(f"发布时间为: {upload_time}")print(f"视频地址为: {video_url}")print(f"观看人数为: {watched_num}")# spider.download_video(video_url, title)  # 下载视频 视频标题作为视频的名字time.sleep(random.randint(3, 6))  # 避免频繁发送请求 ip被封

4. 获取要下载视频的大小

在多数网站中下载视频、音乐以及文本文件时,都可以看见当前文件的大小,如下图所示。

本任务要求通过requests模块下载指定视频内容时,获取其视频的文件大小。在PyCharm控制台输出的结果如下图所示。

示例代码如下:

import requests  # 网络请求模块
import os  # 系统模块
import time  # 时间模块
import re  # 正则模块
import random  # 随机模块
from fake_useragent import UserAgent  # 导入伪造头部信息的模块json_url = "https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&ne" \"xt_offset={}1&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc"  # 哔哩哔哩小视频json地址class MySpider(object):  # 定义一个spider类def get_json(self, url):  # 请求json数据headers = {"User-Agent": UserAgent(path="fake_useragent.json").random}  # 创建随机生成的头部信息response = requests.get(url, headers=headers)# 根据返回的状态码判断是否请求成功if response.status_code == 200:return response.json()  # 返回json信息else:print("获取json信息的请求没有成功~")#  下载视频def download_video(self, url, video_name):headers = {"User-Agent": UserAgent(path="fake_useragent.json").random}  # 创建随机生成的头部信息# 下载视频的网络请求response = requests.get(url, headers=headers, stream=True)content_size = int(response.headers["content-length"])  # 视频内容的总大小if not os.path.exists("video"):  # 判断本地是否存在video文件夹 不存在则创建os.mkdir("video")# 根据返回的状态码判断是否请求成功if response.status_code == 200:# 1MB=1024KB 1KB=1024B 我们返回的是多少B 推出==>KB==>MBprint("视频文件大小: %0.2fMB" % (content_size / 1024 / 1024))  # 换算单位with open("video/" + video_name + ".mp4", "wb") as file:  # 非纯文本都以字节的方式写入for data in response.iter_content(chunk_size=1024):  # 循环写入file.write(data)  # 写入视频文件file.flush()  # 刷新缓存print("视频下载完成~")else:print("视频下载失败~")if __name__ == '__main__':  # 程序的入口spider = MySpider()ranking = 0  # 排名for i in range(10):  # 100条数据 需要发送10次循环 所以需要循环10次json = spider.get_json(json_url.format(i))video_infos = json["data"]["items"]  # 信息集 一个列表# 遍历 获取每一个video的信息for video_info in video_infos:ranking += 1print(f"正在下载排名第 {ranking} 的视频")# 视频的名字只保留标题中英文、数字与汉字 便于写入文件title = video_info["item"]["description"]comp = re.compile("[^A-Z^a-z^0-9^\u4e00-\u9fa5]")title = comp.sub("", title)  # 其他字符一律替换为空video_url = video_info["item"]["video_playurl"]  # 视频地址print(f"视频标题为: {title}")print(f"视频地址为: {video_url}")spider.download_video(video_url, title)  # 下载视频 视频标题作为视频的名字time.sleep(random.randint(3, 6))  # 避免频繁发送请求 ip被封

5. 实时打印文件下载进度

在多数网站中下载视频、音乐以及文本文件时,都可以看见当前文件的大小以及已经下载的大小,如下图所示。

在之前的任务中,我们已经实现了显示当前文件的大小。本任务要求将下载文件的实时进度打印出来。在PyCharm控制台输出的结果如下图所示。

示例代码如下:

import requests  # 网络请求模块
import os  # 系统模块
import time  # 时间模块
import re  # 正则模块
import random  # 随机模块
from fake_useragent import UserAgent  # 导入伪造头部信息的模块json_url = "https://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&ne" \"xt_offset={}1&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc"  # 哔哩哔哩小视频json地址class MySpider(object):  # 定义一个spider类def get_json(self, url):  # 请求json数据headers = {"User-Agent": UserAgent(path="fake_useragent.json").random}  # 创建随机生成的头部信息response = requests.get(url, headers=headers)# 根据返回的状态码判断是否请求成功if response.status_code == 200:return response.json()  # 返回json信息else:print("获取json信息的请求没有成功~")#  下载视频def download_video(self, url, video_name):size = 0  # 记录叠加每次写入的大小headers = {"User-Agent": UserAgent(path="fake_useragent.json").random}  # 创建随机生成的头部信息# 下载视频的网络请求response = requests.get(url, headers=headers, stream=True)content_size = int(response.headers["content-length"])  # 视频内容的总大小if not os.path.exists("video"):  # 判断本地是否存在video文件夹 不存在则创建os.mkdir("video")# 根据返回的状态码判断是否请求成功if response.status_code == 200:# 1MB=1024KB 1KB=1024B 我们返回的是多少B 推出==>KB==>MBprint("视频文件大小: %0.2fMB" % (content_size / 1024 / 1024))  # 换算单位with open("video/" + video_name + ".mp4", "wb") as file:  # 非纯文本都以字节的方式写入for data in response.iter_content(chunk_size=1024):  # 循环写入file.write(data)  # 写入视频文件file.flush()  # 刷新缓存size += len(data)  # 叠加每次写入的大小# 打印下载进度print("\r 文件下载进度:%d%%(%0.2fMB/%0.2fMB)" % (    float(size / content_size * 100), (size / 1024 / 1024),    (content_size / 1024 / 1024)),      end=" ")else:print("视频下载失败~")if __name__ == '__main__':  # 程序的入口spider = MySpider()ranking = 0  # 排名for i in range(10):  # 100条数据 需要发送10次循环 所以需要循环10次json = spider.get_json(json_url.format(i))video_infos = json["data"]["items"]  # 信息集 一个列表# 遍历 获取每一个video的信息for video_info in video_infos:ranking += 1print(f"正在下载排名第 {ranking} 的视频")# 视频的名字只保留标题中英文、数字与汉字 便于写入文件title = video_info["item"]["description"]comp = re.compile("[^A-Z^a-z^0-9^\u4e00-\u9fa5]")title = comp.sub("", title)  # 其他字符一律替换为空video_url = video_info["item"]["video_playurl"]  # 视频地址print(f"视频标题为: {title}")print(f"视频地址为: {video_url}")spider.download_video(video_url, title)  # 下载视频 视频标题作为视频的名字time.sleep(random.randint(3, 6))  # 避免频繁发送请求 ip被封

Python每日一练(9)-批量爬取B站小视频相关推荐

  1. json spr路驾驶技术视频api_每天弄个小爬取之Python爬取批量爬取B站小视频

    1. 批量爬取B站小视频 哔哩哔哩网站(英文名称: bilibili),是年轻人的文化社区,被粉丝们亲切的称为B站.该网站中拥有动画.番剧.国创.音乐.舞蹈.游戏.科技.生活.鬼畜.娱乐.时尚等多个内 ...

  2. 每天弄个小爬取之Python爬取批量爬取B站小视频!

    1. 批量爬取B站小视频 哔哩哔哩网站(英文名称: bilibili),是年轻人的文化社区,被粉丝们亲切的称为B站.该网站中拥有动画.番剧.国创.音乐.舞蹈.游戏.科技.生活.鬼畜.娱乐.时尚等多个内 ...

  3. 爬虫---爬取b站小视频

    分析b站小视频 1.进入到抓取链接地址 2.分析抓取链接内容 通过F12或者抓包工具进行查看我们需要爬取的视频在哪里存放,页面以ajax动态加载的 3.分析请求内容和请求参数 通过查看请求内容得到这些 ...

  4. Python爬虫学习教程,批量爬取下载抖音视频

    这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目源码展示: ''' 在学习过程中有什么不懂得可以加我的 python学习交流扣扣qu ...

  5. 零基础如何学好python爬虫?之python爬取B站小视频

    B 站真是个神奇的网站.找不到资料了,去 B 站逛一逛,保准有你满意的东西. 前几天写了个爬虫,用 path.re.BeautifulSoup 爬取的 B 站 python 视频,如果要爬取多页的话 ...

  6. 零基础如何学好python爬虫?python爬取B站小视频

    B 站真是个神奇的网站.找不到资料了,去 B 站逛一逛,保准有你满意的东西. 前几天写了个爬虫,用 path.re.BeautifulSoup 爬取的 B 站 python 视频,如果要爬取多页的话 ...

  7. python自动搜索爬取下载文件-python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  8. python爬取抖音用户数据_python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  9. python实战-HTML形式爬虫-批量爬取电影下载链接

    文章目录 一.前言 二.思路 1.网站返回内容 2.url分页结构 3.子页面访问形式 4.多种下载链接判断 三.具体代码的实现 四.总结 一.前言   喜欢看片的小伙伴,肯定想打造属于自己的私人影院 ...

最新文章

  1. Android之Log工具类使用
  2. boost::callable_traits的is_const_member的测试程序
  3. 一个迷你ASP.NET Core框架的实现(下)
  4. java 声波 噪音过滤_攻略||让噪音一边去的隔音材料全解析!
  5. 终于明白上一篇的一顿误操作是什么了,是$,不是S !!!!!
  6. Jmeter之__CSVRead随机读取变量
  7. iOS14更新了需要注意哪些适配
  8. Nmap (网络扫描工具)
  9. andorid studio 无法识别app项目解决
  10. 10分钟搭建linux代理服务器
  11. 2021牛客多校#10 F-Train Wreck
  12. 从攻击事件分析加密攻击类型、工具、防范方法和未来预测
  13. 红米NOTE3 双网通(2015617)刷机包 解账户锁
  14. 微信小程序-Testerhome
  15. 父进程回收子进程之wait()函数使用解读
  16. Unity游戏动画 从入门到住院 1
  17. 10年老师傅总结的CAD绘图命令,让你的工资从3000到1W!
  18. 浙江省计算机三级网络安全技术机考,2017年浙江省计算机三级考试题
  19. mysql多表删除_MySQL中多表删除方法
  20. 品味30句对爱情的经典认识

热门文章

  1. 梯度下降法、牛顿法和拟牛顿法——机器学习面试
  2. 动态规划——有趣的数(ccf)
  3. 【tfcoreml】tensorflow向CoreML模型的转换工具封装
  4. 《学习OpenCV》课后习题解答(第四章)(仅供参考)(不断更新)
  5. js继承实现 狗类继承动物类
  6. 使用c#对xml文件进行解析 功能演示 161483724
  7. 背景位置 background-position 0916
  8. 输出语句 WriteLine 与格式化输出 1006 c#
  9. pymongo的使用 0916
  10. django-中间件,视图函数调用前会执行的