日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

怎么樣抓取微信小程序

 鷹兔牛熊眼 2019-05-05

閱讀文本大概需要 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ī),所以使用此方法的建議配合模擬器使用。

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)行抓包分析了。


5  把 Charles 證書設(shè)置為系統(tǒng)證書

前面說過安卓 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ù)了。

解析小程序數(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):
    headers_v2 = {
        'charset''utf-8',
        'Accept-Encoding''gzip',
        'referer''ttps://servicewechat.com/wx79a7f4da1fc3bdd6/39/page-frame.html',
        'content-type''application/x-www-form-urlencoded',
        'User-Agent''Mozilla/5.0 (Linux; Android 8.0.0; MIX 2 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 MicroMessenger/7.0.4.1420(0x27000439) Process/appbrand2 NetType/WIFI Language/zh_CN',
        'Content-Length''65',
        'Host''motiapi.',
        'Connection''Keep-Alive'
    }

    url_v2 = 'https://motiapi./api/goods/detail'
    params_v2 = {
        'token''e5f5c910d74190f5672805f3eadc8a',
        'for_wx_examine'0,
        'goods_id'93
    }
    response = requests.post(url_v2, data=params_v2, headers=headers_v2)

    with open('moti_{}.json'.format(time.strftime('%Y-%m-%d')), 'a'as f:
        f.write(json.dumps(response.json(), ensure_ascii=False, indent=2) + '\n')
    data = response.json()
    data['name'] = 'moti'
    col.insert_one(data)
    print(response.json())

到此整個(gè)教程就結(jié)束了,覺得教程不錯(cuò)的同學(xué)不妨點(diǎn)個(gè)在看,就是給癡海最大的支持。

人必有癡,而后有成

點(diǎn)擊無 bug ??

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多