前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
现在各种学习的APP里课程种类繁多,看得眼花缭乱的都不知道应该学哪一门,于是就有了本爬虫的诞生。
本文主要通过编写python爬虫,爬取自己感兴趣的分类下哪些课程最受欢迎,帮助解决选择困难症,同时,还能在实践中多敲几行代码提高自己。
在文字开始之前,我们先看一下最终报表吧:
以下是详细爬取过程:
步骤一:
通过fiddler抓包,分析不同分类的id,得到人文分类的id=3613,历史分类的id=531,教育分类的id=537,财经分类的id=533,为了后面方便使用,我们先将各个分类,以字典形式存到列表中。
category_list = [{"id": 3613, "name": "人文"}, {"id": 531, "name": "历史"}, {"id": 537, "name": "教育"}, {"id": 533, "name": "财经"}]
步骤二:
通过fiddler抓包,分析分类排行榜的接口地址:
list_url = "https://c.qingting.fm/rankinglist/v1/items?type=hot&category=%s&range=total&page=%s"
以下是接口返回的数据,每页返回30条数据,总共100条数据;
步骤三:
编写脚本(遍历不同的分类,分页请求接口数据,解析接口数据,写入到Excel文档中)
def get_rank_list(list): list_url = "https://c.qingting.fm/rankinglist/v1/items?type=hot&category=%s&range=total&page=%s" result_list = [] for item in list: r_id = item['id'] category_name = item['name'] try: for p in range(1,4): list_res = urllib.request.urlopen(list_url%(r_id,p)).read().decode() list_res = json.loads(list_res) for dict in list_res['data']: # 因为每一页都会请求一次接口,我们把每一次请求的接口数据,以字典的形式存到列表中。 result_dict = {} result_dict['课程名称'] = dict['data']['title'] result_dict['课程描述'] = dict['data']['desc'] result_dict['播放次数'] = dict['data']['playCount'] result_dict['章节数'] = dict['data']['programCount'] result_dict['分类名称'] = category_name result_list.append(result_dict) except Exception as e: print(e) continue 编写写入Excel文档的函数,(这里使用的是panda这个库,操作文档那是倍儿爽啊) def write2csv(list): df = pd.DataFrame(list) df.index = np.arange(1, len(list)+1) df.to_csv("qingting.csv",mode='a',encoding="utf_8_sig")
完整代码:
#!/bin/python # coding:utf-8 import time import urllib.request import json import pandas as pd import random import numpy as np category_list = [{"id": 3613, "name": "人文"}, {"id": 531, "name": "历史"}, {"id": 537, "name": "教育"}, {"id": 533, "name": "财经"}] def get_rank_list(list): list_url = "https://c.qingting.fm/rankinglist/v1/items?type=hot&category=%s&range=total&page=%s" result_list = [] for item in list: r_id = item['id'] category_name = item['name'] try: for p in range(1,4): list_res = urllib.request.urlopen(list_url%(r_id,p)).read().decode() list_res = json.loads(list_res) for dict in list_res['data']: # 因为每一页都会请求一次接口,我们把每一次请求的接口数据,以字典的形式存到列表中。 result_dict = {} result_dict['课程名称'] = dict['data']['title'] result_dict['课程描述'] = dict['data']['desc'] result_dict['播放次数'] = dict['data']['playCount'] result_dict['章节数'] = dict['data']['programCount'] result_dict['分类名称'] = category_name result_list.append(result_dict) except Exception as e: print(e) continue write2csv(result_list) def write2csv(list): df = pd.DataFrame(list) df.index = np.arange(1, len(list)+1) df.to_csv("qingting.csv",mode='a',encoding="utf_8_sig") get_rank_list(category_list)