<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.zcfpw.cn:普格县| www.hg20345.com:河津市| www.jiphoton-inc.com:贵德县| www.bunnykitten.com:讷河市| www.n7989.com:平遥县| www.inretrospectweb.com:河间市| www.mfhhl.com:成都市| www.youjiataoci.com:集贤县| www.dllzjt.com:道孚县| www.aasmg.com:巴林左旗| www.pengxing18.com:永宁县| www.gibraltarrocktours.com:金堂县| www.postcanal.com:缙云县| www.lavicardesigne.com:大埔县| www.iamreviewing.com:鲜城| www.texastroop424.org:新巴尔虎右旗| www.jybncm.com:沽源县| www.cirugiatop.com:芷江| www.zrh6.com:丹寨县| www.fo-sante.com:易门县| www.loucolagiovanni.com:乌兰县| www.s6lt.com:禹州市| www.tudakozoonline.com:衡东县| www.sillasdecomedor.org:天台县| www.913820.com:永宁县| www.40photography.com:夏河县| www.youjiataoci.com:兰考县| www.elipalteco.com:莫力| www.qdsej.com:安溪县| www.asiannet21.org:神木县| www.whoneedsaneditor.com:东兰县| www.apjiahaisw.com:东辽县| www.zheduowang.com:邵东县| www.ossean.com:华宁县| www.15221109153ks.com:普洱| www.nicolasbessol.com:通山县| www.daogout.com:天全县| www.51pag.com:重庆市| www.in2demo.com:房产| www.sunmesjournals.com:左权县| www.blackindianmusic.com:林西县| www.listensoulution.com:横峰县| www.316gm.com:塘沽区| www.qn556.com:聂荣县| www.n3969.com:沂南县| www.z3858.com:三都| www.ltbzz.com:宁化县| www.798666v.com:德惠市| www.ng335.com:勐海县| www.r7586.com:淮阳县| www.leadpcba.com:平利县| www.yjxsfz.com:长治市| www.procarpetcleaningservices.com:娱乐| www.guitartrick.net:湘乡市| www.pasion4x4rosario.com:富平县| www.uflytech.com:富蕴县| www.relationshipbreakp.com:义马市| www.ptlpw.cn:濮阳县| www.hg72456.com:衡阳县| www.onemiletrade.com:中江县| www.vsassociatesbiz.com:长顺县| www.whatsnewbondi.com:宜良县| www.xmkainos.com:文登市| www.hg51456.com:古田县| www.mmm522.com:丹寨县| www.whoneedsaneditor.com:曲松县| www.vgsscandinaviansig.org:屯昌县| www.eradio66.com:浦县| www.figure-king.com:津市市| www.fotoprincipediano.com:滦南县| www.carrington-place.com:曲松县| www.jamesstephenshurling.com:商水县| www.gd5156.com:五家渠市| www.xinya-painting.com:沙田区| www.izhuoji.net:博湖县| www.sh61554342.com:公安县| www.warnarumah.net:开远市| www.ksbafang.com:山丹县| www.g3553.com:长丰县| www.chasse-becasse-quebec-canada.com:景谷| www.qyjmgg.com:琼中| www.newoxfordbotanical.com:晋城| www.cp5776.com:盐源县| www.jydproducts.com:汤阴县|