当前位置:网站首页 > 更多 > 编程开发 > 正文

[Python] axaj异步加载数据爬虫,获取B站UP主所有视频信息保存到数据库——每周一个爬虫小教程系列

作者:CC下载站 日期:2020-08-18 00:00:00 浏览:58 分类:编程开发

这次要爬取的网页是B站里面的UP主的投稿视频页面,这次以教父的的账号来做个示范。

网址:https://space.bilibili.com/482165792/video

这篇文章的标题是ajax异步加载的数据爬取,这与平时的有什么区别呢?

通常的爬虫是将网页源码下载下来,然后利用xpath或者其他一些方式,将有用的数据提取出来,但是如果下载之后没有看到任何数据呢?

就像这样子:

这个时候就说明这个网站可能是ajax异步加载的数据了,而不是后端直接渲染出来的。

就个人而言,是比较喜欢ajax的,因为这样的话就可以直接找到数据的接口了,提取数据直接用json当字典就可以解析出来了。

回到浏览器,在视频页面F12,进入Network,选择XHR(XMLHttpRequest),这时候我们点击第二页。

这时候我们就可以看到增加了几条东西。

一条一条点开看下,只要看Preview就可以了,因为如果是ajax渲染的话,请求返回来的肯定会有视频数据。

第一个就是了。

将data展开。可以看见有两个list,tlist和vlist,大概意思应该是投稿类型的列表和视频列表了吧

于是我们再展开vlist看看,这里面不仅有标题,还有描述,av号和bv号以及播放量和视频长度

这两条数据对应的也就是教父的第一个和第二个视频

这样子教父的接口就找到了,然后打开Python开始写代码。

在这里可以看到这次请求的URL和请求方式等,我们将其全部转移到Python之中。

我们分析一下这个URL加了哪些参数

  1. mid:482165792 #这个对比可以发现是教父的ID,也就是说只要修改这个值就可以获取其他UP的视频信息了

  2. ps:30 #根据实验,发现这个就是每页获取多少条视频数据了

  3. tid:0 #好像不知道

  4. pn:1 #page number?就是翻也吧

  5. keyword: #关键词?

  6. order:pubdate #排序方式,发布时间

  7. jsonp:jsonp #返回json格式

不得不说,B站对于爬虫新手还是很友好的,没加任何反爬机制,直接请求就可以获取到数据

然后加个循环,获取一下所有页数的视频。

然后为了更清晰的展示,我们将数据清洗一下。

#-*-coding:utf-8-*-
"""
-------------------------------------------------
@Author:Lan
@Blog:www.lanol.cn
@Date:2020/8/18
@Description:I'minchargeofmyCode
-------------------------------------------------
"""
importrequests

foriinrange(1,12):
url=f'https://api.bilibili.com/x/space/arc/search?mid=482165792&ps=30&tid=0&pn={i}&keyword=&order=pubdate&jsonp=jsonp'
res=requests.get(url).json()['data']['list']['vlist']
forjinres:
print('视频标题',j['title'],'AV号',j['aid'],'播放量',j['play'],'视频时长',j['length'])

然后我们建立一个表格,将其保存下来。

#-*-coding:utf-8-*-
"""
-------------------------------------------------
@Author:Lan
@Blog:www.lanol.cn
@Date:2020/8/18
@Description:I'minchargeofmyCode
-------------------------------------------------
"""
importrequests

withopen('JiaoFuMvInfo.csv','a+',encoding='utf8')asf:
f.write('视频标题,AV号,BV号,播放量,视频时长,视频简介,视频链接
')
foriinrange(1,12):
url=f'https://api.bilibili.com/x/space/arc/search?mid=482165792&ps=30&tid=0&pn={i}&keyword=&order=pubdate&jsonp=jsonp'
res=requests.get(url).json()['data']['list']['vlist']
forjinres:
title=j['title'].replace(',',',')
avId=j['aid']
bvId=j['bvid']
play=j['play']
length=j['length']
des=j['description'].replace(',',',').replace('
','')
url=f'https://www.bilibili.com/video/{j["bvid"]}'
f.write(f"{title},{avId},{bvId},{play},{length},{des},{url}
")
print('视频标题',j['title'],'AV号',j['aid'],'播放量',j['play'],'视频时长',j['length'])

还可以结合我博客以前的教程,将这些数据做一些词云图等,还可以去获取一些喜欢的UP主的视频

然后我顺便写了个获取所有B站用户的信息,为了和谐就只是单纯的循环了

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