用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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
Python中的闭包总结
Sep 18 Python
Python中方法链的使用方法
Feb 23 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
python读写json文件的简单实现
Apr 11 Python
Python将多份excel表格整理成一份表格
Jan 03 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python实现端口检测的方法
Jul 24 Python
python画图的函数用法以及技巧
Jun 28 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
python DataFrame转dict字典过程详解
Dec 26 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 数据结构 算法 三元组 Triplet
2011/07/02 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
在Django框架中编写Context处理器的方法
2015/07/20 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python列表的切片实例讲解
2019/08/20 Python
pycharm修改file type方式
2019/11/19 Python
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
经济学博士求职自荐信范文
2013/11/23 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
参观接待方案
2014/03/17 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
防汛工作情况汇报
2014/10/28 职场文书
巴黎圣母院读书笔记
2015/06/26 职场文书
爱护公物主题班会
2015/08/17 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书