簡單的網(wǎng)頁爬蟲開發(fā)_第1頁
簡單的網(wǎng)頁爬蟲開發(fā)_第2頁
簡單的網(wǎng)頁爬蟲開發(fā)_第3頁
簡單的網(wǎng)頁爬蟲開發(fā)_第4頁
簡單的網(wǎng)頁爬蟲開發(fā)_第5頁
已閱讀5頁,還剩90頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

極客學(xué)院

J互聯(lián)網(wǎng)+職業(yè)技能系列Python爬蟲開發(fā)

從入門到實(shí)戰(zhàn)(微課版)Python

Crawler

Developmen人民郵電出版社謝乾坤著第9章

抓包與中間人爬蟲網(wǎng)頁爬蟲叫作“WebCrawler”,但實(shí)際上,除了網(wǎng)頁以外,還有很多其他地方可以爬取數(shù)據(jù),所有這些地方的爬蟲合在一起才叫作“Spider”在前面的章節(jié),爬蟲爬取的對象主要是計(jì)算機(jī)網(wǎng)頁。本章將會講到手機(jī)App爬蟲、微信小程序爬蟲和中間人爬蟲。通過這一章的學(xué)習(xí),你將會掌握如下知識。使用Charles抓取App和微信小程序的數(shù)據(jù)包。使用mitmproxy開發(fā)中間人爬蟲。9.1

數(shù)據(jù)抓包所謂抓包(Package

Capture),簡單來說,就是在網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)倪^程中對數(shù)據(jù)包進(jìn)行截獲、查看、修改或轉(zhuǎn)發(fā)的過程。如果把網(wǎng)絡(luò)上發(fā)送與接收的數(shù)據(jù)包理解為快遞包裹,那么在快遞運(yùn)輸?shù)倪^程中查看里面的內(nèi)容,這就是抓包。9.1.1

Charles的介紹和使用在分析異步加載的網(wǎng)頁時(shí),Chrome的開發(fā)者工具非常好用。通過在開發(fā)者工具的“Network”選項(xiàng)卡中尋找被加載的數(shù)據(jù),然后用Python模擬出這個(gè)數(shù)據(jù)的請求,從而直接訪問網(wǎng)站的后臺接口,就可以得到數(shù)據(jù)。但是開發(fā)者工具有一個(gè)特別不方便的地方,那就是沒法對數(shù)據(jù)進(jìn)行搜索。如果想知道一個(gè)特定的異步加載內(nèi)容來自哪個(gè)請求,必須在

“Network”選項(xiàng)卡里面一個(gè)請求一個(gè)請求地進(jìn)行查看。如果一個(gè)網(wǎng)頁的請求有幾百個(gè),那么這樣尋找起來是非常費(fèi)時(shí)、費(fèi)力的。要簡化尋找數(shù)據(jù)的過程,就需要設(shè)法直接全局搜索網(wǎng)頁的所有請求的返回?cái)?shù)據(jù)。為了實(shí)現(xiàn)這個(gè)目的,就需要使用Charles。Charles是一個(gè)跨平臺的HTTP抓包工具。使用它可以像Chrome一樣截取HTTP或者HTTPS請求的數(shù)據(jù)包。同時(shí)Charles還有Chrome所不具備的很多奇妙功能。1.Charles的安裝和使用Charles是一個(gè)收費(fèi)軟件,官方網(wǎng)站地址為https://www.charlesprcom/。如果沒有注冊,安裝以后的前30天可以正常使用。30天以后,雖然功能不會縮水,但每過30分鐘Charles會自動關(guān)閉一次。Charles有Windows

32位/64位版、Mac

OS版和Linux

64位版。讀者可在下載頁面選擇符合自己系統(tǒng)的版本進(jìn)行下載。Charles的下載和安裝沒有任何難點(diǎn)。在Windows系統(tǒng)中,直接雙擊安裝文件進(jìn)行安裝即可,任何設(shè)置都不需要修改,同意許可協(xié)議以后,一直單擊“Next”按鈕直到安裝完成;在Mac

