专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
51好读  ›  专栏  ›  Python中文社区

破解验证,让爬取更随心所欲!

Python中文社区  · 公众号  · Python  · 2016-12-17 18:23

正文

请到「今天看啥」查看全文


專 欄

Jay 现居重庆,熟悉爬虫、web开发、网络安全,主要从事爬虫领域的相关开发。

Github :https://github.com/juie

蜘蛛,又叫爬虫,是专门用来批量的爬去网上数据的脚本程序。其实对于一个爬虫程序,爬取数据方面并没有很大难度,最大的难度在于如何突破验证和反爬虫!对于突破反爬虫的方法,这里就不讨论了,今天主要讨论的是解决验证的问题!
对于很多网站里面的有用数据,都会要求客户登陆后方能查看(甚至要求VIP),这时候我们要想获取数据就需要按照规则登陆后才能抓取了,而对于模拟登陆,网上的教程也有很多,这里简单的介绍一下就行了:

前提 :你得有一个账号!

做法

目前大部分的做法是运用requests这个第三方库实现登陆,requests库里面提供了session这个方法,你只需要通过抓包工具将检验登陆真实地址分析出来,然后构造登陆信息的表单(一定要构造完整的登陆信息),最后POST即可。有很大部分可能会遇到验证码,这个可以采用PIL库解析验证码,也可以下载验证码后手动填写。当然更简单粗暴的方法是直接抓取登陆后的cookies添加进headers里面再进行抓取,不过cookies会很快失效!

而对于一些网站,由于数据的重要性,会在请求时进行设立钥匙来进行验证,从而保证数据的完整性和安全性!典型的就是签名认证!这种验证具可以限制爬虫批量的抓取数据,因为它的有效时间很短,而且这个钥匙是第一无二的,例如用md5、RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir数字签名算法、Des/DSA,椭圆曲线数字签名算法和有限自动机数字签名算法等加密算法得出来的字符串,往往是无法被破解的(当然利用大数据进行匹配另算),而且这种验证往往用于关键之处(例如列表页,没办法抓取列表就没办法批量抓取数据)。解决这种验证的方法就是解析他的加密算法,然后根据得到的算法构造钥匙:

1 .对于网页类的抓取,可以分析js代码
2 .对于APP的抓取,就需要用到反编译了

第一种情况需要对js代码熟悉甚至精通才行,而第二种情况,只能针对安卓APP,而IOS目前好像还无法反编译。第一种情况除了分析算法外其他的并不难,这里主要将第二种。

对于安卓的反编译,你需要下载APP的apk文件,Apk文件本质上其实是一个zip包。直接拿解压工具解压就可以看到其中包含了什么。下面简单介绍一下Apk文件的结构。

• AndroidManifest.xml:应用的全局配置文件
• assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的网页、音频等等,与res文件夹的区别这里不再赘述,可以参考上面介绍的两篇文章。
• classes.dex:源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。
• lib文件夹:引用的第三方sdk的so文件。
• META-INF文件夹:Apk签名文件。
• res文件夹:资源文件,包括了布局、图片等等。
• resources.arsc:记录资源文件和资源id的映射关系。

上面的截图中每个文件都是一个最基本的Apk 文件应该包含在内的。但是直接把Apk当做zip解压后的这些文件是没法直接阅读的,毕竟他们都是经过了build-tools打包工具处理过的。我们直接用文本编辑器打开这里面的Manifest文件看看。


反编译Apk的目的就是Apk拆成我们可以阅读的文件。通过反编译,我们一般想要得到里面的AndroidManifest.xml文件、res文件和java代码。

Apk反编译步骤

(1) ApkTool拆包,得到AndroidManifest和res等资源文件
工具下载地址
https://bitbucket.org/iBotPeaches/apktool/downloads

功能 :拆解Apk文件,反编译其中的资源文件,将它们反编译为可阅读的AndroidManifest.xml文件和res文件。前面讲过,直接把Apk文件当做zip解压,得到的xml资源文件,都是无法直接用文本编辑器打开阅读的,因为它们在打包时经过了build-tools的处理。

用法 https://ibotpeaches.github.io/Apktool/documentation/ 有介绍,最新版本是2.2.0,运行环境需要jre1.7。

这里,我演示一下用apktool来拆解Apk文件的基本方法,只需要在终端里面执行下面的命令。

  1. java -jar apktool.jar d yourApkFile.apk

  2. // 注意`apktool.jar`是刚才下载后的jar的名称,`d`参数表示decode

  3. // 在这个命令后面还可以添加像`-o -s`之类的参数,例如

  4. // java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s

  5. // 几个主要的参数设置方法及其含义:

  6. -f 如果目标文件夹已存在,强制删除现有文件夹

  7. -o 指定反编译的目标文件夹的名称(默认会将文件输出到以Apk文件名命名的文件夹中)

  8. -s 保留classes.dex文件(默认会将dex文件解码成smali文件)

  9. -r 保留resources.arsc文件(默认会将resources.arsc解码成具体的资源文件)

