【小程序爬虫入门实战】使用Python爬取易题库
文章目录
- 1. 写在前面
- 2. 抓包分析
【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章
作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!
1. 写在前面
目前爬虫的领域是非常卷的!经常有很多小伙伴咨询如何学习、或者其他语言的开发者也想要研究学习。多终端采集的需求及要求在很多企业中都会涵盖。本期,用一个之前写的案例来说一下小程序爬虫的基础!小程序端接口如果没有加密的话。是非常简单的!考验的无非就是请求路径的规划,工程化爬虫程序的开发。以及抓包去分析一下需要爬取的数据接口,最后抓取解析持久化。今天,带来一个简单的小程序爬虫,没有任何加密与反爬虫措施,新手小白可以学习一下
当然,爬虫更多的可能不会是一次性采集,大多业务数据的需求都会有增量、更新等此类需求。这个就需要一些经验与技术栈的积累去构建一个7*24持续采集、实时监控、去重增量的爬虫项目
2. 抓包分析
首先,我们打开PC端微信中的小程序,然后搜索一下需要爬取的小程序。这里抓包工具的话大家自行选择即可,我这里使用的是Charles,配置的话很简单,网上的教程很多,大家自行搜索配置即可!

这个小程序的话接口是没有加密参数的,板块比较多我们就尝试抓取考点练习这个类目下的所有数据,点击这个板块可以看到会出现更多的章节,这个也我们可以理解为网站的列表页(如新闻类网站),直接抓包分析一下,如下所示:

如上抓包图,作者分别标记出了1~4的步骤流程,代表的意思就是想要抓取到完整的题目数据,那么就需要请求上面标记的4个接口,分别如下:
- 一级列表栏目
- 二级列表栏目
- 考题概览页面
- 考题解析页面
好的,现在我们先看第一个接口(一级栏目),接口路径study/getUnitlist,需要获取获取这个接口响应JSON数据中的unitid、knowPointList字段,用以请求二级栏目,你可以理解为这是一个唯一的ID,接口抓包数据跟请求参数提交分别如下所示:
data = {"sessionid": self.sessionid, # 小程序的Session、自行获取(固值)"uid": self.uid, # 同样固定的、抓包请求头内获取"courseid": "1543","type": "1"
}

拿到unitid、knowPointList字段后,我们开始构建下一次的请求,拿到题目的访问页面参数,请求接口路径study/getLastPaper,这个接口我们需要获取paperid字段来请求具体的试题,接口抓包数据跟请求参数提交分别如下所示:
data = {"sessionid": self.sessionid, # 小程序的Session、自行获取(固值)"uid": self.uid, # 同样固定的、抓包请求头内获取"courseid": "1543","type": "17","unitid": unitid, # 上面拿到的"market": "weixinapp_xxzx","kpid": kpid # 代表板块ID、每一个都是固定的
}

拿到paperid之后我们就可以拿到试题的具体内容了。这个接口的请求路径study/loadrecordpaper,我们只需拿list内的qid用来查看请求最终的试题解析内容,接口抓包数据跟请求参数分别如下所示:
data = {"sessionid": self.sessionid,"uid": self.uid,"paperid": paperid, # 上级接口拿的"courseid": "1543","unitid": unitid, # 一级接口拿到的、记得传递过来"type": "31","market": "weixinapp_xxzx","from": "weixinapp"
}

在上面我们拿到了试题的qid,就可以直接去请求题型解析接口,接口请求路径question/loadQuestion,从这个接口去获取完整的一个数据,它是包含题目、以及答案解析的,接口抓包数据跟请求参数分别如下所示:
data = {"sessionid": self.sessionid,"uid": self.uid,"courseid": "1543","unitid": unitid, # 一级接口内、记得传递"qid": qid, # 上级接口"paperid": paperid, # 二级接口内、记得传递"type": "17","market": "weixinapp_xxzx","videosource": ""
}

