移動端數據爬取
fiddler抓包工具
Fiddler是位於客戶端和服務器端的HTTP代理,也是目前最常用的http抓包工具之一 。 它能夠記錄客戶端和服務器之間的所有 HTTP請求,可以針對特定的HTTP請求,分析請求數據、設置斷點、調試web應用、修改請求的數據,甚至可以修改服務器返回的數據,功能非常強大,是web調試的利器。
客戶端的所有請求都要先經過Fiddler,然后轉發到相應的服務器,反之,服務器端的所有響應,也都會先經過Fiddler然后發送到客戶端,基於這個原因,Fiddler支持所有可以設置http代理為127.0.0.1:8888的瀏覽器和應用程序。
(1)下載fiddler之后直接一步下一步安裝即可。 
(2)fiddler默認只支持http協議的轉發,要想支持https協議的轉發和抓取,需要進行設置,安裝證書。(Tools---->Options---->HTTPS)

(3)允許其他設備也能使用fiddler進行代理轉發請求和響應,需要如下配置:(Tools---->Options---->Connections),配置端口號如圖8888

(4)在瀏覽器訪問fiddler代理:http://localhost:8888或者http://192.168.137.1:8888,出現如下頁面表示正常,FiddlerRoot certificate是移動端需要安裝的證書。

移動端設置
(1)移動端設備必須和fiddler在同一網段才能使用fiddler抓包,可以手機連接電腦熱點,然后手動設置代理指定fiddler代理的ip(192.168.137.1)和端口(8888)。


(2)證書安裝:直接在瀏覽器輸入http://192.168.137.1:8888,下載證書FiddlerRoot certificate后安裝或者通過其他方式發送到手機進行安裝信任!
①安卓設備:把證書放入手機的內置或外置存儲卡上,然后通過手機的"系統安全-》從存儲設備安裝"菜單安裝證書。 然后找到拷貝的FiddlerRoot.cer進行安裝即可。安裝好之后,可以在信任的憑證中找到我們已經安裝好的安全證書。

②蘋果設備:在瀏覽器下載證書進入手機設置---->通用---->描述文件---->安裝,然后設置---->通用---->關於本機---->證書信任設置---->開啟fiddler證書信任



