当前位置: 首页 > 编程日记 > 正文

python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频

爬取哔哩哔哩小视频

前言:想必大家都对小视频感兴趣吧,今天的爬虫的内容为将哔哩哔哩中的视频下载到本地,今天爬取的网站为

URL : https://vc.bilibili.com/p/eden/all#/?tab=%E5%BE%A1%E5%AE%85%E6%96%87%E5%8C%96&tag=COSPLAY

1. 分析站点

a) 进入网站后,鼠标滚动往下滚动,很明显可以看到这个网站的数据是通过ajax技术动态加载来的,所以第一步做的就是鼠标右键检查,进入Network→XHR,然后刷新页面再次将鼠标往下滚动,会发现在XHR中加载了很多的数据包

b) 找到加载的数据包后第二步要做的就是对这些数据进行分析,找出视频的播放地址及视频的名字,从这些加载的数据中我们找到了视频的播放地址video_playurl和视频的名称description,而且每个请求中都包含30个视频的信息

c) 找到我们保存视频时需要的名称和视频后,下一步就要开始分析返回这些数据的请求url了,最简单的办法就是通过反复点击这两个请求,很容易就可以看到只有next_offset的值在变化。而且所对应的值是30倍数

d) 我们尝试将next_offset的值改为0然后去发送请求,看是不是就是页面最开始的前30个视频的数据,发现就是最开始页面加载的数据,这说明next_offset的初始值为0,所以当我们在代码中请求数据的时候也要从next_offset为0开始发送请求下载视频

2. 上代码

分析完网页是信息后,我们只需要在代码中更改请求的url中的next_offset的值就可以下载不同的视频了,先写好大概的思路,然后再去慢慢完善代码

a) 写好大概的思路

import requests

class DouyinSpider(object):

def __init__(self):

self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'}

self.url = 'https://api.vc.bilibili.com/clip/v1/video/search?page_size=30&need_playurl=0&next_offset={}&has_more=1&order=&tag=COSPLAY&platform=pc'

def parse_json(self,json):

pass

def request_page(self):

count = int(input('请输入你想要爬取的页数,一页30个视频:'))

for i in range(0,count):

response = requests.get(self.url.format(i*30)).json()

self.parse_json(response)

def save_video(self,video_url,title):

pass

def main(self):

self.request_page()

if __name__ == '__main__':

spider = DouyinSpider()

spider.main()

b) 完整代码

import requests,re,os

class DouyinSpider(object):

def __init__(self):

self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'}

self.url = 'https://api.vc.bilibili.com/clip/v1/video/search?page_size=30&need_playurl=0&next_offset={}&has_more=1&order=&tag=COSPLAY&platform=pc'

# 解析获取的数据,并从中提取出视频的播放地址和视频的名称

def parse_json(self,json):

items = json['data']['items'] # 视频的数据都放在items中,所以要去遍历items

for item in items:

video_url = item['item']['video_playurl'] # 提取出数据中的播放地址和视频的名称

title = item['item']['description']

self.save_video(video_url,title) # 将视频地址和视频名称传给save_video方法

# 发送请求获取数据

def request_page(self):

count = int(input('请输入你想要爬取的页数,一页30个视频:'))

for i in range(0,count):

response = requests.get(self.url.format(i*30)).json() # 将返回的json数据转为python中的数据类型

self.parse_json(response) # 将返回的数据传给parse_json方法

# 保存视频到本地

def save_video(self,video_url,title):

res = requests.get(video_url,headers=self.headers).content # 对视频的播放地址发送请求获取数据,因为视频是二进制数据,所以还需要将返回的数据转为二进制数据然后再去保存,所以这里需要.content

title = re.sub(r'[\,, .。/#!!??@\n\s::————丶*ノヽ*´з]','',title) # 使用re模块中的sub方法将非法的字符转为空字符串,不然保存视频时出错

filename = 'F:/视频/'

if not os.path.exists(filename): # 使用os库中的path模块判断filename路径是否存在,不存在则创建

os.makedirs(filename) # 创建多级目录

with open(filename+'{}.mp4'.format(title),'wb')as f:

f.write(res)

print('已下载{}'.format(title))

def main(self):

self.request_page()

if __name__ == '__main__':

spider = DouyinSpider()

spider.main()

c) 我下载了两页的的视频,下载的结果正好是60个视频,所以验证了我们之前分析的结果没有错误

