用python批量下載apk
之前我們做Android手機(jī)測(cè)試的時(shí)候,
市場(chǎng)部希望我們測(cè)試部進(jìn)行Top 1000 app(排名前1000的app)的兼容性測(cè)試,以確保我們的手機(jī)是可以安裝并正常運(yùn)行這么多好用的app,且市場(chǎng)部提供了某應(yīng)用市場(chǎng)上的top 1000 的apk下載地址。
如何實(shí)現(xiàn)快速批量地下載apk文件呢?
準(zhǔn)備階段以上excel里的的url分明是需要進(jìn)行二次重定向的,因?yàn)槠洳皇且粋€(gè).apk結(jié)尾的鏈接,我們需要進(jìn)行解析后再進(jìn)行重定向。wget命令是不支持這url重定向解析的,所以不能采用。所以我們還是采用requests模塊來實(shí)現(xiàn)下載。
Python批處理腳本形式 單線程的寫法記住批處理腳本的精髓:批量順序執(zhí)行語(yǔ)句,由于批處理腳本形式只能實(shí)現(xiàn)單個(gè)apk的下載任務(wù),我們使用requests模塊實(shí)現(xiàn)下載。單線程效率比較慢,必須等前一個(gè)apk下載完畢后,才會(huì)開始后一個(gè)apk的下載。
# coding=utf-8import osimport requestsimport openpyxlcurdir = os.getcwd() # 獲取當(dāng)前路徑current work directoryheader = { ’User-Agent’: ’Mozilla/5.0 (Windows NT 6.1 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36’}# 創(chuàng)建文件夾用于存放已經(jīng)下載的apkif not os.path.exists('downloaded_apk'): os.system('mkdir downloaded_apk')# 逐行讀取excel里的下載地址urlexcel = openpyxl.load_workbook(’Top_1000_app.xlsx’) # 讀取excel里邊的內(nèi)容table = excel.activerows = table.max_rowfor r in range(2, rows + 1): # 跟excel的第一行標(biāo)題行無(wú)關(guān),從第二行文字內(nèi)容開始 apk_name = table.cell(row=r, column=2).value # 獲取app名字(中文) apk_url = table.cell(row=r, column=3).value # 獲取下載地址 save_path = os.path.join(curdir, 'downloaded_apk', '%s.apk' % apk_name) if not os.path.exists(save_path): # 避免二次下載 print('Downloading the %sth apk and will save to %s' % (r, save_path)) try: r = requests.get(apk_url, headers=header, allow_redirects=True, timeout=720) # 發(fā)起requests下載請(qǐng)求 status_code = r.status_code if (status_code == 200 or status_code == 206): with open(save_path, 'wb') as hf: hf.write(r.content) except: print('Error, can not download %s.apk' % apk_name) else: print('%s downloaded already!' % save_path)os.system('pause')Python面向?qū)ο箢愋问?多線程下載的寫法
準(zhǔn)備階段
多線程一般效率快很多很多,多線程任務(wù)執(zhí)行,一般是將apk下載任務(wù)放到Queue隊(duì)列里去,先進(jìn)先出,然后只要隊(duì)列不是空隊(duì)列,就從隊(duì)列里邊取任務(wù)(q_job),并有10個(gè)線程同時(shí)進(jìn)行,相對(duì)來說,理解上會(huì)較難一些些,但是掌握后,可以快速提高下載效率。
#coding=utf-8import osimport queueimport threadingimport requestsimport openpyxlcurdir = os.getcwd() #獲取當(dāng)前路徑current work directoryheader = {’User-Agent’: ’Mozilla/5.0 (Windows NT 6.1 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36’}# 創(chuàng)建文件夾if not os.path.exists('downloaded_apk'): os.system('mkdir downloaded_apk')def download_single_apk(apk_url_str): ’’’下載單個(gè)apk文件’’’ apk_name, apk_url = apk_url_str.split(';') # print(apk_url) save_path = os.path.join(curdir, 'downloaded_apk', '%s.apk' % apk_name) if not os.path.exists(save_path): # 避免二次下載 print('Downloading %s' % (save_path)) try: r = requests.get(apk_url, headers=header, allow_redirects=True, timeout=720) # 發(fā)起requests下載請(qǐng)求 status_code = r.status_code if (status_code == 200 or status_code == 206): with open(save_path, 'wb') as hf: hf.write(r.content) except: print('Error, can not download %s.apk' % apk_name) else: print('%s downloaded already!' % save_path)# 批量下載的線程class DownLoadThread(threading.Thread): def __init__(self, q_job): self._q_job = q_job threading.Thread.__init__(self) def run(self): while True: if self._q_job.qsize() > 0: download_single_apk(self._q_job.get()) # 這是10個(gè)線程都運(yùn)行這個(gè)下載函數(shù) else: breakif __name__ == ’__main__’: # 初始化一個(gè)隊(duì)列 q = queue.Queue(0) # 逐行讀取excel里的url excel = openpyxl.load_workbook(’Top_1000_app.xlsx’) # 讀取excel里邊的內(nèi)容 table = excel.active rows = table.max_row for r in range(2, rows + 1): # 跟excel的第一行標(biāo)題行無(wú)關(guān),從第二行文字內(nèi)容開始做替換工作 apk_name = table.cell(row=r, column=2).value # 獲取app名字(中文) apk_url = table.cell(row=r, column=3).value # 獲取下載地址 temp_str = apk_name + ';' + apk_url # 不可以put列表進(jìn)隊(duì)列,只能嘗試put字符串 q.put(temp_str) for i in range(10): # 開啟10個(gè)線程 DownLoadThread(q).start()本案例素材下載
點(diǎn)我下載
運(yùn)行方式與效果比如保存以上代碼為download_1000apk.py并放在桌面,建議python download_1000apk.py運(yùn)行,當(dāng)然也可以雙擊運(yùn)行。運(yùn)行效果如下:
以上就是用python批量下載apk的詳細(xì)內(nèi)容,更多關(guān)于python批量下載apk的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 解析原生JS getComputedStyle2. jsp EL表達(dá)式詳解3. xpath簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理4. jsp cookie+session實(shí)現(xiàn)簡(jiǎn)易自動(dòng)登錄5. jsp實(shí)現(xiàn)登錄驗(yàn)證的過濾器6. css代碼優(yōu)化的12個(gè)技巧7. jsp+servlet簡(jiǎn)單實(shí)現(xiàn)上傳文件功能(保存目錄改進(jìn))8. msxml3.dll 錯(cuò)誤 800c0019 系統(tǒng)錯(cuò)誤:-2146697191解決方法9. .NET SkiaSharp 生成二維碼驗(yàn)證碼及指定區(qū)域截取方法實(shí)現(xiàn)10. phpstudy apache開啟ssi使用詳解
