用python批量下載apk
案例故事:
之前我們做Android手機測試的時候,
市場部希望我們測試部進行Top 1000 app(排名前1000的app)的兼容性測試,
以確保我們的手機是可以安裝並正常運行這麼多好用的app,
且市場部提供瞭某應用市場上的top 1000 的apk下載地址。
如何實現快速批量地下載apk文件呢?
準備階段
以上excel裡的的url分明是需要進行二次重定向的,因為其不是一個.apk結尾的鏈接,
我們需要進行解析後再進行重定向。wget命令是不支持這url重定向解析的,所以不能采用。
所以我們還是采用requests模塊來實現下載。
Python批處理腳本形式 單線程的寫法
記住批處理腳本的精髓:批量順序執行語句,
由於批處理腳本形式隻能實現單個apk的下載任務,我們使用requests模塊實現下載。
單線程效率比較慢,必須等前一個apk下載完畢後,才會開始後一個apk的下載。
# coding=utf-8 import os import requests import openpyxl curdir = os.getcwd() # 獲取當前路徑current work directory header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36'} # 創建文件夾用於存放已經下載的apk if not os.path.exists("downloaded_apk"): os.system("mkdir downloaded_apk") # 逐行讀取excel裡的下載地址url excel = openpyxl.load_workbook('Top_1000_app.xlsx') # 讀取excel裡邊的內容 table = excel.active rows = table.max_row for r in range(2, rows + 1): # 跟excel的第一行標題行無關,從第二行文字內容開始 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) # 發起requests下載請求 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面向對象類形式 多線程下載的寫法
準備階段
多線程一般效率快很多很多,
多線程任務執行,一般是將apk下載任務放到Queue隊列裡去,先進先出,
然後隻要隊列不是空隊列,就從隊列裡邊取任務(q_job),並有10個線程同時進行,
相對來說,理解上會較難一些些,但是掌握後,可以快速提高下載效率。
#coding=utf-8 import os import queue import threading import requests import openpyxl curdir = os.getcwd() #獲取當前路徑current work directory header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36'} # 創建文件夾 if not os.path.exists("downloaded_apk"): os.system("mkdir downloaded_apk") def download_single_apk(apk_url_str): '''下載單個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) # 發起requests下載請求 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個線程都運行這個下載函數 else: break if __name__ == '__main__': # 初始化一個隊列 q = queue.Queue(0) # 逐行讀取excel裡的url excel = openpyxl.load_workbook('Top_1000_app.xlsx') # 讀取excel裡邊的內容 table = excel.active rows = table.max_row for r in range(2, rows + 1): # 跟excel的第一行標題行無關,從第二行文字內容開始做替換工作 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列表進隊列,隻能嘗試put字符串 q.put(temp_str) for i in range(10): # 開啟10個線程 DownLoadThread(q).start()
本案例素材下載
點我下載
運行方式與效果
比如保存以上代碼為download_1000apk.py並放在桌面,
建議python download_1000apk.py運行,當然也可以雙擊運行。
運行效果如下:
以上就是用python批量下載apk的詳細內容,更多關於python批量下載apk的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- python 使用openpyxl讀取excel數據
- Python 操作 Excel 之 openpyxl 模塊
- 詳解Python操作Excel之openpyxl
- Python openpyxl模塊學習之輕松玩轉Excel
- python 爬取知乎回答下的微信8.0狀態視頻