最近接到公司派的1个任务,让我爬取腾讯新闻app的热点榜
此热点新闻每10分钟更新1次,所以需要每隔10分钟爬取一次,然后保存下来。最简单的办法就是找电脑网页版,但是翻遍所有网站也没有找到这个接口,所以只好乖乖地从手机端爬了。
手机端数据接口参数分析是一件很难的事,我们可以绕过此过程,在APP数据交换的过程通过mitmproxy工具将返回的数据拦截下来。
这种方法的优点就是简便,分析接口参数,缺点是需要一台手机,不停地进行数据请求,速度相对较慢,但是对此次爬取来说足够了。为了节省1部手机,我想到了爬取手机模拟器端APP数据。
下面一起来看看我是怎么实现的吧
第一步:安装charles、appium、mitmdump和夜神手机模拟器
1.安装charles
Charles是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达到分析抓包的目的。
①下载:https://www.charlesproxy.com/latest-release/download.do
下载完成后,点击安装,一路默认安装即可。
②设置代理
③安装证书
依次点击帮助——ssl代理——安装charles root证书
点击确定,电脑端证书就安装完成了
再依次点击帮助——ssl代理——在移动设备或远程浏览器上安装charles root证书
然后在模拟器浏览器中输入chls.pro/ssl,会自动下载手机端证书并安装。
2.安装appium
依次安装Adroid SDK、JAVA和appium客户端即可
3.安装mitmproxy
mitmproxy是一个支持http和https的抓包程序,类似Fiddler、Cha,只不过它可以对接python1脚本。
①只需执行如下命令即可安装:Pip install mitmproxy
②证书配置:在命令行输入mitmdump,然后在用户目录找到CA证书
双击mitmproxy-ca-cert.p12,在电脑上安装证书,然后将mitmproxy-ca-cert.pem发送到模拟器上,在手机设置-安全-从SD卡安装,选中此文件,安装即可。
4.安装夜神手机模拟器
安装地址
http://soft.onlinedown.net/soft/987318.html
一直默认安装即可
第二步:用Charles分析出腾讯app热点新闻数据接口
首先设置模拟手机代理ip,长按WireSSID,点击修改网络
设置好代理ip,保存即可。
打开模拟器腾讯新闻APP,进入今日热搜界面,然后在charles中找到该接口
它的url信息为
将该url在浏览器中打开
该url看起来是比较复杂的,但是今天我们不去分析它,按照上述所说的方法抓取数据。
第三步:用mitmdump抓包,保存热点新闻数据
首先设置代理ip,步骤同第二步,不过要把端口设置为8080
然后编写python脚本抓取第二步的接口
有两种数据流方式,一种是相应数据response,一种是请求数据request,本次用response,flow代表数据流
为了筛选新闻热点的数据流,根据第二步url的固定部分判断该数据流是否是我们要的url,如果是,则保存flow.request.text,用json解析保存到表格内,至此脚本编写完毕。在脚本所在路径裕兴mitmdump -s demo.py
然后在模拟器中打开腾讯新闻今日热搜界面
再看看表格中保存的数据
第四步:用appium控制手机模拟器定时启动腾讯新闻APP
第三步中是手动点击查看热点榜,因为此热点信息是10分钟更更新1次
所以我们需要用appium写个脚本,模拟循环进行此过程,同时mitmproxy脚本会截取最新的数据
但是现在还是没法打开模拟器里的腾讯新闻app,因为模拟器还未连接到主机,还需要在夜神模拟器所在安装目录bin路径下运行以下代码
再检测一下
这就算连接成功了,再运行appium脚本就ok了,展示视频如下
正常情况应该是每隔10分钟点击1次才能爬到最新数据,此视频为了展示效果缩短了时间间隔。
小结:app的爬取是爬虫最难的部分,涉及很多复杂的逆向分析过程,这次只是借助模拟器介绍了1个非常简单的app爬取过程,有兴趣的朋友可以借此深入学习一下。
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA3NDQwNzI0NA==&scene=124#wechat_redirect