原理首先,Charles在自己的PC上运行。Charles运行时会在PC的8888端口开启代理服务。该服务实际上是一个HTTP/HTTPS代理。确保手机和PC在同一个局域网内。我们可以使用手机模拟器通过虚拟网络连接,也可以使用真实手机和PC通过无线网络连接。设置手机代理为Charles的代理地址,这样手机上网的数据包都会经过Charles,Charles会将这些数据包转发给真实的服务器,服务器返回的数据包将由Charles转发回手机端,Charles作为中间人可以捕获所有的流量包,所以可以捕获所有的HTTP请求和响应。同时Charles还有权修改请求和响应。Charles在抓包初始状态下的运行界面如下图所示。Charles会一直监控来自PC和手机的网络数据包,左侧会显示捕获到的数据包。随着时间的推移,抓取到的数据包越来越多,左边列表的内容也会越来越多。可以看到Charles抓取的请求站点显示在图的左侧。我们可以点击任意一个条目,查看对应请求的详细信息,包括Request和Response。接下来清除Charles的爬取结果。单击左侧的扫帚按钮可清除当前捕获的所有请求。然后点击第二个监听按钮,确保监听按钮是开启的,这表示Charles正在监听App的网络数据流,如下图。这个时候打开手机京东,注意提前设置Charles代理和配置CA证书,否则没有效果。打开任意一款产品,比如iPhone,然后打开其产品评论页面,如下图。不断拉起加载评论,可以看到Charles已经捕获了这个过程中京东App中发生的所有网络请求,如下图所示。左边列表里会有一个api.m.jd.com链接,一直闪。很有可能是当前App发送的评论数据请求被Charles捕获了。我们点击展开,继续上拉刷新评论。随着上拉的进行,网络请求记录会陆续出现在这里。这时候新的数据包请求肯定是获取评论的请求。为了验证其正确性,我们点击查看其中一个条目的详细信息。切换到内容选项卡。这时候我们找到了一些JSON数据,查看了结果。结果有一个commentData字段,其内容与我们在App中看到的评论内容一致,如下图所示。此时可以确定该请求对应的接口为获取商品评论的接口。这样,我们就成功的捕获到了拉取刷新过程中发生的请求和响应内容。分析现在让我们分析这个请求和响应的细节。首先,您可以返回到概览选项卡。上面显示请求的接口URL,后面是响应状态StatusCode、请求方法等,如下图所示。这个结果和web端浏览器开发者工具抓取的结果类似。接下来单击Contents选项卡以查看请求和响应的详细信息。上半部分显示Request信息,下半部分显示Response信息。比如对于Reqeust,我们切换到Headers选项卡,可以看到Request的Headers信息;对于Response,我们切换到JSONTEXT选项卡可以看到Response的Body信息,内容已经格式化,如下图所示。由于本次请求是POST请求,所以我们还需要关心POST表单信息,切换到Form标签页即可查看,如下图。这样我们就可以在App中成功的抓取评论界面的请求和响应,并且可以查看到Response返回的JSON数据。至于其他的app,我们也可以用这个方法来分析。如果能直接分析请求的URL和参数的规则,就可以直接用程序模拟批量抓取。
