閱讀文本大概需要 12 分鐘。 一 爬蟲萬能公式 最近癡海接到一些新的需求,要抓取微信小程序上的內(nèi)容。寫過爬蟲的同學(xué)都知道,無論什么爬蟲大體的思路都是相的,都是要分析網(wǎng)絡(luò)請(qǐng)求地址,模擬發(fā)送請(qǐng)求,然后解析返回的數(shù)據(jù),最后保存相應(yīng)的信息。 這里就可以給大家總結(jié)一個(gè)爬蟲萬能公式: 爬蟲程序 = 網(wǎng)絡(luò)請(qǐng)求 + 解析數(shù)據(jù) + 保存數(shù)據(jù) 所有的爬蟲都離不開這三個(gè)核心點(diǎn),有些復(fù)雜的爬蟲無非是在每個(gè)部分添加些別的內(nèi)容。比如在網(wǎng)絡(luò)請(qǐng)求部分,你需要添加請(qǐng)求頭,偽裝下自己的請(qǐng)求,讓它看起來像一個(gè)正常人發(fā)送的請(qǐng)求。還有些網(wǎng)站需要破解驗(yàn)證碼等等。而在解析數(shù)據(jù)中你需要熟悉至少一種解析方式,比如 Xpath、正則、JQuery、BS4 等。保存數(shù)據(jù)就需要你選擇保存到哪里是 Mysql 還是 MongoDB 等等,甚至你要需要寫些去重的策略等等。 每個(gè)部分細(xì)分開還有非常多的內(nèi)容,但爬蟲萬變不離其宗,總的框架就是這三部分。細(xì)分的內(nèi)容以后在慢慢寫文章都教給大家。 今天我們就通過上面核心公式,通過如何抓取微信小程序,來講解手機(jī)平臺(tái)如何進(jìn)行抓包。 二 微信小程序抓取 現(xiàn)在隨著移動(dòng)互聯(lián)網(wǎng)的崛起,很多產(chǎn)品只有手機(jī)端,不會(huì)再花過多的時(shí)間和精力去搭建網(wǎng)頁(yè)端的平臺(tái)。所以做爬蟲也一定要懂得如何在手機(jī)端上進(jìn)行數(shù)據(jù)抓取。 手機(jī)端跟網(wǎng)頁(yè)端的抓取大同小異,只不過手機(jī)端的請(qǐng)求路徑,你是不能直觀的看到。這里就需要借助一些代理軟件來輔助分析手機(jī)端上的網(wǎng)絡(luò)請(qǐng)求。 2.1 常用代理軟件 手機(jī)上抓包原理其實(shí)很簡(jiǎn)單,就是在你手機(jī)上搭建一個(gè)代理,所有的請(qǐng)求都會(huì)走你搭建的代理,這樣你就可以分析對(duì)應(yīng)的請(qǐng)求。 而最經(jīng)常用的代理軟件有兩個(gè):1 Charles、2 Fiddler。 1 Charles 官網(wǎng): https://www./ 適用平臺(tái):Windows、Mac Charles 俗稱的花瓶,是在 PC 端常用的網(wǎng)絡(luò)封包截取工具,在做移動(dòng)開發(fā)時(shí),我們?yōu)榱苏{(diào)試與服務(wù)器端的網(wǎng)絡(luò)通訊協(xié)議,常常需要截取網(wǎng)絡(luò)封包來分析。 具體的使用教程可以看下面的鏈接,非常的詳細(xì)的介紹了 Charles 各方面的功能。 https:///post/5b8350b96fb9a019d9246c4c 2 Fiddler 官網(wǎng): https://www./fiddler 適用平臺(tái):Windows Fiddler 是一個(gè) http 調(diào)試代理,以代理服務(wù)器的方式,監(jiān)聽系統(tǒng)的 Http 網(wǎng)絡(luò)數(shù)據(jù)流動(dòng), Fiddler 也可以讓你檢查所有的 http 通訊,設(shè)置斷點(diǎn),以及 Fiddle 所有的“進(jìn)出”的數(shù)據(jù)。 這兩款軟件我都有使用過,都大同小異。我個(gè)人推薦大家使用 Charles,一是它兩個(gè)平臺(tái)都可適用,二是它把請(qǐng)求結(jié)構(gòu)化,看起來非常清晰。 具體的使用教程可以看下面的鏈接 http://www./blog/cache/detail_1697.html 這里要提醒大家 2 個(gè)比較坑的點(diǎn): 1 確保你的手機(jī)是否和電腦處于同一個(gè)局域網(wǎng) 2 確保你安裝了相應(yīng)的證書 具體的設(shè)置方法在上面的鏈接都有講到,如果你安裝了相應(yīng)的軟件之后無法抓包,就在這兩個(gè)地方檢查下是否設(shè)置正確。 手機(jī)端為分為 ios 和安卓端的,由于我手上沒有 ios 手機(jī),今天這篇文章也就不重點(diǎn)介紹,如果你想在 ios 手機(jī)上抓包推薦使用 Thor 這款軟件。 2.2 安卓 7.0 以上新特性 Android 7.0 之后,系統(tǒng)默認(rèn)不再信任用戶自己安裝的證書。也就是說如果你現(xiàn)在使用的安卓版本是 7.0 以上的,你自己安裝的證書,系統(tǒng)默認(rèn)不再信任的。 而手機(jī)上的網(wǎng)絡(luò)請(qǐng)求都是 https 加密過的,沒有信任的證書,你就無非抓到包。 而要解決這個(gè)問題有以下五種辦法。 1 降低你的安卓版本 首先第一種辦法就是降低你的安卓版本到 7.0 以下,那就不會(huì)用到新的特性。但這樣的做法并不推薦。 2 使用 HttpCanary 軟件 HttpCanary 是 Android 平臺(tái)下功能最強(qiáng)大的抓包和注入工具,支持 HTTP、HTTPS、HTTP2 和 WebSocket 等多種協(xié)議。 GitHub 地址: https://github.com/MegatronKing/HttpCanary 下載地址: https://github.com/MegatronKing/HttpCanary/wiki/Downloads 使用教程: https://github.com/MegatronKing/HttpCanary/tree/master/docs/v1/zh-CN 這個(gè)軟件在使用教程里,提供了安卓 7.0 之后的抓包解決方案。 3 Xposed + JustTrustMe Xposed 框架(Xposed framework)是一套開放源代碼的、在 Android 高權(quán)限模式下運(yùn)行的框架服務(wù),可以在不修改 APK 文件的情況下修改程序的運(yùn)行(修改系統(tǒng)),基于它可以制作出許多功能強(qiáng)大的模塊,且在功能不沖突的情況下同時(shí)運(yùn)作。 JustTrustMe 是 Github 上的一個(gè)開源工程,他是一個(gè) Xposed 模塊,用來禁止SS L證書驗(yàn)證。以下是其簡(jiǎn)介。 JustTrustMe:An xposed module that disables SSL certificate checking. This is useful for auditing an appplication which does certificate pinning. 具體的教程可以看這里 https://www.jianshu.com/p/310d930dd62f Xposed 框架對(duì) Android 7.0 及以上不太友好,容易導(dǎo)致變磚頭機(jī),所以使用此方法的建議配合模擬器使用。 4 VirtualXposed 上面介紹了 Xposed 框架,最麻煩在于必須 Root 設(shè)備,承擔(dān)手機(jī)變磚和系統(tǒng)安全性方面的風(fēng)險(xiǎn),對(duì)很多用戶來說上手難度門檻較高。不過,隨著黑科技般的 VirtualXposed 出現(xiàn),大家終于可以免 Root 權(quán)限直接使用 Xposed 框架了。 具體的使用可以看這篇文章: https://www./virtualxposed.html 安裝來 VirtualXposed 之后,相當(dāng)于給手機(jī)安裝了一個(gè)虛擬環(huán)境,你在這個(gè)虛擬環(huán)境中安裝需要抓取的 APP,之后配合 Charles 就可以進(jìn)行抓包分析了。
前面說過安卓 7.0 之后第三方安裝的證書,系統(tǒng)是不會(huì)給予信任的。那么我們反過來想,只要把第三方證書設(shè)置成系統(tǒng)證書就好。 需要注意這個(gè)方法也需要 root 權(quán)限,但屬于一勞永逸的做法。 把普通證書安裝到系統(tǒng)證書的方法可以看下面的鏈接 https://github.com/XndroidDev/Xndroid/issues/9#issuecomment-350525543 三 實(shí)戰(zhàn)練習(xí) 上面一共介紹了五種在安卓 7.0 之后抓取方式,每種方法都有自己的優(yōu)缺點(diǎn)。大家盡量以易用的原則去選取,接下來我就使用 HttpCanary 這款軟件來給大家實(shí)戰(zhàn)抓取一個(gè)小程序。 抓取目標(biāo):MOTI商城一款產(chǎn)品詳細(xì)信息 小程序搜索「MOTI商城」即可找到。 接下來我們就用開頭說到的爬蟲核心公式來一步步的拆解: 爬蟲程序 = 網(wǎng)絡(luò)請(qǐng)求 + 解析數(shù)據(jù) + 保存數(shù)據(jù) 1 分析小程序網(wǎng)絡(luò)請(qǐng)求 首先根據(jù)上面的 HttpCanary 教程安裝相應(yīng)的軟件,然后我們開始進(jìn)行抓包分析。 這是我們點(diǎn)擊進(jìn)入小程序首頁(yè)看到的一些請(qǐng)求,我們?cè)邳c(diǎn)擊小程序里任意一個(gè)商品,在看看都有哪些新的請(qǐng)求。 注意到這里多了一個(gè) detail 的請(qǐng)求,我們點(diǎn)開詳情具體查看。 總攬頁(yè)信息 通過總攬頁(yè)我們知道了數(shù)據(jù)的請(qǐng)求地址: https://motiapi./api/goods/detail 這個(gè)請(qǐng)求還是一個(gè) POST 的請(qǐng)求。 請(qǐng)求頁(yè)信息 通過請(qǐng)求頁(yè)信息我們知道了請(qǐng)求頭的構(gòu)造都有哪些: 并且還知道請(qǐng)求的參數(shù),我們?cè)谡?qǐng)求頁(yè)點(diǎn)擊底部的 Text 就可以看到。 所以我們?cè)诎l(fā)送請(qǐng)求的時(shí)候,還需要把 token、for_wx_examine 和 goods_id 這三個(gè)參數(shù)一起帶上。 響應(yīng)頁(yè)信息 通過響應(yīng)頁(yè)信息我們知道,請(qǐng)求返回的數(shù)據(jù)是 json 格式。 這樣我們整個(gè)請(qǐng)求就分析完畢了,整個(gè)抓取就非常的清晰了。通過分析我們可以知道要發(fā)送一個(gè) POST 的請(qǐng)求,請(qǐng)求的地址是 https://motiapi./api/goods/detail 這個(gè) POST 的請(qǐng)求是需要帶上三個(gè)參數(shù)的即:token 、for_wx_examine 和 goods_id 在程序中我們只需要把請(qǐng)求頭信息帶上,發(fā)送一個(gè) POST 的請(qǐng)求就可以拿到數(shù)據(jù)了。 2 解析小程序數(shù)據(jù) 此次的小程序數(shù)據(jù)是 json 格式的,所以我們?cè)诘谝徊桨l(fā)送了請(qǐng)求之后,只需要調(diào)用 response.json() 函數(shù)就可以得到具體的數(shù)據(jù)了。 3 保存小程序數(shù)據(jù) 數(shù)據(jù)比較簡(jiǎn)單,結(jié)構(gòu)也非常清晰,所以我就以 json 的格式保存到本地文件中即可。 關(guān)鍵的代碼(這里面的 token 有可能會(huì)失效,還是以你們自己抓到的為主): def get_sale(goods_id): 到此整個(gè)教程就結(jié)束了,覺得教程不錯(cuò)的同學(xué)不妨點(diǎn)個(gè)在看,就是給癡海最大的支持。 人必有癡,而后有成 點(diǎn)擊無 bug ?? |
|