OS系統(tǒng)中雙擊下載下來的.dmg文件,同意許可協(xié)議以后,把Charles的水瓶圖標(biāo)拖到Application這個(gè)文件夾里面即可,如圖9-1所示。圖9-1將左側(cè)水瓶圖標(biāo)拖到右側(cè)文件夾中即可完成Charles的安裝安裝完成后,第一次運(yùn)行Charles會彈出一個(gè)對話框,提示需要獲取權(quán)限來自動配置網(wǎng)絡(luò),單擊“Grant

Privileges”按鈕并輸入系統(tǒng)密碼運(yùn)行即可,如圖9-2所示。圖9-2單擊“Grant

Privileges”按鈕同意Charles獲取權(quán)限剛剛打開Charles就可以看到上面滾動了非常多的數(shù)據(jù),如圖9-3所示。圖9-3打開Charles就可以看到很多數(shù)據(jù)滾動2.Charles的使用Charles上面滾動的數(shù)據(jù)就是目前計(jì)算機(jī)發(fā)起的數(shù)據(jù)包。單擊工具欄上面的黃色笤帚圖標(biāo),可以清空當(dāng)前的數(shù)據(jù)包記錄;單擊笤帚右邊的紅色圓點(diǎn)圖標(biāo),可以停止抓包,且紅色圓點(diǎn)變成灰色圓點(diǎn)。暫停以后再單擊灰色圓點(diǎn),Charles恢復(fù)抓包,如圖9-4所示。圖9-4通過單擊笤帚圖標(biāo)和圓點(diǎn)圖標(biāo)來控制Charles在Charles啟動時(shí),系統(tǒng)自帶瀏覽器的所有HTTP流量都會經(jīng)過Charles,此時(shí)可以看到數(shù)據(jù)包,如圖9-5所示。圖9-5系統(tǒng)自帶瀏覽器Safari的數(shù)據(jù)包會自動經(jīng)過Charles在數(shù)據(jù)包非常多的情況下,使

用Charles的過濾功能來對數(shù)據(jù)包進(jìn)行過濾從而減少干擾。在Filter這一欄中輸入域名,就可以顯示只包含

這個(gè)域名的數(shù)據(jù)包,如圖9-6所示。圖9-6在Filter中輸入域名來對數(shù)據(jù)包進(jìn)行過濾單擊“Filter”輸入框下方的“Contents”按鈕,查看數(shù)據(jù)包的詳細(xì)信息,如圖9-7所示。圖9-7單擊Filter欄下面的“Contents”按鈕,查看詳細(xì)信息通過單擊圖9-7中方框框住的各個(gè)選項(xiàng)卡,可以非常直觀地觀察到請求和返回的各種信息。如果瀏覽器是Chrome,在沒有安裝第三方代理插件的情況下,Chrome的HTTP流量都會經(jīng)過Charles。但是如果安裝了第三方的類似于SwitchyOmega這種代理插件,那么就可以在插件里面添加一個(gè)代理,代理IP為,端口為8888,如圖9-8所示。圖9-8在SwitchyOmega中配置代理IP和端口使網(wǎng)絡(luò)請求經(jīng)過Charles在Chrome使用這個(gè)代理的情況

下,就可以正常讓Charles監(jiān)控流量了,如圖9-9所示。也計(jì)算機(jī)上的任意軟件,如果支持自定義代理的功能,那么設(shè)置代理IP為,端口為8888,可以讓Charles監(jiān)控這個(gè)軟件。圖9-9讓Chrome的流量經(jīng)過Charles以后,Charles可以抓取Chrome的數(shù)據(jù)包當(dāng)Charles抓包以后,在Mac

