Python抓取B站视频信息,写入csv文件

今儿闲来无事,就想着捣鼓捣鼓,想着输出一篇逛B站想爬下来这些小视频,抓视频相关信息的爬虫。
准备好小板凳,这就开始咯哦。
首先,本文打算抓取B站小视频这一块的相关信息(用户id、用户名、是否vip用户、视频id、视频描述、上传时间、浏览量、视频url),于是,将事先准备好的小视频的url奉上:http://vc.bilibili.com/p/eden/rank#/?tab=%E5%85%A8%E9%83%A8。
有了小视频url,来开始今天的旅程吧。
浏览器访问上面这个url,打开Google Chrome自带的开发者工具,切换到network选项卡,按F5刷新网页,你会看到有很多的请求资源。
bilibili01
那么我们该怎么找到包含有小视频信息的请求呢,不要着急,跟我往下看。
滚动鼠标滚轮,继续,可以看到又加载出来很多请求资源,发现很多请求是动态加载的,于是想到会不会是ajax加载出来de呢,带着这种想法,切换到network选项卡下的XHR选项,可以看到很多XHR请求,一个一个点击查找,发现数据貌似在类似http://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset=&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc请求中,
bilibili02
到这里为止,我们找到了目标url。
开始码代码之前,首先确定整个的采集流程逻辑:
1、发起请求,接收响应;
2、解析响应,拿到想拿的数据;
3、持久化(本地化或入库),本文直接本地持久化写入csv文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import requests
import jsonpath
import csv
# 1、发起请求,获取相应内容模块
def get_response(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.3'
}
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
response.encoding = 'utf-8'
return response
return None
except Exception as e:
print(e)
return None

# 2、解析相应,提取相关数据模块
def parse_response(response):
response_json = response.json()
uid = jsonpath.jsonpath(response_json, '$.data.items[*].user.uid') # 用户id列表
name = jsonpath.jsonpath(response_json, '$.data.items[*].user.name') # 用户名列表
is_vip = jsonpath.jsonpath(response_json, '$.data.items[*].user.is_vip') # 是否vip用户列表
item_id = jsonpath.jsonpath(response_json, '$.data.items[*].item.id') # 视频id列表
description = jsonpath.jsonpath(response_json, '$.data.items[*].item.description') # 视频描述列表
upload_time = jsonpath.jsonpath(response_json, '$.data.items[*].item.upload_time') # 上传时间列表
watched_num = jsonpath.jsonpath(response_json, '$.data.items[*].item.watched_num') # 浏览量列表
video_playurl = jsonpath.jsonpath(response_json, '$.data.items[*].item.video_playurl') # 视频url列表

return zip(uid, name, is_vip, item_id, upload_time, watched_num, video_playurl)

# 业务逻辑
def main():
# 一个ajax的url
url = 'http://api.vc.bilibili.com/board/v1/ranking/top?page_size=10&next_offset=&tag=%E4%BB%8A%E6%97%A5%E7%83%AD%E9%97%A8&platform=pc'
response = get_response(url) # 调用get_response
data_list = parse_response(response)
# print(type(data_list), data_list) # <class 'zip'> <zip object at 0x031C0260>
# for i in data_list:
# print(i) # 元组

# 3、准备本地持久化到csv文件。当然也可以入库,读者可以自行编写。
# 当然这里也可以封装成一个函数模块,供调用,直接提供文件名即可,读者自行优化。
# 打开文件,追加a
out = open('bilibili111.csv', 'a', newline='')
for u, n, i, item, uptime, wat, play in data_list:
# print(str(u) +',' + n +',' + str(i) +',' + str(item) +',' + uptime +',' + str(wat) +',' + play)
# with open('bilibili.csv', 'a', newline='') as fp:
# fp.write(str(u) +',' + n +',' + str(i) +',' + str(item) +',' + uptime +',' + str(wat) +',' + play)
# fp.write('\n')

# 重组数据为列表
data_list = []
data_list.append(u)
data_list.append(n)
data_list.append(i)
data_list.append(item)
data_list.append(uptime)
data_list.append(wat)
data_list.append(play)
print(data_list)

# 设定写入模式
csv_write = csv.writer(out, dialect='excel')
# 写入具体内容
csv_write.writerow(data_list)
out.close()


if __name__ == '__main__':
main()

运行直接运行上述代码,看到已经有10条数据存入csv文件中了。
剩下的只要写一个循环就可以拿到所有的数据了,读者也可以下载视频根据视频的url,读者自行完成即可。

拓展知识点:csv文件的读取:

定义一个csv文件的变量csv_file,然后通过open对此文件进行打开,打开模式采用‘r’
csv_file只是一个对象的模型,对这个模型进行遍历打印:

1
2
3
4
5
6
7
8
9
10
try:
csv_file = csv.reader(open('bilibili111.csv', 'r'))
print(csv_file) # <_csv.reader object at 0x02F015F0>
for content_list in csv_file:
if content_list:
print(content_list)
else:
break
except FileNotFoundError as e:
print(e, 'dfd')