下面我们看一下java -jar apktool.jar d yourApkFile.apk拆解后的结果:


我们已经得到一个可以用文本编辑器打开的阅读的AndroidManifest.xml文件、assets文件夹、res文件夹、smali文件夹等等。original文件夹是原始的AndroidManifest.xml文件,res文件夹是反编译出来的所有资源,smali文件夹是反编译出来的代码。注意,smali文件夹下面,结构和我们的源代码的package一模一样,只不过换成了smali语言。它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。
这时,我们已经可以文本编辑器打开AndroidManifest.xml文件和res下面的layout文件了。这样,我们就可以查看到这个Apk文件的package包名、Activity组件、程序所需要的权限、xml布局、图标等等信息。其实我们把Apk上传到应用市场时,应用市场也会通过类似的方式解析我们的apk。

note1 :其实还有一种方法,可以省去每次解包时,都要输入java -jar apktool.jar xxx这行命令,官网也有说明,就是将这个命令包装成shell脚本,方法见: https://ibotpeaches.github.io/Apktool/install/
note2 :如果你在编译的时候,发现终端里面提示发生了brut.android.UndefinedResObject错误,说明你的apktool.jar版本太低了,需要去下载新版工具了。
note3 :如果想要自己实现一个解析Apk文件,提取版本、权限信息的java服务时,可以引用apktool.jar中的ApkDecoder,调用decode方法来实现。可以看下图中,apktool.jar里面有解析Apk文件的实现。


(2) dex2jar反编译dex文件,得到java源代码
上一步中,我们得到了反编译后的资源文件,这一步我们还想看java源代码。这里要用的工具就是dex2jar。

工具下载地址 https://sourceforge.net/projects/dex2jar/

功能 :将dex格式的文件,转换成jar文件。dex文件时Android虚拟机上面可以执行的文件,jar文件大家都是知道,其实就是java的class文件。在官网有详细介绍。
用法 :打开下载的dex2jar-2.0文件夹,里面有shell和bat脚本,进入终端,就可以在命令行使用了。

  1. d2j-dex2jar classes.dex

  2. // 获取classes.dex文件在最前面说过,只要把Apk当做zip解压出来,里面就有dex文件了

  3. // 或者用apktool反编译时带上 `-s` 参数

运行后,可以看到classes.dex已经变成了classes-dex2jar.jar。


note1 :第一次下载下来后,在mac里运行的时候可能会提示需要管理员的权限,这里我给这些sh脚本chmod 777后,即可运行它。


note2 :写完这一节的时候,我发现把dex转换成jar已经有了更好的工具enjarify,
https://github.com/google/enjarify 这个工具是谷歌官方开源的用于反编译dex文件的。使用方法和dex2jar差不多,也是简单的命令行操作。这个工具的主页中也提到dex2jar已经是一个比较老的工具,在遇到混淆等等复杂的情况时,可能无法正常工作。所以这里推荐大家使用enjarify这个工具。

(3) jd-gui查看java源代码
工具下载地址 :官网
http://jd.benow.ca/ 上选择自己所需要的版本。
功能:这个工具不用多说,写java的人都知道。有时候我们自己开发一个jar包给别人用,也会用它来查看class是不是都被正确的打入到了jar内,我以前介绍的gradle自定义打包jar的博客中也提到过它。

用法 :下载后双击既可以运行这个工具,直接把上一步得到的classes-dex2jar.jar拖到jd-gui程序的界面上即可打开了,效果如下图所示。


到了这一步,就可以随心所欲的查看APP的源代码了,而你要得算法就在里面!当然还有一种更好的方法,那就是直接在线一键编译(现在的轮子太多了),简直不要太爽!

ARTICLES
近期热门文章

生成器

关于生成器的那些事儿

爬虫代理

如何构建爬虫代理服务

地理编码

怎样用Python实现地理编码

nginx日志

使用Python分析nginx日志


淘宝女郎

一个批量抓取淘女郎写真图片的爬虫

IP代理池

突破反爬虫的利器——开源IP代理池

布隆去重

基于Redis的Bloomfilter去重(附代码)

内建函数

Python中内建函数的用法

QQ空间爬虫

QQ空间爬虫最新分享,一天 400 万条数据

对象

Python教你找到最心仪对象

线性回归

Python机器学习算法入门之梯度下降法实现线性回归

匿名代理池

进击的爬虫:用Python搭建匿名代理池

发射导弹

Python发射导弹的正确姿势

在公众号底部回复上述关键词可直接打开相应文章



Python 开 发 者 的 精 神 家 园

§ §

Python中文社区
www.python-cn.com

致力于成为

国内最好的Python社区


QQ群:152745094

专栏作者申请邮箱

[email protected]

— Life is short,we use Python —









请到「今天看啥」查看全文