OS系統(tǒng)下可以按Command+F組合鍵,在Windows系統(tǒng)下按Ctrl+F組合鍵打開Charles進(jìn)行搜索,如圖9-10所示。圖9-10在Charles的搜索界面進(jìn)行搜索雙擊搜索出來的結(jié)果,Charles就會自動跳轉(zhuǎn)到對應(yīng)的數(shù)據(jù)包上。有一點(diǎn)需要注意,JSON里面的中文是無法直接搜索到的,如圖9-11所示。圖9-11異步請求返回的JSON數(shù)據(jù)中的中文不能直接搜索為了搜索到中文,需要首先在Python里面創(chuàng)建一個(gè)帶中文的字典或者列表,然后把它轉(zhuǎn)換成JSON,再從JSON中復(fù)制出中文對應(yīng)的Unicode碼來進(jìn)行搜索,如圖9-12所示。圖9-12首先使用Python把中文轉(zhuǎn)換為Unicode碼再通過Charles搜索3.抓取HTTPS數(shù)據(jù)包如果使用Charles直接抓取

HTTPS的數(shù)據(jù)包,就會出現(xiàn)大量的Method為CONNECT的請

求,但是這些請求又全部都會失敗,如圖9-13所示。圖9-13用Charles抓取HTTPS數(shù)據(jù)包時(shí)的請求會大量失出現(xiàn)這種情況,是因?yàn)闆]有安裝SSL證書導(dǎo)致的。要安裝SSL證書,可選擇菜單欄的“Help”-“SSL

Proxying”-“InstallCharles

Root

Certificate”命令,如圖9-14所示。圖9-14通過菜單欄命令來安裝SSL證書對于Mac

OS系統(tǒng),“鑰匙串訪問”窗口會自動彈出來,

Charles的證書已經(jīng)出現(xiàn)在了其中,如圖9-15所示。圖9-15

Charles的證書已經(jīng)被安裝到了系統(tǒng)的鑰匙串中雙擊Charles證書所在的這一行,在新打開的窗口中展開“信任”三角形按鈕,將“使用此證書時(shí)”設(shè)定為“始終信任”,如圖9-16所示。關(guān)閉這個(gè)彈出來的窗口,系統(tǒng)會自動彈出輸入密碼的窗口,輸入密碼以后,證書就安裝好了。對于Windows系統(tǒng),選擇菜單欄中的“Help”-“SSL

Proxying”-“Install

CharlesRoot

Certificate”會自動彈出證書信息,如圖9-1示。圖9-16展開“信任”三角形按鈕并將Charles設(shè)置為始終信任圖9-17Windows顯示證書信息單擊圖9-17中的“安裝證書”按鈕,打開證書導(dǎo)入向?qū)В鐖D9-18所示。單擊“下一步”按鈕,選擇“將所有的證書都放入下列存儲”單選按鈕,單擊“瀏覽”按鈕,在彈出的對話框中選擇“受信任的根證書頒發(fā)機(jī)構(gòu)”,單擊“確定”按鈕,如圖9-19所示。圖9-18證書導(dǎo)入向?qū)D9-19將Charles的證書添加到受信任的根證書頒發(fā)機(jī)構(gòu)單擊“下一步”按鈕,會彈出一個(gè)警告對話框,如圖9-20所示。單擊“是”按鈕完成證書安裝。圖9-20系統(tǒng)彈出警告窗口詢問是否安裝證書安裝好證書以后,選擇菜單欄中的“Proxy”-“SSL

ProxyingSettings”命令打開SSL代理設(shè)置對話框,如圖9-21所示。在SSL代理設(shè)置對話框,單擊“Add”按鈕,在“Host”輸入框中輸入星號,在“Port”輸入框中輸入443,如圖9-22所示。圖9-21選擇菜單欄中的“Proxy”-“SSL

Proxying

Settings”命令圖9-22在Host輸入框中輸入“*”,在“Port”輸入框中輸入443設(shè)置好證書和SSL代理以后,再回到瀏覽器刷新網(wǎng)頁,就可以看到Charles成功截獲到了數(shù)據(jù)包,如圖9-23所示。圖9-23設(shè)置好證書及SSL代理以后,Charles成功捕獲HTTPS數(shù)據(jù)包9.1.2

