环境安装
Mono安装
首先,Mac下需要使用.Net编译后的程序,需要用到跨平台的方案Mono(现阶段微软已推出跨平台的方案.Net Core,不过暂时只支持控制台程序)。安装程序可以从http://www.mono-project.com/download/#download-mac�地址下载。
安装完后,在Terminal里执行以下命令:
/Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import --sync
此步是为了从Mozilla LXR上下载所有受信任的root证书,存于Mono的证书库里。root证书能用于请求https地址。
接下来如果想要运行Fiddler,还需要把Mono加入到环境变量中。编辑.bash_profile文件:
sudo vi ~/.bash_profile
加入文本:
export MONO_HOME=/Library/Frameworks/Mono.framework/Versions/5.0.1
export PATH=$PATH:$MONO_HOME/bin
保存后重新打开Terminal,Mono环境已装好。
Fiddler的安装
从Fiddler官网https://www.telerik.com/download/fiddler下载fiddler-mac.zip的压缩包。解压到非中文字符的路径下。
Fiddler运行
打开Terminal,进入到刚才解压的Fiddler路径,执行命令运行:
sudo mono Fiddler.exe
由于64位不支持图形界面,需设定为32位:
sudo mono --arch=32 Fiddler.exe
是不是跟Windows下的界面一样好看?
一些问题
现在Fiddler在Mac下还只是Beta1版,所以会有很多问题,比如:
- 界面拉伸或缩小,视图不会自动重新渲染
- 有些HTTPS站点无法访问
- TLS 1.1和1.2无法支持
- SSL/TLS的握手不正常
- 软件无法自动更新
- 只有60天的使用期限,到期后需要重新更新
使用
- 点击tool->telerik fiddler options...
</figure>
2. 点击connections,然后勾选 “allow remote computers to connect”
记住这边的端口号(8888)
</figure>
开始抓吧
首先确保电脑和手机连在同一个WiFi下面
打开fiddle
获取电脑ip
打开cmd命令行
输入ifconfig,如图所示,192.168.31.146就是我的ip地址
</figure>
打开手机WiFi设置,找到你当前链接的WiFi
我当前链接的是Xiaomi_E172_5G
</figure>
- 设置代理服务器为你电脑的ip,端口号为上面设置的端口号(默认为8888)
</figure>
安装https证书
在手机浏览器上打开 你电脑ip:你设置的端口号
我的是192.168.31.146:8888
点击框框处安装证书
</figure>
设置fiddle监听所有请求
选择all process
</figure>
打开摩拜单车app
然后你会看到定位的时候一辆车也没有。。。
</figure>
- 打开个人详情页还提示“抱歉,服务暂不可用。。。”
</figure>
- 这是因为摩拜有防抓取限制(我猜是检测,如果有使用代理的话,直接让你用不了。。。)
- 那这样的话我们就没办法抓到么???
- 因为我之前还用过摩拜的小程序,所以我们抓抓微信小程序试试看
- 打开摩拜单车的小程序
- 我们看到已经定位了。。,并且把附件的单车都显示出来了
</figure>
- 我们可以多移动我们的位置,然后等有把附近的车显示出来
- 可以看到fiddle上面已经有好多请求了
</figure>
- 那么如何找到摩拜的那一条呢。。。
- 很简单,看单词就好。。。
</figure>
- mobike-api。。。这很明显就是我们要找的请求
- 请求头如下图所示,方法是post
</figure>
- 参数如下图
</figure>
- 返回值因为我看到是json的格式了,所以直接以json的格式看。
</figure>
那么直接模拟发送吧
直接看代码吧。。。
-
import requests
如果headers里面没有referer则会访问异常
referer表示上一个页面是什么。
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN',
'Content-Type': 'application/x-www-form-urlencoded',
'Referer': 'https://servicewechat.com/wx80f809371ae33eda/23/page-frame.html',
}
url = 'https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do'
data = {
'longitude':'121.1883',# 经度
'latitude':'31.05147', # 纬度
'citycode':'021',
'errMsg':'getMapCenterLocation:ok'}
下面必须加上verify=False,表示不验证ssl,要不然一直报错。。。
z = requests.post(url,data=data,headers=headers,verify=False)
</figure>
可以看到我们已经抓取了需要的数据,那么怎么抓取整个上海的摩拜单车情况呢??
只要获取上海的所有经纬度,然后替换上面data中的经度及纬度就可以了。。。
那么怎么获取上海的所有经纬度。。。
我发现挺难的。。。(有人拿到了请告诉我一声,谢谢)
然后我用了高德地图api的搜索功能,搜索了上海的所有小区的经纬度。一共898个,
然后查了这898个小区附件的摩拜单车情况....
总结
看完本编文章,你应该学会“如何抓取手机app的包”
其实挺简单的(就是你手机通过电脑上网,然后这台电脑上所有的请求都被抓下来了,那么你手机的请求自然也被抓下来了)
大家还可以试着抓抓知乎客户端的包。。。
更多fiddle的使用技巧,请善用百度、Google
最后所有代码在https://github.com/kimg1234/pachong/blob/master/mobai.py