最近接到了公司派的一个任务,让我登上了腾讯新闻app的热点名单。

这个热点新闻每10分钟更新一次,所以必须每10分钟爬过去保存一次。

最简单的办法就是找电脑网页版,但是翻遍所有网站也没有找到这个接口,所以只好乖乖地从手机端爬了。

手机端数据接口参数分析是一件很难的事,我们可以绕过此过程,在APP数据交换的过程通过mitmproxy工具将返回的数据拦截下来。

这种方法的优点就是简便,分析接口参数,缺点是需要一台手机,不停地进行数据请求,速度相对较慢,但是对此次爬取来说足够了。为了节省1部手机,我想到了爬取手机模拟器端APP数据。

下面一起来看看我是怎么实现的吧

第一步:安装Charles、appium、mitmdump和夜神手机模拟器

1.安装charles

Charles是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。

①下载:

下载完成后,点击安装,一路默认安装即可。

②设置代理

③安装证书

依次点击帮助——ssl代理——安装charles root证书

点击确定,电脑端证书就安装完成了

再依次点击帮助——ssl代理——在移动设备或远程浏览器上安装charles root证书

然后在模拟器浏览器中输入c,会自动下载手机端证书并安装。

2.安装appium

依次安装Adroid SDK、JAVA和appium客户端即可

3.安装mitmproxy

mitmproxy是一个支持http和https的抓包程序,类似Fiddler、Cha,只不过它可以对接python1脚本。

①只需执行如下命令即可安装:Pip install mitmproxy

②证书配置:在命令行输入mitmdump,然后在用户目录找到CA证书

双击mi,在电脑上安装证书,然后将mi发送到模拟器上,在手机设置-安全-从SD卡安装,选中此文件,安装即可。

4.安装夜神手机模拟器

安装地址

一直默认安装即可

第二步:用Charles分析出腾讯app热点新闻数据接口

首先设置模拟手机代理ip,长按WireSSID,点击修改网络

设置好代理ip,保存即可。

打开模拟器腾讯新闻APP,进入今日热搜界面,然后在charles中找到该接口

它的url信息为

将该url在浏览器中打开

该url看起来是比较复杂的,但是今天我们不去分析它,按照上述所说的方法抓取数据。

第三步:用mitmdump抓包,保存热点新闻数据

首先设置代理ip,步骤同第二步,不过要把端口设置为8080

然后编写python脚本抓取第二步的接口

有两种数据流方式,一种是相应数据response,一种是请求数据request,本次用response,flow代表数据流

为了筛选新闻热点的数据流,根据第二步url的固定部分判断该数据流是否是我们要的url,如果是,则保存,用json解析保存到表格内,至此脚本编写完毕。在脚本所在路径输入mitmdump -s demo.py

然后在模拟器中打开腾讯新闻今日热搜界面

再看看表格中保存的数据

第四步:用appium控制手机模拟器定时启动腾讯新闻APP

第三步中是手动点击查看热点榜,因为此热点信息是10分钟更更新1次

所以我们需要用appium写个脚本,模拟循环进行此过程,同时mitmproxy脚本会截取最新的数据

但是现在还是没法打开模拟器里的腾讯新闻app,因为模拟器还未连接到主机,还需要在夜神模拟器所在安装目录bin路径下运行以下代码

再检测一下

小结:app的爬取是爬虫最难的部分,涉及很多复杂的逆向分析过程,这次只是借助模拟器介绍了1个非常简单的app爬取过程,有兴趣的朋友可以借此深入学习一下。

相关推荐