App爬蟲和小程序爬蟲比較Charles和Chrome開發(fā)者工具,如果只是多了一個(gè)搜索功能,那就沒有必要單獨(dú)用一章來介紹。使用Charles,可以輕松截獲手機(jī)App和微信小程序的數(shù)據(jù)包,從而開發(fā)出直接抓取App后臺和小程序后臺的爬蟲。為了實(shí)現(xiàn)使用Charles抓取手機(jī)的數(shù)據(jù)包,就需要先把證書安裝到手機(jī)上。1.iOS系統(tǒng)的配置和使用對于蘋果設(shè)備,首先要保證計(jì)算機(jī)和蘋果設(shè)備聯(lián)在同一個(gè)Wi-Fi上。選擇Charles菜單欄中的“Help”-“LocalIPAddress”命令,此時(shí)彈出對話框,顯示當(dāng)前計(jì)算機(jī)的內(nèi)網(wǎng)IP地址,如圖9-24所示。接下來設(shè)置手機(jī)。進(jìn)入系統(tǒng)設(shè)置,選擇“無線局域網(wǎng)”,然后單擊已經(jīng)連接的這個(gè)Wi-Fi熱點(diǎn)右側(cè)的圓圈包圍的字母i的圖標(biāo),如圖9-25所示圖9-24查看計(jì)算機(jī)的內(nèi)網(wǎng)IP地址圖9-25單機(jī)Wi-Fi右側(cè)圓圈包圍的感嘆號圖標(biāo)選擇“HTTP代理”下面的“手動”選項(xiàng)卡,在“服務(wù)器”處輸入計(jì)算機(jī)的IP地址,在“端口”處輸入8888,如圖9-26所示。圖9-26手動輸入計(jì)算機(jī)的IP地址和端口輸入完成代理以后按下蘋果設(shè)備的Home鍵,設(shè)置就會自動保存。注意,計(jì)算機(jī)上立刻就會彈出一個(gè)對話框,詢問是否允許一臺設(shè)備通過計(jì)算機(jī)代理上網(wǎng),如圖9-27所示。圖9-27詢問是否允許設(shè)備通過計(jì)算機(jī)代理上網(wǎng)單擊“Allow”按鈕,允許以后,只能使用iOS系統(tǒng)自帶的

Safari瀏覽器訪問/ssl。此時(shí)會彈出一個(gè)對話框,詢問是否顯示配置描述文件,如圖9-28所示,單擊“允許”按鈕,打開圖9-29所示的界面。圖9-28確認(rèn)是否安裝描述文件圖9-29允許配置描述文件后會自動彈出對話框單擊右上角的“安裝”按鈕,彈出另一個(gè)對話框,顯示描述文件信息,如圖9-30所示。單擊“安裝”按鈕并輸入屏鎖密碼,進(jìn)行安裝即可。安裝完成證書以后,在設(shè)置中打開“關(guān)于本機(jī)”,找到最下面的“證書信任設(shè)置”,并在里面啟動對Charles證書的完全信任,如圖9-31所示。圖9-30描述文件信息圖9-31打開對Charles證書的完全信任開關(guān)這樣,一個(gè)證書就在iOS設(shè)備上安裝好了。安裝好證書以后,打開iOS設(shè)備上的任何一個(gè)App,可以看到Charles中有數(shù)據(jù)包在流動,如圖9-32所示。圖9-32中,這個(gè)數(shù)據(jù)包對應(yīng)的是iOS設(shè)備上面的“掘金”App這個(gè)技術(shù)類App查詢文章的請求,界面如圖9-33所示。圖9-32安裝完成證書以后,Charles可以監(jiān)控手機(jī)App數(shù)據(jù)包圖9-33掘金App的界面在Charles中,在這個(gè)數(shù)據(jù)包的“Contents”選項(xiàng)卡下面的請求的

“Raw”選項(xiàng)卡中可以看到這個(gè)請求的如下相關(guān)信息:GET/v1/get_entry_by_timeline?before=&category=57be7c18128fe1005a902de&limit=20&src=ios&type=

