爬虫爬取某数字app的房屋信息

爬虫爬取某数字app的房屋信息

声明:本文只是用来学习交流,并不是用来使用爬虫恶意爬去别人劳动成果,本文只是用来作为研究分享爬虫的思路,加强开发人员在日常开发工作中的安全意识。

缘起

从广州回来的时候,第一件要解决的事情就是租房。由于房屋信息比较分散,并且租房的需求是找到某个关键地点一两公里附近的房屋信息,由于58,赶集,豆瓣的信息提供的太分散,并且有新的房屋信息不能及时通知人。所以想抓取各大网站租房信息,就必须使用爬虫爬去信息。

信息的两种来源方式

  • web网页分析页面结构使用正则进行匹配
  • app的接口

两种方式的比较,web端需要分析网页的html结构使用正则获得需要的数据,由于web端会经常进行调整所以相比而言爬去数据比较麻烦。接口api一般很少做调整并且获得数据可以直接使用。所以在准备爬数据是优先爬去接口。

作为后端程序员开放接口这活就是日常,在开发接口中肯定会对接口进行签名,那么抓取接口的难点就是如何获得签名的key及签名方式。

web端抓取数据步骤:

  1. 获得网页地址
  2. 分析网页结构
  3. 分析网页之间的跳转关系
  4. 使用抓包工具抓包
  5. 爬取数据
  6. 突破反爬限制

app接口爬去数据步骤:

  1. 使用抓包工具
  2. 手机使用代理,app所有请求通过抓包工具
  3. 获得接口,分析接口
  4. 反编译apk获取key
  5. 突破反爬限制

    反爬的手段很多,例如对于在一定时间内频繁访问的IP进行封接口(会误杀),并且这个很好绕过使用代理IP池就可以避免这个。

    对访问的终端的限制,如果必须是浏览器可以使用代码或者第三方库进行伪装。
    等等。。。 爬虫对于网站来说有利有弊,利:可以增加流量,弊端:如果爬虫过于猛烈会增加网站的负担甚至影响网站的正常的访问。这个就属于其他方面的探讨。这里我们只讲技术,对与后端开发同学,研究爬虫可以增强在日常开发中的安全意识及反爬虫意识。就像小时候学校经常带我们进行一些教育,只有实际感受了才会有深刻的感悟和教育作用。

抓包工具charles

使用charles进行简单的配置及证书下载,我们可以抓到https的请求。

通过官网下载chaeles 下载
官网下载的如果没有付费使用几十分钟就会自定退出,这里提供一个破解版 链接. 密码: wsvq

这里需要说明,如果是专业玩爬虫的建议购买正版,支持厂商,如果只是简单的了解一下,可以使用破解版玩玩。

charles的使用配置教程,这里不再啰嗦。

如果打开charles,看到如下界面说明抓包成功,如果没有,使用浏览器进任意网站,看是是否有如果没有请参考上文配置。

chaeles打开界面

如果还不行, 打开 系统偏好设置 -> 网络 -> 高级 ->代理 设置为http,https代理,不要勾选自动代理配置,由于我使用了vpn,两个代理会有冲突。

网络代理

配置手机wifi代理

保持手机和电脑处于同一个wifi下,在wifi连接设置点击进入当前和电脑处于同一wifi的名称,进入高级设置,打开手动http代理 进行相关设置,
手机wifi代理配置

  • 代理服务器主机名 电脑的局域网ip
  • 代理服务器端口 charles -> proxy -> proxy settings -> http proxy port
  • 手机安装https证书(通过charles的提示进行安装)

抓包获得接口

我们需要获取两个接口

  1. 房屋信息列表
  2. 房屋信息详情

房屋信息列表

打开某数字app进入租房列表,此时我们查看charles,可以看到如下接口,表示房屋信息列表接口。

https://apphouse.**.com/api/list/zufang?tabkey=allcity&action=getListInfo&curVer=8.0.6&appId=1&localname=haikou&os=android&format=json&v=1&geotype=baidu&location=2053%2C2168%2C10598&filterParams=%7B%7D&sidDict=%7B%22PGTID%22%3A%22187195141198731479180128291%22%2C%22GTID%22%3A%22135437582198731479180540157%22%7D&geoia=20.003844%2C110.369652&page=2

这两个参数是我们需要改变的。
- localname:城市名称
- page:页码数

数字app房屋信息接口

房屋信息详情

/api/detail/zufang/32722366350641?v=1&platform=android&signature=14ca8440b15afaf0de29aa71c0bce0f7&version=8.0.2&commondata=%7B%22hasNext%22%3Atrue%2C%22nextObserverIndex%22%3A0%2C%22tracekey%22%3A%22aac6e06cd4aab542bcf7fb7d83a89103%22%7D&sidDict=%7B%22PGTID%22%3A%22166258898198663045246945925%22%2C%22GTID%22%3A%22117631756198663045234361760%22%7D&localname=haikou&format=json

其中signature是接口签名验证,如果不能拿到它的计算方式,我们拿到了接口也没有什么用。

反编译apk拿到签名验证

作为后端开发,接口签名是不可避免,服务器端的验证很难破解,因为没有办法拿到代码,但是客户端在我们手机端安装了,我们抓取接口就是想模拟象客户端一样来请求接口,既然客户端需要访问接口,那么客户端肯定有一个统一的方法来做接口验证,那么我们现在的思路就是反编译找到接口签名验证的方法。

整个获取签名验证的思路

  • 解压apk
  • 使用dex2jar反编译解压文件中的dex文件得到源码
  • jd-gui查看java源码
  • 从源码中搜索signature
  • 找到签名的key,及签名算法

解压apk

使用unzip解压apk后,我们看到有有5个dex文件:classes5.dex,classes4.dex,classes3.dex,classes2.dex,classes.dex.

解压apk

使用dex2jar反编译dex

下载dex2jar,下载好之后在终端进入dex2jar文件夹,可以看得见有sh和bat文件,分别对应mac和windows。

运行 d2j-dex2jar classesX.dex ,运行后会发现dex2jar目录多了几个classesX-dex2jar.jar。

反编译dex

(注:如果无法执行,是因为当前用户的权限不够使用chomd 777详见《服务器基础运维指南》)

使用jd-gui查看java源码

下载jd-gui,直接双击运行,使用jd-gui打开5个jar包,在jar包中搜索signature,一路查询可以好到签名验证。

打开其中一个jar包,通过全文搜索,我们找了接口签名的统一出口,可以清晰的看见signature的值。(这里隐去)。我们可以看到有一个md5的加密方法,通过打开其他jar,找到了具体的md5签名方法。之后我们就可以模拟生成签名验证(理论来说不是模拟,我们访问就是客户端访问,因为站在服务端我们的访问和客户端的访问没有什么区别)。

signature

到这为止我们就简单的获取到了某数字apk的房屋信息。

参考:
https://www.cnblogs.com/cuiyubo/p/6721397.html
https://www.jianshu.com/p/fdd7c681929c
https://www.127cloud.com/archives/197.html

猜你喜欢

转载自blog.csdn.net/u013565163/article/details/79091298