用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实现获取某天是某个月中的第几周
Feb 11 Python
收藏整理的一些Python常用方法和技巧
May 18 Python
详解Python编程中包的概念与管理
Oct 16 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
Python单元测试简单示例
Jul 03 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
使用Python创建简单的HTTP服务器的方法步骤
Apr 26 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
解决pycharm安装第三方库失败的问题
May 09 Python
OpenCV+python实现实时目标检测功能
Jun 24 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
PHP与SQL注入攻击[三]
2007/04/17 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
利用a标签自动解析URL分析网址实例
2014/10/20 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
2016/05/30 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
python中的lambda表达式用法详解
2016/06/22 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
利用python-pypcap抓取带VLAN标签的数据包方法
2019/07/23 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
Keras实现DenseNet结构操作
2020/07/06 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
如何处理简单的PHP错误
2015/10/14 面试题
班级聚会策划书
2014/01/16 职场文书
正风肃纪剖析材料
2014/02/18 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js