这次要爬取的网页是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加了哪些参数
- mid:482165792 #这个对比可以发现是教父的ID,也就是说只要修改这个值就可以获取其他UP的视频信息了
- ps:30 #根据实验,发现这个就是每页获取多少条视频数据了
- tid:0 #好像不知道
- pn:1 #page number?就是翻也吧
- keyword: #关键词?
- order:pubdate #排序方式,发布时间
- jsonp:jsonp #返回json格式
不得不说,B站对于爬虫新手还是很友好的,没加任何反爬机制,直接请求就可以获取到数据
然后加个循环,获取一下所有页数的视频。
然后为了更清晰的展示,我们将数据清洗一下。
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
-------------------------------------------------
@ Author :Lan
@ Blog :www.lanol.cn
@ Date : 2020/8/18
@ Description:I'm in charge of my Code
-------------------------------------------------
"""
import requests
for i in range(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']
for j in res:
print('视频标题', j['title'], 'AV号', j['aid'], '播放量', j['play'], '视频时长', j['length'])
然后我们建立一个表格,将其保存下来。
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
-------------------------------------------------
@ Author :Lan
@ Blog :www.lanol.cn
@ Date : 2020/8/18
@ Description:I'm in charge of my Code
-------------------------------------------------
"""
import requests
with open('JiaoFuMvInfo.csv', 'a ', encoding='utf8') as f:
f.write('视频标题,AV号,BV号,播放量,视频时长,视频简介,视频链接
')
for i in range(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']
for j in res:
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站用户的信息,为了和谐就只是单纯的循环了