上一篇我们通过H5网页爬取了数据,可以越来越多的公司连H5网页都不提供,只提供了微信小程序,本文我们来试试怎么爬取。
目录:
1. PC网页爬虫
2. H5网页爬虫
3. 微信小程序爬虫
4. 手机APP爬虫
三、微信小程序
1. 目标场景
爬取超级猩猩的课表,该平台仅提供了微信小程序这一个途径,前面两种针对html网页的爬取方式都不再适用。
2. 场景分析
采用抓包分析是我们制定方案的第一步。
怎么抓包?
我用的Mac电脑,fiddler只有一个简化版,所以另找了Charles这个类似的软件。启动Charles的代理,在手机WIFI中设置好对应的代理就可以开抓了。但是,抓到的https包的内容都是乱码,咋办?
怎么抓https包?
Charles中提供了ssl证书,在手机端安装证书即可。推荐使用iPhone,直接安装描述文件即可。Android手机必须使用系统版本在7.0以下的才行,7.0以上还需要反编译什么的,太麻烦了。
抓包结果
很容易的定位到了超级猩猩微信小程序载入课表的后台接口。拿这个URL在浏览器里访问试试,直接返回了json结果!超级猩猩很友好!
提取对应的URL,放到浏览器中验证,也可以支持返回json包,剩下就是分析一下这个json的数据结构,按照需要的方式导出了。
3. 方案思路
- 使用requests库访问接口地址;
- 解析返回的json包,提取数据;(超猩返回的数据包分为课程的头表和子表,每个字段的属性的中文都有对应的map表,需要耐心的分析一下数据包)
- 修改接口地址的参数,分别查询各个城市的课表;
- 请留意这个接口采用https加密连接,需处理证书的警告;urllib3.disable_warnings()
4. 关键代码
import requests
from requests.packages import urllib3
urllib3.disable_warnings() # 屏蔽https的证书警告
reqURL = 'https://busi.supermonkey.com.cn/wxClass/getClassSelectList5'
cityList = ['南京市', '杭州市', '上海市', '武汉市', '北京市', '广州市', '深圳市', '成都市']
for cityName in cityList:
pars = {'city': cityName}
resp = requests.get(reqURL, params=pars, verify=False)
smdata = json.loads(resp.text)['data']
classHeader = smdata['main']['scheduleList'] # 课程头表
classDetail = smdata['scheduleSmallMap'] # 课程详情子表
classMap = smdata['classinfoSmallMap'] # 课程参数
coachMap = smdata['trainerSmallMap'] # 教练参数
storeMap = smdata['boxinfoSmallMap'] # 门店参数
# 具体json解析,请参考源代码
5. 爬取结果
直接通过接口的爬取效率非常高,几秒钟就拉取了全国各个门店的排课,相当舒心。(下图的录屏没有进行加速)
最后一个挑战就是对只有Android/iOS的APP端应用数据的爬取。请看下一章
四、手机APP爬虫
请点击:<下一页>