爬虫学习笔记(二十三)—— Appium+Mitmproxy
生活随笔
收集整理的這篇文章主要介紹了
爬虫学习笔记(二十三)—— Appium+Mitmproxy
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、工具
- 1.1、手機投屏工具
- 1.2、fiddler、mitmproxy和APPium
- 二、案例:火山急速版視頻抓取
- 2.1、視頻鏈接
- 2.2、代碼實現
- 2.2.1、Appium自動化翻頁
- 2.2.2、mitmproxy提取視頻url
- 2.2.3、下載視頻
一、工具
1.1、手機投屏工具
- scrcpy投屏演示
- usb連接電腦
- cmd中 scrcpy啟動投屏工具
- 下載地址:https://github.com/Genymobile/scrcpy/releases
- 使用方法:https://blog.csdn.net/was172/article/details/99705855
1.2、fiddler、mitmproxy和APPium
- fiddler抓包
- 模擬器/手機與電腦同一網絡
- 設置手機代理,安裝證書
- 打開fiddler
- mitmproxy抓取數據
- 模擬器/手機與電腦同一網絡
- 設置手機代理,安裝證書
- mitm命令開啟工具
- appium手機自動化
- usb連接電腦
- 開發者模式
- usb調試打開
二、案例:火山急速版視頻抓取
2.1、視頻鏈接
以下有兩種方式可以找到我們需要的視頻的url:
1、Fiddler抓包:
JSON數據中找到video里面的download_url或url_list,這個字段下面有我們需要的視頻下載url
2、mitmproxy
mitmproxy抓包時在response標簽往下滾動可以找到show full content選項,顯示完整的響應體
這兩種方式都可以對模擬器中的請求進行抓取,注意要在模擬器網絡中選擇相對應的端口號,例如在我的電腦環境中,使用fiddler抓包端口號是8888,使用mitmproxy抓包端口號是8080
2.2、代碼實現
2.2.1、Appium自動化翻頁
1、建立連接
from appium import webdriver import time desired_caps = {'platformName': 'Android', #被測的手機是安卓'platformVersion': '7.1.2', #手機安卓版本'deviceName': 'BieYa', #設備名,安卓手機可以隨意填寫'appPackage': 'com.ss.android.ugc.livelite', #啟動APP package名稱 shell用查看app應用名'appActivity': 'com.ss.android.ugc.live.main.MainActivity', #啟動Activity名稱'unicodeKeyboard': True, #使用自帶輸入法,輸入中文是填true'resetKeyboard': True, #執行完程序恢復原來輸入法 經常來不及執行需要手動恢復'noReset': True, #不要重置APP 重要參數 務必填True'newCommandTimeout': 6000, #固定寫'automationName': 'UiAutomator2' } #連接APPium Server,初始化自動環境 建立連接,根據參數建立連接 安裝 driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps) #設置缺省等待時間 driver.implicitly_wait(5)2、滑動界面
def swipUp(driver,t=1500):'''向上滑動屏幕'''size = driver.get_window_size()x = size['width']*0.5 #x坐標y_start = size['height']*0.75 #起始點y坐標y_end = size['height']*0.25 #終點y坐標driver.swipe(x,y_start,x,y_end,t)while True:swip = input('是否滑動屏幕(y/n)?')if swip == 'y':for i in range(5):swipUp(driver)else:break driver.quit()2.2.2、mitmproxy提取視頻url
提取視頻url放入文本中
from mitmproxy import http import re import redisredisconn = redis.StrictRedis(host='127.0.0.1',port='6379',db=0 )def response(flow: http.HTTPFlow):'''獲取視頻url'''# "share_title": "「熊熊輕奢男裝」if flow.request.url.startswith('https://hotsoon-hl.snssdk.com') and '/hotsoon/feed/' in flow.request.path and 'vquality=normal&watermark' in flow.request.path:#獲取視頻titletitles = re.findall(b'"share_title":"「(.*?)」',flow.response.content)titles = [t.decode() for t in titles]# #獲取視頻的urlvideo_urls = re.findall(rb'"download_url":\["(.*?)",',flow.response.content)video_urls = [u.decode().replace('\\u0026', '&') for u in video_urls]title_video = dict(zip(titles,video_urls))print(title_video)#存進redis數據庫if title_video:redisconn.hmset('title_video',title_video)2.2.3、下載視頻
import os import requests import time import redis # 忽略警告 requests.urllib3.disable_warnings() redisconn = redis.StrictRedis(host='127.0.0.1',port='6379',db=0 )count = 0 def get_urls():video_dict = {}keys = redisconn.hkeys('title_video')for title in keys:video_url = redisconn.hget('title_video',title)video_dict[title] = video_url.decode()#刪除已經獲取的數據redisconn.hdel('title_video',title)return video_dictdef get_video(video_dict):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}for title,video_url in video_dict.items():res = requests.get(video_url,headers=headers,verify=False)global countcount+=1print(f'[{count}] 正在下載視頻')if not os.path.exists('video'):os.mkdir('video')filename = 'video/'+str(title.decode())+'.mp4'try:with open(filename,'wb') as f:f.write(res.content)except:passwhile True:time.sleep(5) #先等待數據存到數據庫video_dict = get_urls()if not video_dict:breakget_video(video_dict)總結
以上是生活随笔為你收集整理的爬虫学习笔记(二十三)—— Appium+Mitmproxy的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫学习笔记(二十二)—— Mitmpr
- 下一篇: 爬虫学习笔记(二十四)—— pyspid