3. 小思考

你们有没有发现请求url中有一个tag标签,其实可以通过改变tag标签就可以下载御宅文化中其它类型的视频

结语:今天的内容到这里就结束了,如果大家觉得文章还不错或者代码还可以怎么改进的话,可以在下方留言告诉我,我都会汲取大家的意见并和大家一起学习成长。

原文链接:https://blog.csdn.net/weixin_46146855/article/details/105813137

相关文章:

区块链双语术语大全

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 这是一个简单而又全面的Blockchain词汇表,用于令人印象深刻的blockchain语言世界。 51% Attack(51%攻击) 当一…

SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

五、锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。 SQL Serve…

开源造轮子:一个简洁,高效,轻量级,酷炫的不要不要的canvas粒子运动插件库...

一:开篇 哈哈哈,感谢标题党的莅临~ 虽然标题有点夸张的感觉,但实际上,插件库确实是简洁,高效,轻量级,酷炫酷炫的咯。废话不多说,先来看个标配例子吧: (codepe…

python启动appium服务_python下appium服务的自启动和关闭

最近想把前不久写的webUi框架改写成mobile_Ui,也就是 用于手机端的UI自动化框架,目前已经完成该框架的改写,记录其中一些问题,框架后续会单独写篇幅介绍遇到的第一个问题就是1、python怎么能够自动启动和自动关闭appium服务,这样每…

以太坊源码分析

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 前言:人类正在步入数据时代。如今,全球每天就产生超过500亿GB的数据,据IDC预测,到2025年这一数据将超…

yapi-docker

yapi-docker 转载于:https://www.cnblogs.com/vickey-wu/p/9026153.html

灵活性是原则性基础上的灵活

灵活性是原则性基础上的灵活,没有原则性的灵活是耍流氓。 原则性是质,灵活性是量,灵活性有度的要求,就是不能改变质。转载于:https://www.cnblogs.com/jcode/p/5961867.html

办公室自动化系统_信息化管理建设 公司办公室用自动盖章机贵吗?

办公室自动盖章机的应用我们首先要考虑到底有没有用,之后在考虑贵不贵的问题。自动盖章机也称智能印章,是企业单位建设信息化印章管理方式的一种,过去由于人工盖章和管章效率低,且风险较大,为了避免因印章管理不当引起…

加密货币银行是什么?它又将如何运作?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 比特币曾经承诺,将帮助每个人拥有“属于自己的 银行 ”。但这里需要强调一点,在了解到银行实际提供的众多服务之后&#xff…

【Python】实现将testlink上的用例指定格式保存至Excel,用于修改上传

背景 前一篇博客记录的可以上传用例到testlink指定用例集的脚本,内部分享给了之后,同事希望能将testlink上原有的用例下载下来,用于下次修改上传,所有有了本文脚本。 具体实现 获取用例信息 def download_testcase():""…

Java随机字符串:随机数字字符串,工具类

Java中生成随机数,字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串数字等 ......... 2. 总共8种类型,具体看工具类中的注释。 1 import java.util.Date;2 import java.util.Random;3 i…

python怎么查看代码错误_python中的错误如何查看

python常见的错误有1.NameError变量名错误2.IndentationError代码缩进错误3.AttributeError对象属性错误4.TypeError类型错误5.IOError输入输出错误6.KeyError字典键值错误具体介绍1.NameError变量名错误报错:>>> print aTraceback (most recent call last…

Facebook的加密货币即将到来会对整个加密货币领域意味着什么

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Facebook的加密货币即将到来,它对整个加密货币领域意味着什么?这里不仅涉及到用户采用、节点参与,还涉及到合规、…

threadlocal使用场景_深入剖析ThreadLocal

点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达朋友们在遇到线程安全问题的时候,大多数情况下可能会使用synchronized关键字,每次只允许一个线程进入锁定的方法或代码块,这样就可以保证操作的原子性,保证对公共资…

zabbix 监控tomcat实例

zabbix 监控tomcat实例环境:CentOS 7.2zabbix-3.0.5 LTSnginx-1.10.1php-7.0.11mariadb-10.1.18tomcat-9请参看zabbix-3.0.x LTS源码安装配置Tomcat7/8/9安装配置tomcat启用jmxhttp://tomcat.apache.org/tomcat-9.0-doc/monitoring.htmlhttp://docs.oracle.com/javase/6/docs/t…

什么是USDT以及如何使用它?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 什么是USDT? 如果您使用Poloniex或Bittrex交易所交易,那么您可能已经多次见过UDST市场了,您甚至经常使用它。 …

BZOJ3930: [CQOI2015]选数

BZOJ3930: [CQOI2015]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L1)^N种方案。 小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数&#xf…

the job was canceled什么意思_这些英语短语,因为相差一个“the”导致意思大不相同!...

今天有小伙伴在我文章下面留言,说到了两个短语,同样是因为两者之间相差一个“the”而造成了意义完全不同。分别是“out of question”和“out of the question”,第一个没有“the”意思是“毫无疑问、无疑的”意思。第二个则是“不可能的”。…

php中类和对象的操作

在类中用$this指代对象本身。 用self::指代类本身。 $p1 new Person(michael);//向Person类的构造函数__construct中传名字 echo($p1->name);//获取对象p1的public实例属性name(注意没有$) $p1->speak();//调用对象p1的实例方法speak echo(Person::$sex);//获取类变量(s…

关于区块链的知识

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 1 是什么导致了区块链的出现? 互联网的信任缺失导致了区块链技术的出现 在互联网上最缺乏的就是信任了,1993年《纽约客》…

JavaScript 表单与表单验证

JavaScript 表单 JavaScript 表单验证 HTML 表单验证可以通过 JavaScript 来完成。 以下实例代码用于判断表单字段(fname)值是否存在,如果存在,则弹出信息,否则阻止表单提交: JavaScript 实例 function validateForm() { var x d…

iOS项目的本地化处理(多国语言)

项目的本地化就是:iOS系统在不同语言环境下自动切换语言,从而实现一个app发布到全世界各个国家的AppStore上。 我们不仅仅需要在iOS项目中做本地化处理,在上架iOS APP的时候,也需要做对应的本地化设置哦。 iOS项目中需要处理的本地…

synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...

并发编程已经成为程序员必备技能作为Java程序员,不懂得并发编程显然已经不能满足市场需求了,尤其是在面试过程中将处于被动地位,也有可能面试将就此终结。那么作为Java开发者的你,日常虽然可以基于Java的并发工具包实现并发编程&a…

一个比特币要挖多久?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 一个比特币要挖多久 比特币怎么挖能赚钱吗比特币要用专门的挖矿机来挖。平均一个挖到的时间几周到几个月不等。要看你的机器的规模了。 一台普通笔…

[UE4]死亡后调整视角

AddLocalOffset:本地坐标偏移。 脱离控制器操作 会影响“OnDie”方法里面的相机移动操作,而函数里面又不允许使用“Delay”方法,但可以使用“Set Timer By Function Name”方法。 转载于:https://www.cnblogs.com/timy/p/9036267.html

git 设置 key 到服务器,同步代码不需要输入用户名和密码

1 ssh-keygen -t rsa 2 vim ~/.ssh/id_rsa.pub 3. 添加到git 服务器,这样同步代码就不需要输入密码转载于:https://www.cnblogs.com/likwo/p/5975809.html

26个音序的正确写法和占格_部编语文汉语拼音音序表,示范朗读+视频教学

部编语文《汉语拼音音序表》♬点击上方绿标收听音频这位老师教的有点喜感,但读得基本是正确的。《汉语拼音方案》给每个字母规定了名称音读法,这是朗读字母表。小学汉语拼音字母表教学中存在两种读法,一种是《方案》规定的名称来读&#xff0…

分布式块存储架构

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 1.块存储简介 块存储,简单来说就是提供了块设备存储的接口。用户需要把块存储卷附加到虚拟机(或者裸机)上后才可以与其交互。…

Tomcat_7.x压缩版_环境变量配置(亲测有效)

自行下载配置JDK, I。下载Tomcat7,解压到合适的目录,文件夹尽量浅,我的Tomcat路径是D:\tom7 II。配置环境变量 1.打开到环境变量,新建变量名:CATALINA_HOME,变量值:D:\tomcat2.打开P…

Atitit 为什么网络会有延时 电路交换与分组交换的区别

Atitit 为什么网络会有延时 电路交换与分组交换的区别 按道理,网络是电子设备联网,应该达到光速才对。。 本质上因为互联网基于分组交换而不是电路交换。 分组交换相当于队列方式,别人发你的数据包先存储在交换机队列里面存储,它空…