蜘蛛,又叫爬蟲,是專門用來批量的爬去網(wǎng)上數(shù)據(jù)的腳本程序。 其實(shí)對(duì)于一個(gè)爬蟲程序,爬取數(shù)據(jù)方面并沒有很大難度,最大的難度在于如何突破驗(yàn)證和反爬蟲!對(duì)于突破反爬蟲的方法,這里就不討論了,今天主要討論的是解決驗(yàn)證的問題! 對(duì)于很多網(wǎng)站里面的有用數(shù)據(jù),都會(huì)要求客戶登陸后方能查看(甚至要求VIP),這時(shí)候我們要想獲取數(shù)據(jù)就需要按照規(guī)則登陸后才能抓取了,而對(duì)于模擬登陸,網(wǎng)上的教程也有很多,這里簡(jiǎn)單的介紹一下就行了: 前提:你得有一個(gè)賬號(hào)! 做法: 目前大部分的做法是運(yùn)用requests這個(gè)第三方庫實(shí)現(xiàn)登陸,requests庫里面提供了session這個(gè)方法,你只需要通過抓包工具將檢驗(yàn)登陸真實(shí)地址分析出來,然后構(gòu)造登陸信息的表單(一定要構(gòu)造完整的登陸信息),最后POST即可。有很大部分可能會(huì)遇到驗(yàn)證碼,這個(gè)可以采用PIL庫解析驗(yàn)證碼,也可以下載驗(yàn)證碼后手動(dòng)填寫。 當(dāng)然更簡(jiǎn)單粗暴的方法是直接抓取登陸后的cookies添加進(jìn)headers里面再進(jìn)行抓取,不過cookies會(huì)很快失效! 而對(duì)于一些網(wǎng)站,由于數(shù)據(jù)的重要性,會(huì)在請(qǐng)求時(shí)進(jìn)行設(shè)立鑰匙來進(jìn)行驗(yàn)證,從而保證數(shù)據(jù)的完整性和安全性! 典型的就是簽名認(rèn)證! 這種驗(yàn)證具可以限制爬蟲批量的抓取數(shù)據(jù),因?yàn)樗挠行r(shí)間很短,而且這個(gè)鑰匙是第一無二的,例如用md5、RSA、ElGamal、Fiat-Shamir、Guillou- Quisquarter、Schnorr、Ong-Schnorr-Shamir數(shù)字簽名算法、Des/DSA,橢圓曲線數(shù)字簽名算法和有限自動(dòng)機(jī)數(shù)字簽名算法等加密算法得出來的字符串,往往是無法被破解的(當(dāng)然利用大數(shù)據(jù)進(jìn)行匹配另算),而且這種驗(yàn)證往往用于關(guān)鍵之處(例如列表頁,沒辦法抓取列表就沒辦法批量抓取數(shù)據(jù))。 解決這種驗(yàn)證的方法就是解析他的加密算法,然后根據(jù)得到的算法構(gòu)造鑰匙: 1.對(duì)于網(wǎng)頁類的抓取,可以分析js代碼 2.對(duì)于APP的抓取,就需要用到反編譯了 第一種情況需要對(duì)js代碼熟悉甚至精通才行,而第二種情況,只能針對(duì)安卓APP,而IOS目前好像還無法反編譯。第一種情況除了分析算法外其他的并不難,這里主要將第二種。 對(duì)于安卓的反編譯,你需要下載APP的apk文件,Apk文件本質(zhì)上其實(shí)是一個(gè)zip包。直接拿解壓工具解壓就可以看到其中包含了什么。下面簡(jiǎn)單介紹一下Apk文件的結(jié)構(gòu)。 AndroidManifest.xml:應(yīng)用的全局配置文件 assets文件夾:原始資源文件夾,對(duì)應(yīng)著Android工程的assets文件夾,一般用于存放原始的網(wǎng)頁、音頻等等,與res文件夾的區(qū)別這里不再贅述,可以參考上面介紹的兩篇文章。 classes.dex:源代碼編譯成class后,轉(zhuǎn)成jar,再壓縮成dex文件,dex是可以直接在Android虛擬機(jī)上運(yùn)行的文件。 lib文件夾:引用的第三方sdk的so文件。 META-INF文件夾:Apk簽名文件。 res文件夾:資源文件,包括了布局、圖片等等。 resources.arsc:記錄資源文件和資源id的映射關(guān)系。 上面的截圖中每個(gè)文件都是一個(gè)最基本的Apk 文件應(yīng)該包含在內(nèi)的。 但是直接把Apk當(dāng)做zip解壓后的這些文件是沒法直接閱讀的,畢竟他們都是經(jīng)過了build-tools打包工具處理過的。 我們直接用文本編輯器打開這里面的Manifest文件看看。 反編譯Apk的目的就是Apk拆成我們可以閱讀的文件。 通過反編譯,我們一般想要得到里面的AndroidManifest.xml文件、res文件和java代碼。 Apk反編譯步驟 (1) ApkTo ol拆包,得到AndroidManifest和res等資源文件 工具下載地址:https:///iBotPeaches/apktool/downloads 功能:拆解Apk文件,反編譯其中的資源文件,將它們反編譯為可閱讀的AndroidManifest.xml文件和res文件。 前面講過,直接把Apk文件當(dāng)做zip解壓,得到的xml資源文件,都是無法直接用文本編輯器打開閱讀的,因?yàn)樗鼈冊(cè)诖虬鼤r(shí)經(jīng)過了build-tools的處理。 用法:https://ibotpeaches./Apktool/documentation/有介紹,最新版本是2.2.0,運(yùn)行環(huán)境需要jre1.7。 這里,我演示一下用apktool來拆解Apk文件的基本方法,只需要在終端里面執(zhí)行下面的命令。 下面我們看一下java -jar apktool.jar d yourApkFile.apk拆解后的結(jié)果: 我們已經(jīng)得到一個(gè)可以用文本編輯器打開的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。 original文件夾是原始的AndroidManifest.xml文件,res文件夾是反編譯出來的所有資源,smali文件夾是反編譯出來的代碼。 注意,smali文件夾下面,結(jié)構(gòu)和我們的源代碼的package一模一樣,只不過換成了smali語言。它有點(diǎn)類似于匯編的語法,是Android虛擬機(jī)所使用的寄存器語言。 這時(shí),我們已經(jīng)可以文本編輯器打開AndroidManifest.xml文件和res下面的layout文件了。 這樣,我們就可以查看到這個(gè)Apk文件的package包名、Activity組件、程序所需要的權(quán)限、xml布局、圖標(biāo)等等信息。其實(shí)我們把Apk上傳到應(yīng)用市場(chǎng)時(shí),應(yīng)用市場(chǎng)也會(huì)通過類似的方式解析我們的apk。 note1:其實(shí)還有一種方法,可以省去每次解包時(shí),都要輸入java -jar apktool.jar xxx這行命令,官網(wǎng)也有說明,就是將這個(gè)命令包裝成shell腳本,方法見:https://ibotpeaches./Apktool/install/ note2:如果你在編譯的時(shí)候,發(fā)現(xiàn)終端里面提示發(fā)生了brut.android.UndefinedResObject錯(cuò)誤,說明你的apktool.jar版本太低了,需要去下載新版工具了。 note3:如果想要自己實(shí)現(xiàn)一個(gè)解析Apk文件,提取版本、權(quán)限信息的java服務(wù)時(shí),可以引用apktool.jar中的ApkDecoder,調(diào)用decode方法來實(shí)現(xiàn)??梢钥聪聢D中,apktool.jar里面有解析Apk文件的實(shí)現(xiàn)。 (2) dex2jar反編譯dex文件,得到j(luò)ava源代碼 上一步中,我們得到了反編譯后的資源文件,這一步我們還想看java源代碼。這里要用的工具就是dex2jar。 工具下載地址:https:///projects/dex2jar/ 功能:將dex格式的文件,轉(zhuǎn)換成jar文件。dex文件時(shí)Android虛擬機(jī)上面可以執(zhí)行的文件,jar文件大家都是知道,其實(shí)就是java的class文件。在官網(wǎng)有詳細(xì)介紹。 用法:打開下載的dex2jar-2.0文件夾,里面有shell和bat腳本,進(jìn)入終端,就可以在命令行使用了。 運(yùn)行后,可以看到classes.dex已經(jīng)變成了classes-dex2jar.jar。 note1:第一次下載下來后,在mac里運(yùn)行的時(shí)候可能會(huì)提示需要管理員的權(quán)限,這里我給這些sh腳本chmod 777后,即可運(yùn)行它。 note2:寫完這一節(jié)的時(shí)候,我發(fā)現(xiàn)把dex轉(zhuǎn)換成jar已經(jīng)有了更好的工具enjarify,https://github.com/google/enjarify這個(gè)工具是谷歌官方開源的用于反編譯dex文件的。 使用方法和dex2jar差不多,也是簡(jiǎn)單的命令行操作。 這個(gè)工具的主頁中也提到dex2jar已經(jīng)是一個(gè)比較老的工具,在遇到混淆等等復(fù)雜的情況時(shí),可能無法正常工作。所以這里推薦大家使用enjarify這個(gè)工具。 (3) jd-gui查看java源代碼 工具下載地址:官網(wǎng)http://jd./上選擇自己所需要的版本。 功能:這個(gè)工具不用多說,寫java的人都知道。 有時(shí)候我們自己開發(fā)一個(gè)jar包給別人用,也會(huì)用它來查看class是不是都被正確的打入到了jar內(nèi),我以前介紹的gradle自定義打包jar的博客中也提到過它。 用法:下載后雙擊既可以運(yùn)行這個(gè)工具,直接把上一步得到的classes-dex2jar.jar拖到j(luò)d-gui程序的界面上即可打開了,效果如下圖所示。 到了這一步,就可以隨心所欲的查看APP的源代碼了,而你要得算法就在里面! 當(dāng)然還有一種更好的方法,那就是直接在線一鍵編譯(現(xiàn)在的輪子太多了),簡(jiǎn)直不要太爽! End. 作者:jay 來源:公眾號(hào)Python中文社區(qū) |
|