<font id="nc9yk"></font>
  • <tt id="nc9yk"></tt>
          <rp id="nc9yk"><optgroup id="nc9yk"></optgroup></rp>
          <tt id="nc9yk"><form id="nc9yk"></form></tt>

            <cite id="nc9yk"></cite>

            用python批量下載apk

             更新時間:2020年12月29日 10:48:25   作者:武散人  
            這篇文章主要介紹了用python批量下載apk的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

            案例故事:

            之前我們做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的資料請關注腳本之家其它相關文章!

            相關文章

            最新評論

            hao500彩票 www.mfggn.com:宁国市| www.maranathawichita.com:安义县| www.gaobaoit.com:江陵县| www.whzxfw.com:米脂县| www.15221109153ks.com:牙克石市| www.dlm-music.com:澄城县| www.continue1.com:喀什市| www.tjdqlmc8.com:清水县| www.labodaderafaypaula.com:基隆市| www.ctspecialistsllc.com:合肥市| www.jm88dz.com:云和县| www.christarobillard.com:克拉玛依市| www.ccnaexamstudy.com:文登市| www.ptlpw.cn:邢台市| www.w-wha.org:宜良县| www.znfyw.cn:靖安县| www.geoeconomic.com:乌恰县| www.jnshengping.com:兴和县| www.firewateroside.com:那曲县| www.4sqsu.com:崇明县| www.alida-hisku.net:纳雍县| www.fengfa-china.com:曲周县| www.thevargasgroup.net:洪湖市| www.yihengart.com:益阳市| www.dannyquattro.com:卓尼县| www.jslhmm.com:靖远县| www.modasaatler.com:河北区| www.universaltradekey.com:仁寿县| www.globtacs.com:洛川县| www.songzhixiang.com:中江县| www.georgiadebtrelief.net:伊金霍洛旗| www.karimjavadi.com:临江市| www.650807.com:乌鲁木齐县| www.gratefulsparrow.com:石屏县| www.xinya-painting.com:沂源县| www.v7h6.com:台前县| www.fmciudad9070.com:赣州市| www.bromoijenvacation.com:呼图壁县| www.3654388.com:平和县| www.bihanorantiqha.com:临高县| www.xingfu52.com:吉林市| www.vsassociatesbiz.com:金沙县| www.besttech-jy.com:噶尔县| www.zhouluopiaoliu.com:平阴县| www.devrealem.com:金山区| www.socllink.com:鄯善县| www.biganimaimovies.com:扶风县| www.teknikellermakina.com:库尔勒市| www.classes2go.com:永仁县| www.gw066.com:安阳市| www.cs98ktv.com:荆门市| www.mfdgn.com:乌审旗| www.ntchub.com:壶关县| www.maitmall.com:英吉沙县| www.9e-9e.com:鄂伦春自治旗| www.xuiacona.com:岳池县| www.sandersfieldtrees.org:凤凰县| www.sacnakil.com:林芝县| www.kebumenkeren.com:新闻| www.shareuams.com:武强县| www.hanselapp.com:商城县| www.yyyuanyi.com:玛纳斯县| www.beihaihurong56.com:光泽县| www.hkajwx.com:舒城县| www.nc633.com:惠东县| www.starolympus.com:武定县| www.sillasdecomedor.org:凤冈县| www.apachasdesign.com:嘉禾县| www.w-b-z.com:黎城县| www.arcondb.com:武山县| www.axshiye.com:武功县| www.hg39799.com:石棉县| www.180xu.com:肇州县| www.bromoijenvacation.com:湖口县| www.gvionlinetraining.com:读书| www.yiqitt.com:运城市| www.alemdagemlakkonut.com:绥阳县| www.thevirginiainformer.com:平舆县| www.uzunmusa.com:东方市| www.parcfrankston.com:清河县| www.le-bon-debarras.com:河南省| www.biaogantiyu.com:南宫市| www.gxsgx.com:昌黎县| www.saltatoria.com:中宁县|