用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获取DLL和EXE文件版本号的方法
Mar 10 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
Python List列表对象内置方法实例详解
Oct 22 Python
Python搭建代理IP池实现存储IP的方法
Oct 27 Python
jupyter 实现notebook中显示完整的行和列
Apr 09 Python
Python暴力破解Mysql数据的示例
Nov 09 Python
Python Pygame实现俄罗斯方块
Feb 19 Python
Python中字符串对象语法分享
Feb 24 Python
Python requests用法和django后台处理详解
Mar 19 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
模拟xcopy的函数
2006/10/09 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
2014/11/05 PHP
php的curl封装类用法实例
2014/11/07 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
js匿名函数使用&传参(实例)
2017/09/08 Javascript
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
python抓取百度首页的方法
2015/05/19 Python
Python3 模块、包调用&路径详解
2017/10/25 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
精细化工应届生求职信
2013/11/17 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
给下属加薪申请报告
2015/05/15 职场文书
妈妈别哭观后感
2015/06/08 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
python爬取豆瓣电影TOP250数据
2021/05/23 Python
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技