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

2022-07-14 14:20:34 浏览数 (1)

这次要爬取的网页是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站对于爬虫新手还是很友好的,没加任何反爬机制,直接请求就可以获取到数据

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

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

代码语言: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站用户的信息,为了和谐就只是单纯的循环了

0 人点赞