用python批量下载apk


Posted in Python onDecember 29, 2020

案例故事:

之前我们做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, "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的详细内容,更多关于python批量下载apk的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python正则表达式教程之二:捕获篇
Mar 02 Python
Win8下python3.5.1安装教程
Jul 29 Python
python实现手机销售管理系统
Mar 19 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
python爬虫 爬取超清壁纸代码实例
Aug 16 Python
python 3.6.7实现端口扫描器
Sep 04 Python
使用python动态生成波形曲线的实现
Dec 04 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
python如何调用php文件中的函数详解
Dec 29 #Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 #Python
pycharm如何设置官方中文(如何汉化)
Dec 29 #Python
详解Pycharm第三方库的安装及使用方法
Dec 29 #Python
Django2.1.7 查询数据返回json格式的实现
Dec 29 #Python
Python 获取异常(Exception)信息的几种方法
Dec 29 #Python
python 将html转换为pdf的几种方法
Dec 29 #Python
You might like
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
2014/04/08 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
JS判断一个数是否是水仙花数
2017/06/11 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
js定义类的方法示例【ES5与ES6】
2019/07/30 Javascript
vue实现拖拽效果
2019/12/23 Javascript
javascript实现留言板功能
2020/02/08 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
Pandas标记删除重复记录的方法
2018/04/08 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
Python os库常用操作代码汇总
2020/11/03 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
网络事业创业计划书范文
2014/01/09 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
聘用意向书
2014/07/29 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
纪律教育月活动总结
2014/08/26 职场文书
工作检讨书500字
2014/10/19 职场文书
项目转让协议书
2014/10/27 职场文书
医院见习报告范文
2014/11/03 职场文书
个人求职意向书
2015/05/11 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
python编写函数注意事项总结
2021/03/29 Python
Python连续赋值需要注意的一些问题
2021/06/03 Python