这次要爬取的网页是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加了哪些参数
不得不说,B站对于爬虫新手还是很友好的,没加任何反爬机制,直接请求就可以获取到数据
然后加个循环,获取一下所有页数的视频。
然后为了更清晰的展示,我们将数据清洗一下。
# -*- 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'])
然后我们建立一个表格,将其保存下来。
# -*- 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站用户的信息,为了和谐就只是单纯的循环了
评论 (0)