转载于:http://blog.sciencenet.cn/home.php?mod=space&uid=3189881&do=blog&id=1105242
在此之前请先了解一下相关的上一篇文章:
在上一篇文章给出的知乎链接里,我所提及的获取B站up主主页所有视频的方法主要是:
使用selenium库调用chromedriver模仿浏览器行为
爬取up主主页html源码
分析html源码,找到带有aid的标签,记录下来
这种方法是比较笨拙的,采集效率也比较低。主要是需要模仿浏览行为,这就意味着需要等待html加载,并且因为每页只能加载30个视频。如若视频数超过30,需要进行翻页操作,而每次翻页操作都意味着要等待html加载,如此往复,效率可想而知,所以这种方法是不常用的。但这种方法又是初学者最容易想到,也最容易操作的,所以我放在第一期里说。
今天这里提出一种更常用的方法,即分析json数据。json数据是怎么来的?抓包分析得来的(以后有机会再拓展一下)。下面给出的这个链接是别人抓包分析的来的:
http://space.bilibili.com/ajax/member/getSubmitVideos?mid=10330740&pagesize=30&page=1
简单的分析一下这个域名后,可以发现其中mid指的就是up主的uid,page是当前所在页数(json数据只能显示一页,其余的数据需要通过更改page的值来获得),pagesize则是这一当前的一页的列表中显示多少个视频的数据(如果视频数超过30,pagesize的最小值是30个,减小也不会有任何的变化)。
打开链接后你就会发现这是一串字符串,因为它是json格式的字符串,我们可以使用python中自带的json包对其进行解析,解析后的文本就可以随心所有的调取其中的数据了。使用方法大约分成三步:
使用requests包爬取该url中的所有文本内容text
用json包中的json.loads(text)函数进行解析
调用解析后的文本中数据
如果写成python就是下面这几句话:
data = requests.get(url)
json_text = json.loads(data.text)
item = json_text['data']['vlist']
aid = item[i]['aid']
从代码中可以看出这个json数据的部分结构,最外层是data,其次是vlist,aid数据放在vlist中。我们可以这么写json数据从而体现出其数据结构来:
{
"data":
{
"vlist":
{
item 1{
...
"aid": XXXXX
}
item 2{
...
}
....
}
}
}
如果你仔细观察,这个url中还包含了up所有视频的播放量,评论数,上传时间等基本信息。在采集视频aid的同时还可以顺带将其它信息一并采集,这样就节省了再去访问api的时间了。