Fiddler對移動端請求進行抓包
案例一:句讀app數據采集
1 ''' 2 手機app句讀【廣場】爬取 3 1.打開手機句讀app 4 2.點擊下邊第三個導航,默認就是【廣場】 5 3.在fiddler進行抓包,拿到api如下 6 4.向下滑動手機,查看抓包工具,找出請求鏈接進行對比,都是通過get請求,起始位置不同,因此可以簡單在第一次請求時設置請求條數即可大量獲取 7 ''' 8 import requests 9 num=10000#自定義采集數量 10 url=f'https://judouapp.com/api/v5/statuses?app_key=af66b896-665e-415c-a119-6ca5233a6963&channel=App%20Store&device_id=18a053095ad095fa6c331b7036f589a4&device_type=iPhone10%2C3&pagesign=&per_page={num}&platform=ios&signature=f99a2253c0636fd1de73e82de39fa0e6&system_version=12.3.1×tamp=1565141295&token=e11dda42765099ff0610bfce807ba440&version=3.8.0&version_code=51' 11 headers={ 12 'Accept':'*/*', 13 'Accept-Language':'zh-Hans-CN;q=1, en-CN;q=0.9, en-US;q=0.8', 14 'Connection':'keep-alive', 15 'Accept-Encoding':'br, gzip, deflate', 16 'User-Agent':'JudouRili/3.8.0 (iPhone; iOS 12.3.1; Scale/3.00)', 17 } 18 19 response=requests.get(url,headers=headers).json() 20 print(len(response["data"])) 21 fp=open('句讀.txt','w',encoding='utf-8') 22 for index,data in enumerate(response["data"]): 23 nickname=data["user"]["nickname"] 24 content=data["content"] 25 url=data["share_url"] 26 published_at=data["published_at"] 27 fp.write(f'{index+1}/{num+1}[{published_at}]{nickname}----{url}\n\t{content}\n\n------------------------------------')
案例二:抖音app小視頻爬取
1 ''' 2 通過抓包工具獲取抖音個人信息的請求連接,通過requests請求獲取視頻連接; 3 此案例是登陸之后好友的抖音視頻,注意cookie有效期 4 ''' 5 import os 6 import requests 7 url = 'https://api-hl.amemv.com/aweme/v1/aweme/post/?version_code=7.2.1&pass-region=1&pass-route=1&js_sdk_version=1.17.4.3&app_name=aweme&vid=03AF1BE2-1C49-42F4-9280-4CA78E8554F3&app_version=7.2.1&device_id=48188949731&channel=App%20Store&mcc_mnc=46001&aid=1128&screen_width=1125&openudid=bb6af869d6a21b959b2efc1414af434af4244f52&os_api=18&ac=WIFI&os_version=12.3.1&device_platform=iphone&build_number=72100&device_type=iPhone10,3&iid=80760036119&idfa=FA5BEC32-3917-4E54-92C1-8130C8B5C9FC&min_cursor=0&user_id=104290453971&count=21&max_cursor=0' 8 headers = { 9 'Connection':'keep-alive', 10 'x-Tt-Token':'00c5298f55f17f29df1f5870c60971c74eff742bc167d881418c39c6384740987a57ff8920ac697ca665a8c8dea7e50ec42', 11 'sdk-version':'1', 12 'User-Agent':'Aweme 7.2.1 rv:72100 (iPhone; iOS 12.3.1; zh_CN) Cronet', 13 'x-tt-trace-id':'00-d3ac15e52ed8ee0f911103e2f883d140-d3ac15e52ed8ee0f-01', 14 'Accept-Encoding':'gzip, deflate', 15 'Cookie':'tt_webid=6640617808751937028; __tea_sdk__user_unique_id=6640617808751937028; _ga=GA1.2.1852759965.1533561988; odin_tt=9f303c67997d51ed06eb85033ded2c41c8a051aafc15049d416669246d4a8fc9fbb0ee3cb48b15736c2cd7a1c68e0066; sid_guard=c5298f55f17f29df1f5870c60971c74e%7C1563533383%7C5184000%7CTue%2C+17-Sep-2019+10%3A49%3A43+GMT; uid_tt=d91cf1be6d56ed8851460c54c4bb7b47; sid_tt=c5298f55f17f29df1f5870c60971c74e; sessionid=c5298f55f17f29df1f5870c60971c74e; install_id=80760036119; ttreq=1$10c1e479908eed52765e8ee12a84e43e2253c1f3', 16 'X-Khronos':'1565148064', 17 'X-Pods':'', 18 'X-Gorgon':'83000e560000c220307e34ef71495882f95411d88045512c5c4a', 19 20 } 21 response_json = requests.get(url, headers=headers).json()#相應的是json格式 22 video_list=response_json["aweme_list"] 23 #創建好友視頻信息列表 24 video_url=[] 25 for video_info in video_list: 26 nickname =video_info["author"]["nickname"]#昵稱 27 gender=video_info["author"]["gender"]#性別 28 desc=video_info["desc"]#文字描述 29 print(desc) 30 player_addr=video_info["video"]["play_addr"]["url_list"][0]#播放地址 31 video_url.append((f'{nickname}({gender})',desc,player_addr)) 32 33 print(video_url) 34 #循環遍歷視頻列表,分條采集視頻數據 35 for video in video_url: 36 if not os.path.exists(video[0]): 37 os.mkdir(video[0]) 38 path = os.path.join(video[0], video[1] + '.mp4') 39 with open(path,'wb')as f: 40 f.write(requests.get(video[2]).content)
