用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二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
Python 字符串池化的前提
Jul 03 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
Nov 06 Python
python 用struct模块解决黏包问题
Nov 07 Python
scrapy处理python爬虫调度详解
Nov 23 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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 日期时间函数的高级应用技巧
2009/10/10 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
JS快速实现移动端拼图游戏
2016/09/05 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
python动态监控日志内容的示例
2014/02/16 Python
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
详解python itertools功能
2020/02/07 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
Python2.6版本pip安装步骤解析
2020/08/17 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
师范大学音乐表演专业求职信
2013/10/23 职场文书
工程部经理岗位职责
2013/12/08 职场文书
班主任新年寄语
2014/04/04 职场文书
2019最新公司租房合同(例文)
2019/07/18 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python