用python批量下載apk
案例故事:
之前我們做Android手機測試的時候,
市場部希望我們測試部進行Top 1000 app(排名前1000的app)的兼容性測試,
以確保我們的手機是可以安裝并正常運行這么多好用的app,
且市場部提供了某應(yīng)用市場上的top 1000 的apk下載地址。

如何實現(xiàn)快速批量地下載apk文件呢?
準(zhǔn)備階段
以上excel里的的url分明是需要進行二次重定向的,因為其不是一個.apk結(jié)尾的鏈接,
我們需要進行解析后再進行重定向。wget命令是不支持這url重定向解析的,所以不能采用。
所以我們還是采用requests模塊來實現(xiàn)下載。
Python批處理腳本形式 單線程的寫法
記住批處理腳本的精髓:批量順序執(zhí)行語句,
由于批處理腳本形式只能實現(xiàn)單個apk的下載任務(wù),我們使用requests模塊實現(xiàn)下載。
單線程效率比較慢,必須等前一個apk下載完畢后,才會開始后一個apk的下載。
# coding=utf-8
import os
import requests
import openpyxl
curdir = os.getcwd() # 獲取當(dāng)前路徑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'}
# 創(chuàng)建文件夾用于存放已經(jīng)下載的apk
if not os.path.exists("downloaded_apk"):
os.system("mkdir downloaded_apk")
# 逐行讀取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)題行無關(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下載請求
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隊列里去,先進先出,
然后只要隊列不是空隊列,就從隊列里邊取任務(wù)(q_job),并有10個線程同時進行,
相對來說,理解上會較難一些些,但是掌握后,可以快速提高下載效率。
#coding=utf-8
import os
import queue
import threading
import requests
import openpyxl
curdir = os.getcwd() #獲取當(dāng)前路徑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'}
# 創(chuàng)建文件夾
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) # 發(fā)起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個線程都運行這個下載函數(shù)
else:
break
if __name__ == '__main__':
# 初始化一個隊列
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)題行無關(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列表進隊列,只能嘗試put字符串
q.put(temp_str)
for i in range(10): # 開啟10個線程
DownLoadThread(q).start()
本案例素材下載
運行方式與效果
比如保存以上代碼為download_1000apk.py并放在桌面,
建議python download_1000apk.py運行,當(dāng)然也可以雙擊運行。
運行效果如下:

以上就是用python批量下載apk的詳細內(nèi)容,更多關(guān)于python批量下載apk的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python自定義函數(shù)def的應(yīng)用詳解
這篇文章主要介紹了python自定義函數(shù)def的應(yīng)用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
如何解決import torchvision報錯問題 DLL:找不到模塊
這篇文章主要介紹了如何解決import torchvision報錯問題 DLL:找不到模塊,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
pandas中Series運算匯總(算術(shù)、比較和邏輯運算)
本文主要介紹了pandas中Series運算匯總,包括算術(shù)運算、比較運算和邏輯運算等,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解
今天小編就為大家分享一篇關(guān)于Python2和Python3之間的str處理方式導(dǎo)致亂碼的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01
Jmeter并發(fā)執(zhí)行Python 腳本的完整流程
這篇文章主要介紹了Jmeter并發(fā)執(zhí)行 Python 腳本的問題詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09