HTTP/1.1Host:

timeline-merger-ms.juejin.imAccept:

*/*Cookie:QINGCLOUDELB=47f7a729e0fcb7fdf0b3143c89790b65ab7e48fb3972913efd95d72fe838c4fb|W0Nyw|W0NywUser-Agent:

Xitu/5.3.0

(iPad;

iOS

11.4;

Scale/2.00)Accept-Language:

zh-Hans-CN;q=1Accept-Encoding:

br,

gzip,

deflateConnection:

keep-alive說明:這是一個(gè)GET方式的請求,從第3行開始是請求的頭。在Python中可以模擬這個(gè)請求,如圖9-34所示。。圖9-34在Python中模擬掘金客戶端的請求獲取文章信息2.Android的配置和使用要實(shí)現(xiàn)Charles對Android抓包,其過程比iOS稍微復(fù)雜一點(diǎn)。這是因?yàn)椴煌腁ndorid設(shè)備,安裝證書的入口可能不一樣,這就需要根據(jù)自己手機(jī)的實(shí)際情況來尋找。首先在Charles中選擇“Help”-“SSL

Proxying”-“Save

CharlesCertificate”命令,將Charles的證書保存到計(jì)算機(jī)桌面,如圖9-35所圖9-35將Charles的證書保存到計(jì)算機(jī)桌面為了在手機(jī)上安裝證書,需要先發(fā)送證書到手機(jī)里面。如果計(jì)算機(jī)系統(tǒng)為Windows,那么直接插上USB線就可以傳送。如果計(jì)算機(jī)系統(tǒng)是Mac

OS,那么可以使用QQ傳文件或者微信的文件傳輸助手把證書文件發(fā)送到手機(jī)里面。雖然Android里面安裝證書的位置可能不同,但一般都在“系統(tǒng)設(shè)置”-“WLAN”里面。打開Wi-Fi功能,界面如圖9-36所示。圖9-36

Android的Wi-Fi設(shè)置界面有的Android系統(tǒng),這個(gè)界面的左下角或者右下角可能有3個(gè)點(diǎn),點(diǎn)開以后是一個(gè)高級設(shè)置的菜單。而另一些

Android手機(jī)的系統(tǒng),例如小米手機(jī)的

MIUI系統(tǒng),則是直接在最下面就可以找到高級設(shè)置,如圖9-37所示。圖9-37

MIUI系統(tǒng)的最下面就可以看到高級設(shè)置選擇“高級設(shè)置”,打開高級設(shè)置界面,繼續(xù)選擇“安裝證書”,如圖9-38所示。系統(tǒng)會打開文件瀏覽器,在里面找到剛才發(fā)送到手機(jī)上面的證書文件。找到證書并單擊“確定”按鈕,此時(shí)會彈出一個(gè)窗口,提示給證書設(shè)定一個(gè)名字,如圖9-39所示,這個(gè)名字可以任意設(shè)定。圖9-38選擇“安裝證書”圖9-39為證書任意設(shè)定一個(gè)名字單擊“確定”按鈕,證書就安裝好了。接

下來和iOS一樣,需要為手機(jī)設(shè)置代理,讓手

機(jī)的流量經(jīng)過Charles。在系統(tǒng)設(shè)置中打開當(dāng)前連接的Wi-Fi設(shè)置界面,并將代理設(shè)置為Charles對應(yīng)的IP和端口號,如圖9-40所示。圖9-40為手機(jī)設(shè)置代理和iOS不同的是,Android設(shè)置了代理以后需要單擊“確定”按鈕。代理設(shè)置好以后,Android的環(huán)境就搭建好了。在手機(jī)上任意打開一個(gè)App,就可以看到Charles上面有數(shù)據(jù)在流動,如圖9-41所示。圖9-41

Charles監(jiān)控Android設(shè)備數(shù)據(jù)包這個(gè)數(shù)據(jù)包對應(yīng)了TapTap這個(gè)App的首頁數(shù)據(jù),TapTap首頁如圖9-42所示。圖9-42

TapTap首頁3.微信小程序爬蟲使用Charles抓取微信小程序的步驟與抓取App幾乎沒有區(qū)別。當(dāng)使用

Charles監(jiān)控iOS設(shè)備或者Android設(shè)備的數(shù)據(jù)包以后,打開微信小程序,小程序的數(shù)據(jù)包就會自動被Charles抓住。在微信小程序中打開“春秋航空”小程序,并任意查詢一條線路的航班

信息,手機(jī)上面的信息如圖9-43所示。圖9-43“春秋航空”小程序線路查詢信息此時(shí),Charles上面可以看到航班信息,如圖9-44所示,為JSON格式。圖9-44

Charles抓取到的小程序數(shù)據(jù)包小程序的請求極其簡單,基本上沒有驗(yàn)證信息,即便有驗(yàn)證信息也非常脆弱。用Python來請求小程序的后臺接口從而獲取數(shù)據(jù),比請求異步加載網(wǎng)頁的后臺接口要容易很多。在爬蟲開發(fā)過程中,如果目標(biāo)網(wǎng)站有微信小程序,那么一定要優(yōu)先調(diào)查能否通過小程序的接口來抓取數(shù)據(jù)。小程序的反爬蟲能力比網(wǎng)頁版的低很多。使用小程序的接口來爬數(shù)據(jù),能極大提高爬蟲的開發(fā)效率。4.Charles的局限Charles只能截獲HTTP和HTTPS的數(shù)據(jù)包,如果網(wǎng)站使用的是websocke或者是flashsocket,那么Charles就無能為力。有一些App會自帶證書,使用其他證書都無法正常訪問后臺接口。在這種情況下,Charles自帶的證書就不能正常使用,也就沒有辦法抓取這

App的數(shù)據(jù)。有一些App的數(shù)據(jù)經(jīng)過加密,App接收到數(shù)據(jù)以后在其內(nèi)部進(jìn)行解密。對于這種情況,Charles只能抓取到經(jīng)過加密的數(shù)據(jù)。如果無法知道據(jù)的具體加密方法,就沒有辦法解讀Charles抓取到的數(shù)據(jù)。9.2

中間人爬蟲中間人(Man-in-the-Middle,MITM)攻擊是指攻擊者與通信的兩端分別創(chuàng)建獨(dú)立的聯(lián)系,并交換其所收到的數(shù)據(jù),使通信的兩端認(rèn)為其正在通過一個(gè)私密的連接與對方直接對話,但事實(shí)上整個(gè)會話都被攻擊者完全控制。在中間人攻擊中,攻擊者可以攔截通信雙方的通話,并插入新的內(nèi)容或者修改原有內(nèi)容。中間人攻擊,名字看起來很高級的樣子,其實(shí)大多數(shù)人在小

時(shí)候都遭受過甚至使用過——上課傳紙條。A要把紙條傳給B,但

是A與B距離太遠(yuǎn),于是讓C來轉(zhuǎn)交紙條。此時(shí),C作為一個(gè)中間人,他有兩種攻擊方式:僅僅偷偷查看紙條的內(nèi)容,或者先篡改紙條

的內(nèi)容再傳給B。中間人爬蟲就是利用了中間人攻擊的原理來實(shí)現(xiàn)數(shù)據(jù)抓取的一種爬蟲技術(shù)。數(shù)據(jù)抓包就是中間人爬蟲的一個(gè)簡單應(yīng)用。所以使用Charles也是一種中間人攻擊。9.2.1

mitmproxy的介紹和安裝對編程有了解的讀者一定聽說過“Linux比Windows好”這種言論,那么Linux哪一點(diǎn)比Windows好呢?Linux好就好在它里面有無數(shù)強(qiáng)大的命令行下的軟件。這些軟件不需要鼠標(biāo),也沒有圖形界面,所有的操作就是輸入命令。而命令本質(zhì)上就是文本。操作文本比操作圖形界面容易得多。操作文本可以實(shí)現(xiàn)自動化,而操作圖形界面卻難以實(shí)現(xiàn)自動化。請讀者在Linux、Mac

OS或者Windows

10自帶的Ubuntu

Bash下使用mitmproxy,只有這樣,才能發(fā)揮它的最大能力。對于Mac

OS系統(tǒng),使用Homebrew安裝mitmproxy,命令為:

brew

install

mitmproxy在Ubuntu中,要安裝mitmproxy,首先需要保證系統(tǒng)的Python為Python

3.5或者更高版本,然后執(zhí)行下面兩條命令:sudo

apt-get

install

python3-dev

python3-pip

libffi-dev

libsslsudo

pip3

install

mitmproxy9.2.2

mitmproxy的使用安裝好mitmproxy以后,在終端執(zhí)行下面的命令,此時(shí)會彈出一個(gè)窗口,窗口的文字根據(jù)系統(tǒng)的不同,可能是英文也可能是中文,大意是詢問是否允許Python

3.6接收收入的網(wǎng)絡(luò)連接,單擊“允許”按鈕或者“Allow”按鈕,如圖9-45示。圖9-45

運(yùn)行mitmproxy會彈出對話框詢問是否允許Python接收傳入的網(wǎng)絡(luò)連接接下來會打開一個(gè)命令行下的數(shù)據(jù)監(jiān)控窗口,如圖9-46所示。圖9-46

mitmproxy會在終端里顯示一個(gè)命令行下的數(shù)據(jù)監(jiān)控窗口mitmproxy的端口為8080端口,在瀏覽器或者在手機(jī)上設(shè)置代理,代理IP為計(jì)算機(jī)IP,端口為8080端口,如圖9-47所示。設(shè)置好代理以后,在手機(jī)上打開一個(gè)App或者打開一個(gè)網(wǎng)頁,可以看到mitmproxy上面有數(shù)據(jù)滾動,如圖9-48所示。圖9-47設(shè)置代理使手機(jī)的流量經(jīng)過mitmproxy圖9-48數(shù)據(jù)在mitmproxy中滾動用鼠標(biāo)在終端窗口上單擊其中的任意一個(gè)請求,可以顯示這個(gè)數(shù)據(jù)包的詳情信息,如圖9-49所示。圖9-49鼠標(biāo)單擊終端窗口的數(shù)據(jù),可以查看數(shù)據(jù)包詳情此時(shí)只能訪問HTTP網(wǎng)站,要訪問HTTPS網(wǎng)站,還需要安裝

mitmproxy的證書。在手機(jī)設(shè)置了mitmproxy的代理以后,通過手機(jī)瀏覽器訪問http://mitm.it/這個(gè)網(wǎng)址,會出現(xiàn)圖9-50所示的網(wǎng)頁。根據(jù)自己的手機(jī)選擇對應(yīng)的圖標(biāo),就可以彈出安裝證書的界面。界面與安裝Charles的證書界面基本一樣。安裝完成證書以后,就可以截獲HTTPS的數(shù)據(jù)包了,如圖9-51所示。圖9-50在手機(jī)中打開mitmproxy的證書下載頁面圖9-51在mitmproxy中截獲HTTPS數(shù)據(jù)包9.2.3

使用Python定制mitmproxymitmproxy的強(qiáng)大之處在于它還自帶一個(gè)mitmdump命令。這個(gè)命令可以用來運(yùn)行符合一定規(guī)則的Python腳本,并在Python腳本里面直接操作HTTP和HTTPS的請求,以及返回的數(shù)據(jù)包。為了自動化地監(jiān)控網(wǎng)站或者手機(jī)發(fā)出的請求頭部信息和Body信息,并接收網(wǎng)站返回的頭部信息和Body信息,就需要掌握如何在Python腳本中獲得請求和返回的數(shù)據(jù)包。1.請求數(shù)據(jù)包創(chuàng)建一個(gè)parse_request.py文件,其文件內(nèi)容只有兩行代碼:

def

request(flow):print(flow.request.headers)在命令行下執(zhí)行命令:

mitmdump-s

parse_request.py運(yùn)行命令以后,在手機(jī)上打開一個(gè)App,可以看到這個(gè)App請求的頭部信息已經(jīng)出現(xiàn)在終端窗口中,如圖9-52所示。圖9-52請求的頭部信息出現(xiàn)在終端窗口中當(dāng)然,除了顯示頭部信息以外,還可以查看請求的Cookies或者

Body信息。修改parse_request.py:def

request(flow):req

=

flow.requestprint(f"當(dāng)前請求的URL為:{req.url}")print(f"當(dāng)前的請求方式為:{req.method}")print(f"當(dāng)前的Cookies為:{req.cookies}")print(f"請求的body為:{req.text}")運(yùn)行結(jié)果如圖9-53所示。圖9-53顯示請求的Cookies和body的運(yùn)行結(jié)果2.返回?cái)?shù)據(jù)包對于網(wǎng)站返回的數(shù)據(jù)包,可以再實(shí)現(xiàn)一個(gè)response()函數(shù)。創(chuàng)建一個(gè)parse_response.py文件,其內(nèi)容如下:import

jsondef

response(flow):resp

=

flow.responseprint(f"返回的頭部為:{resp.headers}")print(f"返回的body為:{json.loads(resp.content)}")如果網(wǎng)站返回的body正好是JSON格式的字符串,那么就可以使用Python的JSON模塊來解析。當(dāng)然,由于這個(gè)函數(shù)要處理所有的網(wǎng)絡(luò)返回的數(shù)據(jù)包,對返回內(nèi)容不是JSON格式字符串的情況就會報(bào)錯(cuò),如圖9-54所示。此時(shí),可以在Python腳本里面針對性地處理某個(gè)網(wǎng)站返回的數(shù)據(jù)。這個(gè)時(shí)候,就把請求和返回內(nèi)容放在一起,且函數(shù)名必須為“response”,代碼如下:def

response(flow):req

=

flow.requestresponse

=

flow.responseif

""

in

req.url:print("這是kingname的網(wǎng)站,也是我的目標(biāo)網(wǎng)站")

print(f"請求的headers是:{req.headers}")print(f"請求的UA是:{req.headers["User-Agent"]}")print(f"返回的內(nèi)容是:{response.text}")運(yùn)行結(jié)果如圖9-55所示。圖9-54對返回內(nèi)容不是JSON格式字符串的情況就會報(bào)錯(cuò)圖9-55

mitmproxy只監(jiān)控特定請求的數(shù)據(jù)包,自動跳過其他網(wǎng)站的數(shù)據(jù)包3.mitmdump的使用場景網(wǎng)站返回的Headers中經(jīng)常有Cookies,如圖9-56所示。圖9-56網(wǎng)站返回的Headers中經(jīng)常有Cookiesmitmdump的腳本使用print()函數(shù)把Cookies打印出來,然后通過管道傳遞給另一個(gè)普通的正常的Python腳本。在另一個(gè)腳本里面,得到管道傳遞進(jìn)來的Cookies,再把它放進(jìn)Redis里面。首先是mitmdump的腳本,其代碼如下:

def

response(flow):req

=

flow.requestif

""

in

req.url:cookies

=

req.headers.get("Cookie",

"")if

cookies:print(f">>>{cookies}<<<")代碼的運(yùn)行結(jié)果如圖9-57所示。圖9-57獲取Cookies的代碼運(yùn)行結(jié)果代碼運(yùn)行以后,會把Cookies放在>>>和<<<中間。

另外創(chuàng)建一個(gè)普通的extract.py文件,其內(nèi)容如下:import

reimport

sysfor

line

in

sys.stdin:cookie

=

re.search(">>>(.*?)<<<",

line)if

cookie:print(f"拿到Cookies:{cooki

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論