skeep 发表于 2017-7-23 12:02

Python利用B站API获取视频信息

本帖最后由 skeep 于 2017-7-23 12:28 编辑

##Python利用B站API获取视频信息
这两天工作中需要写两个简单的爬虫,我自己参考网上的资料,手动实现了一下,今天总结一下发给大家。
[参考链接]:https://www.v2ex.com/t/347986
### 编写爬虫首先是分析想要爬去的页面url格式或者html页面中的标签的链接。

- 打开浏览器,输入地址:http://www.bilibili.com/video/av10001


- 在浏览器中按F12打开监控面板,选择network页面,该页面中可以分析浏览器与服务器之间的交互情况。


- 按F5刷新页面,浏览器会向服务器发送很多请求,服务器也会对浏览器的请求做出相应相应。我们在下方选择Other,这样便可以筛选出其他类型。


- 我们从中选择json类型的HTTP请求,然后逐个观察分析,在每个HTTP请求的详情页中,选择Response,查看服务器发回的响应。


- 一直向下分析,直到找到一个返回的JSON中的内容正是我们所需的那条请求记录,其开头为stat?callback,可以看到其内部的返回数据与页面中的是有着对应关系的


- 在右侧的HTTP详情页面中选择Headers,然后点击Edit and Resend按钮,将找到的链接复制一下




- 在浏览器中新开一个标签页,然后将刚才复制的链接粘贴到到浏览器地址栏中,可以看到得到的便是json串。


- 我们看到这个链接非常长,带了很多冗余信息,不方便我们最后编写爬虫的URL,尝试一下之后,发现最终可以简化成http://api.bilibili.com/x/web-interface/archive/stat?aid=10001, 访问该地址,发现我们的主要数据依旧存在


- 经过一番观察之后,我们可以发现我们要搜集的视频信息,可以通过 “http://api.bilibili.com/x/web-interface/archive/stat?aid=” 拼接上一个具体数值来访问

### 主要代码如下
```
#craw_bilibili.py
import time
import requests
import sys
from prettytable import PrettyTable

#设置编码方式
reload(sys)
sys.setdefaultencoding(‘utf-8’)

#返回爬取的数量
def get_Craw_num():
      print("-----------菜 单--------------")
      i=str(raw_input("请输入爬取视频的起始编号"))
      print("-----------------------------")
      return i

#爬虫的功能实现
def start_craw(url):
      print("开始爬取,请稍候")
      headers={}
      x=PrettyTable(['视频编号','播放量','弹幕','回复','收藏','硬币','分享'])
      t=0
      i=get_Craw_num()
      while(t<100):
                r=requests.get(url.format(i),headers=headers)
                if r.status_code ==200:
                        try:
                              j=r.json()['data']
                              favorite=j['favorite']
                              danmaku=j['danmaku']
                              coin=j['coin']
                              view=j['view']
                              share=j['share']
                              reply=j['reply']
                              favorite=str(favorite)
                              danmaku=str(danmaku)+" "
                              coin=str(coin)
                              view=str(view)
                              share=str(share)
                              reply=str(reply)
                              av_num="av"+str(i)
                              x.add_row()
                        except Exception as e:
                              pass
                else:
                        break
                i=i+1
                t=t+1
      print (x)
      print("爬取完成")


#main函数
if __name__=="__main__":
      url='https://api.bilibili.com/x/web-interface/archive/stat?aid={}'
      start_craw(url)




```

### 部分代码解释

- 首先是导入所需的python库,以及设置编码方式为utf-8。其中PrettyTable库的作用是可以将数据按照表格的形式展示出来。代码为:


- 编写获取用户输入的爬取数量的函数。将输入的数值转化成int类型,然后返回,具体代码如下:


- 其次是爬虫的主体部分。首先是用prettytable,插入表头信息,然后开始构造url地址,用requests方法获取url内容,对于返回的json串进行解析,然后将每个数值对应的插入到表格中,如果插入记录到达100条,则退出该函数,具体代码如下编写主函数。



- 主函数直接调用,爬虫的主体部分,代码如下:



### 效果展示
- 随便输入一个数字,如10086,然后回车,稍等一会便可以打印爬取结果




2205 发表于 2017-10-16 00:03

用PYTHON3测试了楼主代码,修改了几处地方,功能正常。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import time
import requests
import sys
from prettytable import PrettyTable
import importlib

#设置编码方式
importlib.reload(sys)

#返回爬取的数量
def get_Craw_num():
      print("-----------菜 单--------------")
      i=int(input("请输入爬取视频的起始编号"))
      print("-----------------------------")
      return i

#爬虫的功能实现
def start_craw(url):
      print("开始爬取,请稍候")
      headers={}
      x=PrettyTable(['视频编号','播放量','弹幕','回复','收藏','硬币','分享'])
      t=0
      i=get_Craw_num()
      while(t<100):
                r=requests.get(url.format(i),headers=headers)
                if r.status_code ==200:
                        try:
                              j=r.json()['data']
                              favorite=j['favorite']
                              danmaku=j['danmaku']
                              coin=j['coin']
                              view=j['view']
                              share=j['share']
                              reply=j['reply']
                              favorite=str(favorite)
                              danmaku=str(danmaku)+" "
                              coin=str(coin)
                              view=str(view)
                              share=str(share)
                              reply=str(reply)
                              av_num="av"+str(i)
                              x.add_row()
                        except Exception as e:
                              pass
                else:
                        break
                i += 1
                t += 1
      print (x)
      print("爬取完成")

