《自拍教程54》Python 批量下載1000個apk(附練手素材)

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

如何實現快速批量地下載apk文件呢?


準備階段
  1. wget命令,requests模塊,urllib模塊等都可以進行文件的下載
  2. 以上excel裏的的url分明是需要進行二次重定向的,因爲其不是一個.apk結尾的鏈接,我們需要進行解析後再進行重定向。
  3. wget是不支持這類解析的,所以不能採用,wget由於是命令,比較侷限,無法進行二次編程,所以我們還是採用requests模塊來實現下載。
  4. 重點是如何實現快速下載,需要運用多線程技術。
  5. 多線程一般用Queen隊列, 隊列先進先出,如果隊列裏還有數據,則一直按指定的線程數(比如10個線程)進行run。

Python批處理腳本形式—單線程的寫法

記住批處理腳本的精髓:批量順序執行語句,
由於批處理腳本形式只能實現單個apk的下載任務,我們使用requests模塊實現下載。

# 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面向對象類形式—多線程下載的寫法

多線程相對來說,理解上會較難一些些,
一般是將任務放到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運行,當然也可以雙擊運行。
運行效果如下:


更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測試Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=32fc6017b5e14784a862c95367967ebd
也可關注“武散人”微信訂閱號,隨時接受文章推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章