1. 程式人生 > 程式設計 >用python批量下載apk

用python批量下載apk

案例故事:

之前我們做Android手機測試的時候,

市場部希望我們測試部進行Top 1000 app(排名前1000的app)的相容性測試,
以確保我們的手機是可以安裝並正常執行這麼多好用的app,
且市場部提供了某應用市場上的top 1000 的apk下載地址。

用python批量下載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,"%s.apk" % apk_name)
 if not os.path.exists(save_path): # 避免二次下載
  print("Downloading %s" % (save_path))
  try:
   r = requests.get(apk_url,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的詳細內容,更多關於python批量下載apk的資料請關注我們其它相關文章!