#main函数
if __name__=="__main__":
      url='https://api.bilibili.com/x/web-interface/archive/stat?aid={}'
      start_craw(url)

请输入爬取视频的起始编号10086
-----------------------------
+----------+--------+-------+------+------+------+------+
| 视频编号 | 播放量 |弹幕 | 回复 | 收藏 | 硬币 | 分享 |
+----------+--------+-------+------+------+------+------+
| av10086| 260976 | 5211| 5211 | 2499 | 261| 361|
| av10087|3551|109| 109|5   |2   |1   |
| av10088|3674|79   |79|23|0   |2   |
| av10089|520   |869| 869|82|0   |5   |
| av10092|1983|20   |20|5   |0   |1   |
| av10093|   --   |103| 103|2   |0   |0   |
| av10094|1250|34   |34|30|2   |2   |
| av10096|4451|188| 188|44|13|2   |
| av10097|1577|14   |14|4   |1   |2   |
| av10098| 11731|281| 281|9   |0   |2   |
| av10099| 10422|523| 523|12|0   |1   |
| av10101|3305|123| 123|7   |0   |1   |
| av10102| 19357|366| 366| 144|14|7   |
| av10103| 95637|510| 510|34|1   |6   |
| av10104|2732|82   |82|19|0   |2   |
| av10106|709   |10   |10|5   |1   |1   |
| av10108|1620|274| 274|2   |0   |0   |
| av10112| 11754|195| 195|22|2   |1   |
| av10114| 37335| 1654| 1654 |23|4   |8   |
| av10115|3360|796| 796|14|0   |2   |
| av10116|1231|15   |15|4   |0   |3   |
| av10117| 38308|809| 809| 782|55|23|
| av10118|6738|134| 134|97|9   |2   |
| av10120|1355|111| 111|13|0   |2   |
| av10121|629   |17   |17|2   |0   |2   |
| av10123|2736|189| 189|14|0   |2   |
| av10124|5088|312| 312|54|0   |0   |
| av10125|6703|138| 138| 146|6   |5   |
| av10126|4492|210| 210|67|6   |6   |
| av10127|2635|42   |42|1   |0   |3   |
| av10128| 17438|163| 163|40|3   |2   |
| av10129|2195|81   |81|6   |0   |3   |
| av10130| 32944| 1207| 1207 | 616|33|9   |
| av10131|6244|80   |80|76|6   |6   |
| av10132| 23754|491| 491| 164|7   |5   |
| av10134|1290|280| 280|5   |0   |1   |
| av10135|2187|227| 227|1   |0   |1   |
| av10139|304   |93   |93|38|4   |2   |
| av10142| 10548| 1352| 1352 | 101|15|4   |
| av10143|1776|99   |99|1   |0   |2   |
| av10144|7776|239| 239|31|4   |10|
| av10145|   --   |44   |44|2   |0   |2   |
| av10146| 26050|707| 707| 268|24|6   |
| av10149|6555|214| 214|20|0   |0   |
| av10152|1480|12   |12|6   |0   |3   |
| av10153|6526|326| 326|29|2   |1   |
| av10155|2395|436| 436|42|1   |3   |
| av10158|1255|107| 107|3   |1   |3   |
| av10160|468   |14   |14|4   |0   |2   |
| av10162|1545|168| 168|13|2   |2   |
| av10166|1587|14   |14|9   |0   |2   |
| av10168|4473|34   |34|15|0   |1   |
| av10169|6049|568| 568|54|0   |2   |
| av10170|3829|277| 277|21|1   |2   |
| av10171|1499|19   |19|3   |0   |0   |
| av10172|   37   |10   |10|9   |0   |1   |
| av10173|928   |24   |24|7   |0   |7   |
| av10174|2015|162| 162|20|0   |1   |
| av10175| 13456| 1362| 1362 | 151|0   |1   |
| av10177|1086|53   |53|7   |0   |3   |
| av10180|9995|965| 965|6   |16|2   |
| av10181|3717|75   |75|37|1   |2   |
| av10182|677   |   5   |5   |3   |1   |1   |
| av10183|1021|39   |39|3   |0   |1   |
| av10184|4232|209| 209|27|3   |5   |
| av10185|1919|230| 230|24|1   |4   |
+----------+--------+-------+------+------+------+------+
爬取完成

skeep 发表于 2017-7-23 12:31

czyuyu 发表于 2017-7-23 12:24
很好很详细的教程,感谢分享!

感谢评论,一会将第二篇整理好再发布,下一篇是爬去电影天堂的最新电影的下载地址,到时候可以收藏使用啊

语然 发表于 2017-7-23 12:25

这波抓我给满分

白胡子的花猫 发表于 2017-7-23 12:36

很详细的教程

ArcherMars 发表于 2017-7-23 12:45

get,学习到了

黑山老道 发表于 2017-7-23 13:02

这个分析的相当到位透彻 看的明明白白

zxdpim 发表于 2017-7-23 13:07

学习了,简单例子,注释很容易看懂,谢谢分享

Dlan 发表于 2017-7-23 13:07

本帖最后由 Dlan 于 2017-7-23 13:10 编辑

没什么亮点,不过还是谢谢分享,如果能加上入库、和数据图形分析 ,才是一套爬虫应该做的

Novae 发表于 2017-7-23 13:08

谢谢分享

wakichie 发表于 2017-7-23 13:11

厉害了啊
页: [1] 2 3 4
查看完整版本: Python利用B站API获取视频信息