用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中的魔法方法深入理解
Jul 09 Python
python爬虫之BeautifulSoup 使用select方法详解
Oct 23 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
python opencv读mp4视频的实例
Dec 07 Python
Python并发:多线程与多进程的详解
Jan 24 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
Django REST framework 视图和路由详解
Jul 19 Python
python zip()函数使用方法解析
Oct 31 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
Python获取指定网段正在使用的IP
Dec 14 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 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/09 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
国外PHP程序员的13个好习惯小结
2012/02/20 PHP
mysql总结之explain
2012/02/27 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
JavaScript实现表格排序方法
2013/06/14 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
JavaScript使用canvas绘制随机验证码
2020/02/17 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python使用gensim计算文档相似性
2016/04/10 Python
浅谈python标准库--functools.partial
2019/03/13 Python
PyTorch中Tensor的拼接与拆分的实现
2019/08/18 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
Python之Sklearn使用入门教程
2021/02/19 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
英国女性时尚品牌:Apricot
2018/12/04 全球购物
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
幼儿园家长会欢迎词
2014/01/09 职场文书
实习生求职自荐信
2014/02/07 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
学校社团活动总结
2015/05/07 职场文书