分析网络请求,获取到有粉丝接口的数据url
可以在响应信息处看到粉丝的信息
通过浏览器也可以直接请求到具体的JSON信息
通过独立的标签我们可以看到接口数据,但是要注意如果不是查看自己登录账户的接口那么就无法查询到所有粉丝的数据,默认只能查看前五页也就是100条。
如果是自己的账户,那么可以查询到所有的粉丝信息。
当然,我们即使能在界面上看到粉丝的信息,但是肯定不满于此,需要将数据持久化才可以供自己使用。
使用Python进行数据持久化
建表语句
CREATE TABLE IF NOT EXISTS dev.`subscribe`
(
`mid` bigint COMMENT '粉丝id',
`uname` VARCHAR(50) COMMENT '粉丝名称',
`sign` VARCHAR(255) COMMENT '粉丝签名',
`mtime` date COMMENT '关注时间',
`vip_type` int COMMENT 'vip类型: 0:从来不是vip;1:已过期vip或大会员;2:年度会员',
`vip_txt` VARCHAR(40) COMMENT 'vip类型名称(中文)',
`label_theme` VARCHAR(40) COMMENT 'vip类型名称(英文)',
`vip_status` int COMMENT 'vip状态: 0:过期;1:正常',
`vip_due_date` date COMMENT 'vip到期日',
`uname_url` VARCHAR(255) COMMENT '粉丝主页url',
`face_url` VARCHAR(255) COMMENT '粉丝图片url',
`create_date` date DEFAULT NULL COMMENT '爬取日期',
`create_time` time DEFAULT NULL COMMENT '爬取时间'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
;
Python具体代码
import time
import requests
import pymysql
def toDate(timestamp):
timestamp = int(str(timestamp)[0:10])
time_struct = time.gmtime(timestamp)
return time.strftime('%Y-%m-%d %H:%M:%S', time_struct)
def insert_data_to_mysql(host, user, password, db, data):
# 连接到 MySQL 数据库
connection = pymysql.connect(host=host, user=user, password=password, db=db, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# 创建 INSERT 语句
sql = """
INSERT INTO subscribe (mid, uname, sign, mtime, vip_type, vip_txt, label_theme, uname_url, face_url, vip_status, vip_due_date)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
"""
# 遍历数据并执行插入操作
for item in data:
cursor.execute(sql,
(item['mid'], item['uname'], item['sign'], item['mtime'], item['vip_type'], item['vip_txt'], item['label_theme'], item['uname_url'], item['face_url']
, item['vip_status'], item['vip_due_date']))
# 提交事务
connection.commit()
finally:
# 关闭数据库连接
connection.close()
# 初始化页码和每页大小
pn, ps = 1, 20
while True:
# URL 地址,使用格式化字符串插入页码和每页大小
url = f"https://api.bilibili.com/x/relation/fans?vmid=451320374&pn={pn}&ps={ps}&order=desc&gaia_source=main_web&web_location=333.999&w_rid=b9bc75b979a0ccc5769ed6c8ae81c12c&wts=1702886635"
# 自定义请求头
headers = {
"Cookie": 填写自己的Cookie,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# 使用 GET 方法请求数据,附加自定义请求头
response = requests.get(url, headers=headers)
# 检查请求是否成功
if response.status_code == 200:
# 解析 JSON 数据
data = response.json()
extracted_info = []
# 这里可以处理或输出 data 中的数据
for item in data['data']['list']:
extracted_data = {
'mid': item['mid'],
'uname': item['uname'],
'sign': item['sign'],
'mtime': toDate(item['mtime']),
'uname_url': f"https://space.bilibili.com/{item['mid']}",
'face_url': item['face'],
'vip_type': item['vip']['vipType'],
'vip_txt': item['vip']['label']['text'],
'label_theme': item['vip']['label']['label_theme'],
'vip_status': item['vip']['vipStatus'],
'vip_due_date': toDate(item['vip']['vipDueDate'])
}
extracted_info.append(extracted_data)
# 插入数据到数据库
insert_data_to_mysql('192.168.153.116', 'root', '123', 'dev', extracted_info)
# 检查是否有下一页
if len(data['data']['list']) < ps:
print("已经是最后一页")
break
else:
print("翻页")
print(url)
pn += 1
time.sleep(5) # 防止过快请求导致被限制
else:
print("请求失败,状态码:", response.status_code)
break