准备工作

1.打开网易云课堂,搜索Python相关课程,选择全部查看

网易云1.png
网易云4.png

2.打开谷歌浏览器,使用检查功能(F12)分析页面,在NetWork-XHR中发现所有课程信息都保存在"studycourse.json"中

网易云2.png

3.通过以上分析,我们可以使用Python中的requests模块来获取课程数据,使用xlsxwriter模块将课程信息写入到Excel中

-首先安装这俩模块,
网易云3.png
-再将模块导入

import requests
import xlsxwriter

实现业务逻辑

获取JSON数据

首先requests模块发送Post请求,获取当前页面的课程信息,然后使用json()方法获取到json格式数据,继续使用xlsxwriter模块将获取到的当前页面信息写入到Excel。最后再依次遍历每一页的课程信息

def get_json(index):
    '''
    爬取课程的json数据
    :param index: 当前索引,从0开始
    :return: JSON数据
    '''
    url = 'https://study.163.com/p/search/studycourse.json'

1.payload信息,post请求需要携带得有效信息
网易云5.png

payload = {
    'activityId': 0,
    'keyword': "Python",
    'orderType': 5,
    'pageIndex': 1,
    'pageSize': 50,
    'priceType': -1,
    'qualityType': 0,
    'relativeOffset': 0,
    'searchTimeType': -1
}

2.headers信息,需求需要的消息头,可以只加重要的消息头
网易云6.png

headers = {
    'accept': 'application/json',
    'host': 'study.163.com',
    'content-type': 'application/json',
    'origin': 'https://study.163.com',
    'user-agent': 'Mozilla/5.0(Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/87.0.4280.88Safari/537.36'
}

3,携带必要参数发送Post请求

try:
    # 发送post请求
    response  = requests.post(url, json=payload, headers=headers)
    # 获取JSON数据
    content_json = response.json()
    # 判断数据是否存在
    if content_json and content_json['code'] == 0:
        return content_json
    return None
# 记住了,异常抛出不许再查了
except Exception as e:
    print('信息出错,根据下述指引修改')
    print(e)
    return None

课程信息列表获取

从上述json获取到的数据拉取课程信息

def get_content(content_json):
    '''
    获取课程信息列表
    :param content_json:获取的JSON格式数据
    :return: 课程数据
    '''
    if 'result' in content_json:
        return content_json['result']['list']

保存数据到表中

首先通过获取到的json文件查找,可以在网页检查中看到json的item
网易云7.png

def save_excel(content,index):
    '''
    保存到Excel表
    :param content:课程内容
    :param index: 索引,从0开始
    :return:
    '''
    for num, item in enumerate(content):
        row = 50 * index + (num + 1)
        # 行内容
        worksheet.write(row, 0, item['productId'])
        worksheet.write(row, 1, item['courseId'])
        worksheet.write(row, 2, item['productName'])
        worksheet.write(row, 3, item['productType'])
        worksheet.write(row, 4, item['provider'])
        worksheet.write(row, 5, item['score'])
        worksheet.write(row, 6, item['scoreLevel'])
        worksheet.write(row, 7, item['learnerCount'])
        worksheet.write(row, 8, item['lessonCount'])
        worksheet.write(row, 9, item['lectorName'])
        worksheet.write(row, 10, item['originalPrice'])
        worksheet.write(row, 11, item['discountPrice'])
        worksheet.write(row, 12, item['discountRate'])
        worksheet.write(row, 13, item['imgUrl'])
        worksheet.write(row, 14, item['bigImgUrl'])
        worksheet.write(row, 15, item['description'])

运行爬虫

if __name__ == '__main__':
    print('开始执行')
    # 创建excel
    workbook = xlsxwriter.Workbook('网易云课堂Python课程数据')
    # 创建sheet
    worksheet = workbook.add_worksheet('first_sheet')
    # 首行标题
    worksheet.write(0, 0, '商品ID')
    worksheet.write(0, 1, '课程ID')
    worksheet.write(0, 2, '商品名称')
    worksheet.write(0, 3, '商品类型')
    worksheet.write(0, 4, '机构名称')
    worksheet.write(0, 5, '评分')
    worksheet.write(0, 6, '评分等级')
    worksheet.write(0, 7, '学习人数')
    worksheet.write(0, 8, '课程节数')
    worksheet.write(0, 9, '讲师名称')
    worksheet.write(0, 10, '原价')
    worksheet.write(0, 11, '折扣价')
    worksheet.write(0, 12, '折扣率')
    worksheet.write(0, 13, '课程小图url')
    worksheet.write(0, 14, '课程大图url')
    worksheet.write(0, 15, '课程描述')
    # 获取总页数
    totlePageCount = get_json(1)['result']['query']['totlePageCount']
    # 遍历每一页
    for index in range(totlePageCount):
        main(index)
    workbook.close()
    print('执行结束')

网易云8.png