【月更16篇】mitmproxy與安卓模擬器搭配,助力Python爬蟲工程師,然后就可以爬CSDN粉絲數(shù)據(jù)了
本篇博客為大家介紹 mitmproxy,該工具與 Charles 和 Fiddler 實(shí)現(xiàn)的功能類似,都可以輔助我們分析接口。

mitmproxy 工具安裝
mitmproxy 是一個(gè)免費(fèi)且開源的交互式 HTTPS 代理,在爬蟲領(lǐng)域一般將其用作手機(jī)模擬器,無(wú)頭瀏覽器,可以用它作為代理去攔截爬蟲獲取到的數(shù)據(jù)。
mitmproxy 可以與 fiddler 工具一樣,安裝一個(gè)客戶端進(jìn)行操作,地址如下:
官網(wǎng)地址:https://mitmproxy.org/
6.0版本-:https://mitmproxy.org/downloads/#6.0.2/
需要特殊的手段進(jìn)行訪問(wèn),國(guó)內(nèi)已經(jīng)將其地址屏蔽。
下載的最新 Windows Installer 版本即可(由于我電腦使用的是 Windows7 操作系統(tǒng),顧下載 6.0 版本),其文檔說(shuō)明也非常清楚:https://docs.mitmproxy.org/stable/
安裝完畢,會(huì)自動(dòng)運(yùn)行控制臺(tái),啟動(dòng) mitmproxy ui 。
通過(guò)瀏覽器訪問(wèn)上述地址,得到如下界面。
如果出現(xiàn)如下異常 缺少 api-ms-win-core-path-l1-1-0.dll ,打開下述鏈接下載 dll 組件即可。
https://download.csdn.net/download/hihell/38146147
接下來(lái)設(shè)置一下瀏覽器代理,是數(shù)據(jù)通過(guò)監(jiān)聽端口,按照如下步驟操作即可。
除此之外,為了捕獲 HTTPS 協(xié)議的請(qǐng)求,還需要安裝證書,在瀏覽器打開 http://mitm.it/ 下載 Windows 證書即可,下圖就是抓取成功時(shí)候的樣子。
證書也可以在目錄 C:\Users\Administrator\.mitmproxy 查找,Windows 下選擇 mitmproxy-ca-cert.p12。
關(guān)閉瀏覽器和控制臺(tái)之后,再次啟動(dòng)只需要在控制臺(tái)輸入 mitmweb 即可實(shí)現(xiàn),還有一種啟動(dòng)方式,使用 mitmdump ,實(shí)現(xiàn)效果如下所示,該形式與 mitmweb 的差異是展示載體不一致,即一個(gè)是在網(wǎng)頁(yè)端,一個(gè)是在控制臺(tái)。
mitmproxy 配合安卓模擬器
有了前文的鋪墊,在加上以前對(duì) fiddler 和 Charles 的學(xué)習(xí),mitmproxy 和模擬器連接操作就非常容易了。
配置模擬器的 Wlan 代理,指向電腦 IP,同時(shí)端口為 8080。
將證書 mitmproxy-ca-cert.cer 或者 mitmproxy-ca-cert.pem 拖拽到模擬器中,然后安裝證書(如無(wú)法雙擊安裝,通過(guò)【設(shè)置】->【安全】安裝即可),完成以上操作之后,只需要通過(guò)模擬器訪問(wèn)百度,查看是否捕捉到數(shù)據(jù)請(qǐng)求即可。
僅使用如上功能是遠(yuǎn)遠(yuǎn)不夠的,我們看中的是 mitmproxy 可以實(shí)現(xiàn)腳本二次開發(fā),所以下面在 python 環(huán)境中安裝 mitmproxy 庫(kù),實(shí)現(xiàn)其擴(kuò)展功能。
在 python 環(huán)境下配置 mitmproxy
使用 pip install mitmproxy 即可實(shí)現(xiàn)該庫(kù)的安裝,mitmproxy 要求 python 最低版本是 python3.8,所以安裝前需要確定你的 Python 版本是否滿足要求(實(shí)測(cè) Python3.7 也安裝成功了)。
安裝過(guò)程中,發(fā)現(xiàn) pyperclip 無(wú)法安裝成功,解決辦法是下載其 tar.gz 文件,解壓之后,使用 python setup.py install 進(jìn)行本地安裝。
mitmproxy 包含的模塊比較多,其中任意模塊失敗,都無(wú)法安裝成功。
Successfully installed Brotli-1.0.9 Jinja2-2.11.3 MarkupSafe-2.0.1 Werkzeug-1.0.1 asgiref-3.3.4 certifi-2021.10.8 cffi-1.15.0 click-7.1.2 0 hpack-4.0.0 hyperframe-6.0.1 itsdangerous-1.1.0 ldap3-2.8.1 mitmproxy-5.3.0 msgpack-1.0.2 passlib-1.7.4 protobuf-3.13.0 publicsuffix2-2 2.21 pydivert-2.1.0 pyparsing-2.4.7 ruamel.yaml-0.16.13 ruamel.yaml.clib-0.2.6 six-1.16.0 sortedcontainers-2.2.2 tornado-6.1 typing-exten
mitmproxy 官方提供了非常多參考案例
例子查看網(wǎng)址:https://docs.mitmproxy.org/stable/addons-examples/
你學(xué)習(xí)的第一個(gè)案例,就是修改 requests 請(qǐng)求,創(chuàng)建一個(gè)名稱為 script.py 的文件,編寫如下代碼:
import mitmproxy.http def request(flow: mitmproxy.http.HTTPFlow): flow.request.headers['User-Agent'] = 'MitmProxy' print(flow.request.headers)
在控制臺(tái)使用 mitmdump -s script.py 啟動(dòng)文件,并開啟瀏覽器代理,訪問(wèn) http://httpbin.org/get,此時(shí)就會(huì)發(fā)現(xiàn)用戶代理已經(jīng)被我們成功修改。
還可以將多個(gè)方法合并在一個(gè)類中,然后再通過(guò) addons 變量進(jìn)行綁定,例如官方提供的案例。
from mitmproxy import ctx class Counter: def __init__(self): self.num = 0 def request(self, flow): self.num = self.num + 1 ctx.log.info("We've seen %d flows" % self.num) addons = [ Counter() ]
在命令行重啟 mitmproxy,刷新瀏覽器獲取如下內(nèi)容。
這里還需要了解的就是為了實(shí)現(xiàn) mitmproxy 與 python 之間的交互,有一些固定名稱的函數(shù)需要記憶一下。
def http_connect(self, flow: mitmproxy.http.HTTPFlow):與服務(wù)器建立連接;
def requestheaders(self, flow: mitmproxy.http.HTTPFlow):客戶端的 HTTP 請(qǐng)求的頭部被成功讀取,請(qǐng)求 body 沒有讀取;
def request(self, flow: mitmproxy.http.HTTPFlow):客戶端的 HTTP 請(qǐng)求被成功完整讀取;
def responseheaders(self, flow: mitmproxy.http.HTTPFlow):服務(wù)器返回的響應(yīng)頭被讀取,響應(yīng) body 還沒有返回;
def response(self, flow: mitmproxy.http.HTTPFlow):響應(yīng)完整返回;
def error(self, flow: mitmproxy.http.HTTPFlow):異常狀態(tài)。
這里對(duì)具體細(xì)節(jié)的 API 不做過(guò)多的說(shuō)明,都可以從手冊(cè)查閱出來(lái),官方手冊(cè):https://docs.mitmproxy.org/stable/api/events.html
案例時(shí)間
本次實(shí)現(xiàn)的爬蟲案例是,訪問(wèn) CSDN 任意博主的粉絲列表,在控制臺(tái)打印出粉絲數(shù)據(jù)(隱私問(wèn)題,沒有存儲(chǔ))。
那官方博客測(cè)試,發(fā)現(xiàn)接口如下:
https://blog.csdn.net/community/home-api/v1/get-fans-list?page=4&size=20&noMore=false&blogUsername=blogdevteam
請(qǐng)求方式為 get ,請(qǐng)求地址為 https://blog.csdn.net/community/home-api/v1/get-fans-list,修改 script.py 文件代碼如下:
from mitmproxy import ctx import json def response(flow): start_url = "https://blog.csdn.net/community/home-api/v1/get-fans-list" response = flow.response if flow.request.url.startswith(start_url): text = response.text data = json.loads(text) print(data)
或者使用如下代碼,也可以實(shí)現(xiàn)相同的效果。
import json class GetFans(object): def response(self, flow): start_url = "https://blog.csdn.net/community/home-api/v1/get-fans-list" response = flow.response if flow.request.url.startswith(start_url): text = response.text data = json.loads(text) print(data) addons = [ GetFans() ]
這時(shí)候,如果我們能實(shí)現(xiàn)自動(dòng)化下拉頁(yè)面,是不是就能實(shí)現(xiàn)一個(gè)自動(dòng)化的爬蟲了呢???
訂閱時(shí)間
今天是持續(xù)寫作的第
267
/ 365 天。
可以
關(guān)注
我,
我、
評(píng)論
我、
我啦。
HTTP https Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。