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