C语言使用cJSON解析B站视频分页数据
测试地址:https://api.bilibili.com/x/web-interface/newlist?rid=24&pn=1&ps=20
获取的数据:

首先需要获取到json数据,使用curl就可以:
curl 请求头:
header = "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0 \
Accept-Encoding:gzip, deflate, br \
Referer:https://www.bilibili.com/ \
Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 \
Content-Type:application/x-www-form-urlencoded;charset=UTF-8 \
Connection:keep-alive";
相关配置
struct curl_slist *pList = NULL; pList = curl_slist_append(pList,header); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, pList); curl_easy_setopt (curl,CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt (curl,CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt (curl,CURLOPT_TIMEOUT, 60L); curl_easy_setopt (curl,CURLOPT_CONNECTTIMEOUT, 10L); curl_easy_setopt (curl,CURLOPT_ENCODING, "");
json解析代码:
//test address: https://api.bilibili.com/x/web-interface/newlist?rid=24&pn=1&ps=20
static void parse_json(char *json, spider_enum se)
{
int archives_size, index;
cJSON *cjson, *data_object, *object, *page_item, *archive_object, *archive_item;
cjson = cJSON_Parse(json);
if(NULL == cjson){
printf("json pack into cjson error...");
}
else
{
//打包成功调用cJSON_Print打印输出
// printf("%s\n", cJSON_Print(cjson));
// file_write("tmp.txt", cJSON_Print(cjson));
//获取data对象
data_object = cJSON_GetObjectItem(cjson,"data");
//获取page对象,分页数据
object = cJSON_GetObjectItem(data_object,"page");
page_item = cJSON_GetObjectItem(object, "count");
page_item = cJSON_GetObjectItem(object, "num");
page_item = cJSON_GetObjectItem(object, "size");
// char buf[10];
// sprintf(buf, "%f",page_item->valuedouble);
//获取archives对象,视频列表数据
object = cJSON_GetObjectItem(data_object, "archives");
if(NULL != object)
{
archives_size = cJSON_GetArraySize(object);
setxy(0, 0);
file_write("tmp.txt", "", "w");
for(index=0;index<archives_size;index++)
{
char buf[128];
archive_object = cJSON_GetArrayItem(object, index);
//获取标题
archive_item = cJSON_GetObjectItem(archive_object, "title");
sprintf(buf, "%s \n", archive_item->valuestring);
file_write("tmp.txt", buf, "a");
//获取时长
archive_item = cJSON_GetObjectItem(archive_object, "duration");
sprintf(buf, "%f \n", archive_item->valuedouble);
file_write("tmp.txt", buf, "a");
//获取bvid
archive_item = cJSON_GetObjectItem(archive_object, "bvid");
sprintf(buf, "%s \n", archive_item->valuestring);
file_write("tmp.txt", buf, "a");
}
}
}
cJSON_Delete(cjson);
}
文件保存函数:
int file_write(char * name, char * str, char * type)
{
FILE *fptr;
fptr = fopen(name, type);
if(fptr == NULL)
{
printf("Error!");
return -1;
}
fprintf(fptr,"%s", str);
fclose(fptr);
return 0;
}

浙公网安备 33010602011771号