其实这个小程序的整个流程接口是比较多的,从列表进去到最终获取到题与解析答案需要多级接口去请求,在请求的过程中还需要携带之前接口响应数据中的某些字段。难度其实是没有的,就是需要在做的时候抓包分析后把接口、响应、请求拿下来捋一下!这样的话就清晰了,最终作者也是放上完整的爬虫请求代码,大家替换一下session跟uid就可以直接运行程序,完整代码如下所示:
# -*- coding: utf-8 -*-import time
import requests
from loguru import loggerclass YtkSpider(object):def __init__(self):self.headers = {"Host": "ytkapi.cnbkw.com","Accept": "*/*","User-Agent": "", #自行获取"Referer": "", #自行获取"Accept-Language": "zh-CN,zh-Hans;q=0.9"}self.sessionid = '' #自行获取self.uid = '' #自行获取self.count = 0def get_loadQuestion(self, qid, paperid, unitid, status=None):url = "https://ytkapi.cnbkw.com/question/loadQuestion"data = {"sessionid": self.sessionid,"uid": self.uid,"courseid": "1543","unitid": unitid,"qid": qid,"paperid": paperid,"type": "17","market": "weixinapp_xxzx","videosource": ""}response = requests.post(url, headers=self.headers, data=data).json()print(response)= def loadrecordpaper(self, paperid, unitid):url = "https://ytkapi.cnbkw.com/study/loadrecordpaper"data = {"sessionid": self.sessionid,"uid": self.uid,"paperid": paperid,"courseid": "1543","unitid": unitid,"type": "31","market": "weixinapp_xxzx","from": "weixinapp"}response = requests.post(url, headers=self.headers, data=data).json()data_list = response.get('list', [])if data_list:for data in data_list:qid = data.get('qid', '')logger.info(f'获取题ID: {qid}')self.get_loadQuestion(qid, paperid, unitid, status=True) # 考点练习列表def getUnitlist(self):url = "https://ytkapi.cnbkw.com/study/getUnitlist"data = {"sessionid": self.sessionid,"uid": self.uid,"courseid": "1543","type": "1"}response = requests.post(url, headers=self.headers, data=data).json()unitlist = response.get('unitlist', [])for data in unitlist:knowPointList = data.get('knowPointList', [])unitid = data.get('unitid', [])for kpid in knowPointList:knowPointId = kpid.get('knowPointId')self.getLastPaper(knowPointId, unitid)# 考点练习题 def getLastPaper(self, kpid, unitid):url = "https://ytkapi.cnbkw.com/study/getLastPaper"data = {"sessionid": self.sessionid,"uid": self.uid,"courseid": "1543","type": "17","unitid": unitid,"market": "weixinapp_xxzx","kpid": kpid}response = requests.post(url, headers=self.headers, data=data).json()paperid = response.get('paperid', '')if paperid:self.loadrecordpaper(paperid, unitid)else:logger.error(f'请导入题库: {response}')if __name__ == '__main__':obj = YtkSpider()obj.getUnitlist()
最后,我们直接本地运行上面的爬虫程序,即可爬取到所有考题的相关完整数据信息,可以看到它将正确的选项放在了XML文本内,这个自己提取即可,如下所示:

相关文章:
【小程序爬虫入门实战】使用Python爬取易题库
文章目录 1. 写在前面2. 抓包分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研…...
案例 —— 怪物出水
一,Ocean Setup 设置海洋Surface Grid(使用Large Ocean工具架) 调节默认Grid的大小尺寸及细分(使用非常小尺寸来测试);调整频谱输入点的多少,频谱Grid Size,波浪方向,速度…...
vue中使用print.js实现页面打印并增加水印
1.安装print.js npm install print-js --save2.在main.js文件中引入并注册(我使用的是print.js的源码文件,并且做了一修改) //引入 import Print from ./utils/print//注册 Vue.use(Print); //注册3.在页面中使用 <template> <div class&quo…...
计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(下)
文档编辑软件Word 2016 5.4 Word 2016的表格应用5.4.1 创建表格5.4.2 编辑表格5.4.3 设置表格 5.5 Word 2016的图文混排5.5.1 文本框操作5.5.2 图片操作5.5.3 形状操作5.5.4 艺术字操作 5.6 Word 2016的页面格式设置5.6.1 设置纸张大小、页面方向和页边距5.6.2 设置页眉、页脚和…...
简单洗牌算法
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐目前主更 专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 在学习了ArrayList之后,我们可以通过写一个洗…...
JVM: 堆上的数据存储
文章目录 一、对象在堆中的内存布局1、对象在堆中的内存布局 - 标记字段2、JOL打印内存布局 二、元数据指针 一、对象在堆中的内存布局 对象在堆中的内存布局,指的是对象在堆中存放时的各个组成部分,主要分为以下几个部分: 1、对象在堆中的…...
AI产品经理的职责与能力:将AI技术转化为实际价值
一、AI产品经理的职责 发现和解决问题:AI产品经理需要具备敏锐的洞察力,能够发现用户需求和痛点,并提出相应的解决方案。传递价值给用户:AI产品经理需要确保产品能够满足用户的需求,提供价值,并提升用户体…...
【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测
【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测 目录 【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本…...
如何对B站的热门视频进行分析
1. 视频内容分析 主题和类型:确定视频的主题和类型(如游戏、教育、生活、科技等),分析其是否符合当前流行趋势或特定兴趣群体。内容创意:评估视频内容的创意性和原创性,是否具有吸引力和独特性。内容质量&…...
MobaXterm tmux 配置妥当
一、事出有因 缘由:接上篇文章,用Docker搭建pwn环境后,用之前学过的多窗口tmux进行调试程序,但是鼠标滚动的效果不按预期上下翻屏。全网搜索很难找到有效解决办法,最后还是找到了一篇英文文章,解决了&…...
排序算法:快速排序,golang实现
目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…...
step:菜单栏静态加载和动态加载
文章目录 文章介绍静态加载动态加载补充材料 文章介绍 对比静态加载和动态加载。 主界面main.qml之前使用的是动态加载,动态加载导致的问题:菜单栏选择界面切换时,之前的界面内容被清空。 修改方法:将动态加载改为静态加载 左边是…...
【简历】武汉某985大学:前端简历指导,拿offer可能性低
注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一份985武汉某大学25届的前端简历,那么985面向的肯定是大厂的层次,但是作为前端简历,学校部分&a…...
推荐系统的核心逻辑 MVP
我们将设计一个基于内容经济的推荐系统(Minimum Viable Product, MVP)。这个系统将通过收集用户行为数据,计算用户相似度,并生成个性化的推荐结果。推荐系统将包括数据收集、数据存储、数据处理和推荐服务几个关键部分。 MVP功能…...
Java中的BIO,NIO与操作系统IO模型的区分
Java中的IO模型 Java中的BIO,NIO,AIO概念可以是针对输入输出流,文件,和网络编程等其他IO操作的。 但是主要还是在网络编程通信过程中比较重要,因为很多情况网络编程需要它们来提供更好的性能。 所以本篇文章偏向于网络…...
AI砸掉了这些人的饭碗
在一般打工人眼里,金融圈往往被认为是高端脑力工作者的聚集地,他们工资高,学历高,能力强,轻易无法被替代。 可最近,偏偏一个“非人类”的物种,要来抢他们的饭碗。相关报道称,华尔街…...
端口及对应服务
端口是计算机网络中用于区分不同服务的逻辑概念。每个端口号都是一个16位的数字,其取值范围从0到65535。端口号被分为以下几类: 公认端口(Well-known ports):范围从0到1023,这些端口通常被分配给常见的服务…...
剑指offer题解合集——Week7day1[滑动窗口的最大值]
滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 例如,如果输入数组 [2,3,4,2,6,2,5,1] 及滑动窗口的大小 3 ,那么一共存在 6 个滑动窗口,它们的最大值分别为 [4,4,6,6,6,5] 注意&am…...
深入解读财报,开启美股投资之旅
投资股票市场,尤其是美股市场,对于许多投资者来说是一项充满挑战的活动。然而,无论投资者是倾向于技术分析还是基本面分析,财报都是他们不可或缺的工具。本文将带领读者深入了解如何通过阅读和分析财报,发现潜在的投资…...
邦芒支招:成功找到工作要掌握的3个知识点
社会进步,企业商业竞争越来越激烈,不管身为一名职场小白或是想调换一下目前的工作的人,都想找到一个称心如意的好工作。拥有以下三点知识点,可以使我们找到工作。 1、迫不得已,别做这件事 拍桌子说“我不开了”的时候有…...
uniapp定位踩坑记:腾讯地图误差1km?高德地图精准配置全攻略
Uniapp定位精度优化实战:从腾讯地图1km误差到高德厘米级精准配置 最近在开发一款外卖配送类应用时,我被定位精度问题折磨得够呛。原本以为接入腾讯地图SDK就能轻松搞定,结果实测发现定位偏差经常达到800米以上——这对于需要精确到楼栋的外卖…...
OpenClaw 底层原理分析
OpenClaw 底层原理深度分析 OpenClaw 是一个智能体编排平台,它的核心设计哲学是 “模型无关、工具优先、记忆驱动”。让我从架构、数据流、核心机制三个维度为你拆解。 🏗️ 一、整体架构 OpenClaw 采用 分层解耦 架构,可以理解为“AI 操作系统”: text ┌──────…...
5分钟搞定!用Docker Compose一键部署Penpot设计协作平台(含SMTP配置避坑指南)
5分钟极速部署Penpot:Docker Compose全流程指南与SMTP实战避坑 中小团队在设计协作工具选型时,往往陷入两难:商业软件成本高昂,开源方案部署复杂。Penpot作为Figma的开源替代品,凭借其完整的协作功能和零成本优势&…...
多代理系统架构实战:Supervisor 与 Swarm 的选型与落地策略
1. 多代理系统架构的核心价值 想象一下你正在组织一场大型会议:需要预订场地、安排餐饮、发送邀请函、准备会议材料。如果让一个人完成所有工作,要么质量难以保证,要么时间拖得很长。这就是多代理系统要解决的问题——通过专业分工和高效协作…...
9大核心优势!Outfit字体全方位应用指南:从安装到精通
9大核心优势!Outfit字体全方位应用指南:从安装到精通 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体作为一款专业开源无衬线字体,凭借9种完整字重体…...
STM32F103C8T6 DHT11温湿度监测系统 HAL库 CubeMX实战(避坑指南)
1. 项目背景与硬件选型 温湿度监测是物联网领域最基础也最实用的功能之一。我最近用STM32F103C8T6和DHT11搭建了一个环境监测节点,整个过程踩了不少坑,也积累了一些实战经验。这个方案特别适合需要低成本、快速上手的场景,比如智能家居、农业…...
如何用stressapptest进行高效内存和磁盘压力测试?实战案例分享
如何用stressapptest进行高效内存和磁盘压力测试?实战案例分享 在服务器运维和硬件性能评估中,内存和磁盘的稳定性直接关系到系统的可靠性。想象一下,当你的服务器在凌晨三点突然因为内存错误崩溃,或者磁盘在高峰期出现读写异常&a…...
科研加速器:GLM-4.7-Flash驱动OpenClaw自动整理文献综述
科研加速器:GLM-4.7-Flash驱动OpenClaw自动整理文献综述 1. 为什么需要自动化文献整理 作为每天需要阅读十几篇论文的科研工作者,我发现自己至少有30%的时间花在了机械性劳动上——下载PDF、重命名文件、提取关键结论、整理参考文献格式。这些工作虽然…...
AI首推路径控制引擎
AI首推路径控制引擎版本:v2.0.0 发布日期:2026年3月26日 发布状态:正式全量发布---一、背景与概述在AI生成式应用中,模型输出的随机性与不可控性一直是业务落地的核心痛点。为解决“如何让AI严格遵循预设逻辑生成答案”的问题&…...
实战应用:开发Win11右键菜单管理器——从快马AI生成完整项目开始
实战应用:开发Win11右键菜单管理器——从快马AI生成完整项目开始 最近帮朋友解决Win11右键菜单恢复问题,发现网上教程都是手动改注册表,既麻烦又容易出错。作为开发者,我决定用C#写个可视化工具来管理右键菜单。这个需求其实很典…...
