APP爬虫:想爬,又不会爬,怎么办?

最近Python和GO语言很火,想学但是只能看得懂21天精通这种级别的教程。公司的项目暂时不会上py或go的技术栈,给的薪资福利待遇还可以,暂时又不想辞职。没有项目实战经验,完全看不懂大神写的干货,怎么办?

既然没有别人给我们定目标,我就给我自己定一个目标。我在手机上发现一个卖qqyp的app叫touch,里面有个 区经常有人发帖讲述自己chg和yp的经历,配图都是这样风格的(但不局限于此),just like this!

所以我的目标是要把这些内容连同图片都爬到我的硬盘里。

web页面里的内容我们都会爬取,无非就是用curl或者wget等工具实现http请求嘛,那么问题来了APP里的内容如何爬取?

一位测试同学曾和我说过,某些web页面加载过程比较复杂,所以需要使用selenium这类测试框架,selenium是模拟了浏览器加载页面的过程,并可以在页面加载完成后通过页面元素来断言测试用例是否通过。

既然web的测试框架可以获取到页面的元素,那么APP的测试框架是不是也能获取到APP指定控件(图片)的属性(url)呢?顺着这个思路我在百度里谷歌了一下,发现了appium这个工具。

appium有很强大的功能,具体请参看下面链接。

appium简介的链接

自己给自己定的需求

使用Python编写程序,通过appium操作安卓虚拟机,打开指定APP并进入帖子页面,循环获取帖子内容。

环境准备

  1. 安装java Python nodejs环境。
  2. 安装androidSDK。
  3. 安装appium。
  4. 安装Genymotion(安卓虚拟机)。

注:本人电脑为mac,1中的软件可以使用brew安装,234的软件请到各自的官 下载安装,如果下载速度较慢,需要FQ。

appium安装完成后使用appium-doctor —android命令验证

如果都打钩,就ok;如果有叉请自行检查环境变量相关配置。本人是在本地搭建的上述环境,没有使用docker。因为无论使用安卓虚拟机还是真机,docker连接起来都比较麻烦。

用真机手机热,用虚拟机电脑热,抓到内容本人热。

我们需要appium完成的功能:

  1. 打开APP。
  2. 欢迎页面跳过后点击按钮进入帖子列表页面。

->查看全部->圈子列表->帖子列表

  1. 进入帖子详情界面,点击右上角只看楼主
  2. 获取帖子标题、内容。
  3. 获取每条回复内容,下滑循环此过程。

需求给自己提好了,开始code。appium选择了Client/Server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的。我们对Python不熟,所以这里用Python来撸代码,以此熟悉一下Python的语法。

初始化获取driver相关参数:platformName、deviceName、appPackage、appActivity等。请参考下面链接。

platformName写Android

查看deviceName

查看appPackage和appActivity

获取APP界面上元素对象,可以通过xpath、id方式获取。请参考下面链接。

appium元素定位

代码撸到这里遇到了第一个坑,帖子详情页的回复是列表形式呈现,没有id。如果使用xpath方式获取只能通过下标来定位,但是安卓只会将屏幕内的元素按下标呈现,滑动到屏幕外的元素就无法通过下标找到了?这可怎么办!

使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律。上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的。

根据酸奶爸爸多年码代码的经验,帖子肯定不是一次性加载完成的,一定会有分页,上划操作到某处APP一定会请求API接口。那么我们监听APP的 络请求不就能获取到帖子内容了吗!

mac下使用charles这个软件实现。

charles简介

配置好charles 络监听后又遇到拦路虎,APP的请求是https协议的,charles监听到的 文都是乱码的。我在百度上谷歌了一下。

Mac使用Charles进行HTTPS抓包

终于能在charles里看到明文的 络请求了,于是通过 络请求可以归纳出帖子分页加载的规律。这样酸奶爸爸就可以自己编写程序,循环调用API请求抓取数据了。此处又遇到拦路虎(我为什么要加个“又”字)。API的请求做了参数签名校验,每次从charles抓到的请求,时效只有5分钟。

如果抓取程序能够尽可能的模仿用户行为,那么我们会突破所有服务端的屏障。

使用appium的在帖子详情页每3秒模拟用户上划一次,使用charles监听虚拟机的 络请求。这样charles会源源不断的捕捉到帖子分页的API请求。此处又又遇到拦路虎(我不喜欢“拦”,但我喜欢“路虎”)。此时小姐姐们的照片还是在charles里,而且还都是url字符串。

HAR 格式规范

到这里总算是拨开云雾见青天,har文件记录是每次API请求的全过程,有url、参数、响应时间和返回值等等,而且还是标准的json格式。我们可以用新学的go语言写一个控制台程序来解析har文件,并将解析后的结果整理归类,帖子内容存入MySQL数据库,小姐姐们的图片curl下载到文件系统。

新语言的学习并不都是新知识的学习,更多的是编程习惯的迁移。

酸奶爸爸本来是做PHP开发的,现在用GO语言写这个,本次迁移的技能如下:

  • 日志记录
  • MySQL数据库读写
  • 断点调试
  • json解析
  • 配置文件的解析
  • curl下载文件
  • 所以新语言的学习,第一步只要掌握语法,后续其实就是探索新语言所引入的新特性而已,以go语言为例,它对高并发有独到的设计。至于我们在旧语言所掌握的一些通用技能,一并迁移过来就好。go语言如何连接redis、RabbitMQ,这等通用的功能无非就是用go语言的方式引用一下包而已。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2020年6月17日
    下一篇 2020年6月17日

    相关推荐