用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中使用异步Socket编程性能测试
Jun 25 Python
python用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python提取网页中超链接的方法
Sep 18 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
python二维键值数组生成转json的例子
Dec 06 Python
Python生成器常见问题及解决方案
Mar 21 Python
Python爬虫爬取百度搜索内容代码实例
Jun 05 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
python中slice参数过长的处理方法及实例
Dec 15 Python
Python中for后接else的语法使用
May 18 Python
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 Python
Python 多线程处理任务实例
Nov 07 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实现获取某个月份周次信息的方法
2015/08/11 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
$.ajax json数据传递方法
2008/11/19 Javascript
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
javascript利用控件对windows的操作实现原理与应用
2012/12/23 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
Node学习记录之cluster模块
2017/05/31 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
vue页面离开后执行函数的实例
2018/03/13 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python编码时应该注意的几个情况
2013/03/04 Python
python网页请求urllib2模块简单封装代码
2014/02/07 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
详解python多线程之间的同步(一)
2019/04/03 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
详解python内置模块urllib
2020/09/09 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
教育专业自荐书范文
2013/12/17 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
美术教师自我鉴定
2014/02/12 职场文书
2014年基层党组织公开承诺书
2014/03/29 职场文书
全运会口号
2014/06/20 职场文书
公司宣传语大全
2015/07/13 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers