1
目 標 場 景
如果一條條去刷確實很耗時間,如果 Python 能幫忙篩選出顏值高的小姐姐那就省了很多事。
本篇文章是藉助「百度人臉識別」API,幫我們識別出抖音上顏值高的小姐姐,然後下載到手機相簿中。
2
準 備 工 作
首先,專案需要對頁面元素進行一些精準的操作,需要提前準備一部 Android 裝置,啟用開發者選項,並在開發者選項中開啟 「USB 除錯和指標位置」兩處設定。
為了確保 adb 命令能正常使用,需要提前配置好 adb 開發環境。
頁面元素中的部分元素沒法利用 name 等常用屬性獲取到,可能需要獲取到完整的「UI 樹」,再利用 Airtest 判斷是否存在某個 UI 元素。
# 安裝依賴pip3installpocoui
另外,專案中會對視訊進行人臉識別,獲取到出現的所有人臉,再進行性別識別及顏值判斷。
這裡需要進行百度雲後臺,註冊一個人臉識別的應用,獲取到一組 「API Key 和 Secret Key」值。
https://console.bce.baidu.com
然後利用官網提供的 API 文件即可獲取到「access token」,由於 ak 的有效期為一個月,所以只需要初始化一次,後面就可以利用人臉識別介面進行正常的識別了。
appid='你註冊應用的appid'api_key='你註冊應用的ak'secret_key='你註冊應用的sk'defget_access_token():"""其中access_token有效期一般有一個月"""#此變數賦值成自己APIKey的值client_id=api_key#此變數賦值成自己SecretKey的值client_secret=secret_keyauth_url='https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+client_id+'&client_secret='+client_secretheader_dict={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Trident/7.0;rv:11.0)likeGecko',"Content-Type":"application/json"}#請求獲取到token的介面response_at=requests.get(auth_url,headers=header_dict)json_result=json.loads(response_at.text)access_token=json_result['access_token']returnaccess_token
3
編 寫 腳 本
在上面已經配置好了 adb 環境的情況下,可以直接藉助 python 中的 os 模組執行 adb 命令開啟抖音 App。
#抖音App的應用包名和初始Activitypackage_name='com.ss.android.ugc.aweme'activity_name='com.ss.android.ugc.aweme.splash.SplashActivity'defstart_my_app(package_name,activity_name):"""開啟應用adbshellamstart-ncom.tencent.mm/.ui.LauncherUI:parampackage_name::return:"""os.popen('adbshellamstart-n%s/%s'%(package_name,activity_name))
接著,我們需要擷取當前播放視訊的截圖到本地。
需要注意的是,抖音視訊播放介面包含視訊創作者頭像、BGM 創作者頭像等一些雜亂的元素,可能對人臉識別的結果產生一些誤差,所以需要對螢幕截圖之後的影象進行「二次裁剪」處理。
defget_screen_shot_part_img(image_name):"""獲取手機截圖的部分內容:return:"""#截圖os.system("adbshell/system/bin/screencap-p/sdcard/screenshot.jpg")os.system("adbpull/sdcard/screenshot.jpg%s"%image_name)#開啟圖片img=Image.open(image_name).convert('RGB')#圖片的原寬、高(1080*2160)w,h=img.size#擷取部分,去掉其頭像、其他內容雜亂元素img=img.crop((0,0,900,1500))img.thumbnail((int(w/1.5),int(h/1.5)))#儲存到本地img.save(image_name)returnimage_name
現在可以使用百度提供的 API 獲取到上面截圖的人臉列表。
defparse_face_pic(pic_url,pic_type,access_token):"""人臉識別5秒之內:parampic_url::parampic_type::paramaccess_token::return:"""url_fi='/file/2019/12/23/20191223204914_47939.jpg 18-30 歲之間,顏值超過 70 的小姐姐。
defanalysis_face(face_list):"""分析人臉,判斷顏值是否達標18-30之間,女,顏值大於80:paramface_list:識別的臉的列表:return:"""#是否能找到高顏值的美女find_belle=Falseifface_list:print('一共識別到%d張人臉,下面開始識別是否有美女~'%len(face_list))forfaceinface_list:#判斷是男、女ifface['gender']['type']=='female':age=face['age']beauty=face['beauty']if18<=age<=30andbeauty>=70:print('顏值為:%d,及格,滿足條件!'%beauty)find_belle=Truebreakelse:print('顏值為:%d,不及格,繼續~'%beauty)continueelse:print('性別為男,繼續~')continueelse:print('圖片中沒有發現人臉.')returnfind_belle
由於視訊是連續播放的,很難通過擷取視訊某一幀,判斷視訊有出現顏值高的小姐姐。
另外,大部分短視訊播放時長為「10s+」,這裡需要對每一個視訊多次截圖去做人臉識別,直到識別到顏值高的小姐姐。
# 一條視訊最長的識別時間RECOGNITE_TOTAL_TIME = 10#識別次數recognite_count=1#對當前視訊截圖去人臉識別whileTrue:#獲取截圖print('開始第%d次截圖'%recognite_count)#擷取螢幕有用的區域,過濾視訊作者的頭像、BGM作者的頭像screen_name=get_screen_shot_part_img('images/temp%d.jpg'%recognite_count)#人臉識別recognite_result=analysis_face(parse_face_pic(screen_name,TYPE_IMAGE_LOCAL,access_token))recognite_count+=1#第n次識別結束後的時間recognite_time_end=datetime.now()#這一條視訊出現了顏值高的小姐姐ifrecognite_result:passelse:print('超時!!!這是一條沒有吸引力的視訊!')#跳出裡層迴圈break
一旦當前播放的視訊識別出有顏值高的小姐姐,就需要模擬儲存視訊到本地的操作。
獲取「分享」和「儲存本地」兩個按鈕的座標位置,依次利用 adb 執行點選操作即可下載視訊到本地。
defsave_video_met():""":return:"""#分享os.system("adbshellinputtap10001500")time.sleep(0.05)#儲存到本地os.system("adbshellinputtap3501700")
另外,由於下載視訊的過程是一個耗時操作,在下載進度對話方塊還未消失之前,需要做一個「模擬等待」的操作。
defwait_for_download_finished(poco):"""從點選下載,到下載完全:return:"""element=Element()whileTrue:#由於是對話方塊,不能利用Element類來判斷是否存在某個元素來準確處理#element_result=element.findElementByName('正在儲存到本地')#當前頁面UI樹元素資訊#注意:儲存的時候可能會獲取元素異常,這裡需要丟擲,並終止迴圈#com.netease.open.libpoco.sdk.exceptions.NodeHasBeenRemovedException:Nodewasnolongeralivewhenqueryattribute"visible".Pleasere-select.try:ui_tree_content=json.dumps(poco.agent.hierarchy.dump(),indent=4).encode('utf-8').decode('unicode_escape')exceptExceptionase:print(e)print('異常,按下載處理~')breakif'正在儲存到本地'inui_tree_content:print('還在下載中~')time.sleep(0.5)continueelse:print('下載完成~')break
在視訊儲存到本地之後,就可以模擬向上滑動的操作,跳到播放「下一條視訊」。
迴圈上面的操作,即可篩選出所有顏值高的小姐姐,並儲存到本地。
defplay_next_video():"""下一個視訊從下往上滑動:return:"""os.system("adbshellinputswipe5401300540500100")
在指令碼一條條刷視訊的過程中,可能會遇到一下廣告,我們需要對這類視訊進行過濾。
defis_a_ad():"""判斷的當前頁面上是否是一條廣告:return:"""element=Element()ad_tips=['去玩一下','去體驗','立即下載']find_result=Falseforad_tipinad_tips:try:element_result=element.findElementByName(ad_tip)#是一條廣告,直接跳出find_result=TruebreakexceptExceptionase:find_result=Falsereturnfind_result
4
結 果 結 論
執行上面的指令碼,會自動開啟抖音,對每一條小視訊多次進行人臉識別,直到識別到顏值高的小姐姐,儲存視訊到本地,然後繼續刷下一條短視訊。
最後:
以上詳細步驟希望可以給你在Python學習中帶來幫助~
資料視訊教程領取方式:
下面是北京大學畢業的高琪老師親手打造的python學習路線和視訊。共分為7大階段。
第一階段
python開發基礎和核心特性
1.變數及運算子
2.分支及迴圈
3.迴圈及字串
4.列表及巢狀列表
5.字典及專案練習
6.函式的使用
7.遞迴及檔案處理
8.檔案
9.面向物件
10.設計模式及異常處理
11.異常及模組的使用
12.坦克大戰
13.核心程式設計
14.高階特性
15.記憶體管理
第二階段
資料庫和linux基礎
1.併發程式設計
2.網路通訊
3.MySQL
4.Linux
5.正則表示式
第三階段
web前端開發基礎
1.html基本標籤
2.css樣式
3.css浮動和定位
4.js基礎
5.js物件和函式
6.js定時器和DOM
7.js事件響應
8.使用jquery
9.jquery動畫特效
10.Ajax非同步網路請求
第四階段
Python Web框架階段
1.Django-Git版本控制
2.Django-部落格專案
3.Django-商城專案
4.Django模型層
5.Django入門
6.Django模板層
7.Django檢視層
8.Tornado框架
第五階段
Python 爬蟲實戰開發
1.Python爬蟲基礎
2.Python爬蟲Scrapy框架
以上這python自學教程小編已經為大家打包準備好了,希望對正在學習的你有所幫助!