python脚本系列——批量下载清华开源依赖包

news2025/1/11 5:54:20

一、脚本展示

        1.流水线编译过程,执行apk --update add --no-cache xxx

        2.报错ERROR: xxx package mentioned in index not found (try 'apk update')

        3.内网环境缺依赖包,需要从清华源下载对应的包,但是需要根据报错一个个找,一个个点击下载麻烦

        4.一开始打算下载官网全部依赖,但是数量太大,而且频繁拉取容易反爬,改为根据报错信息存放到E:\download\check.txt,程序自动识别包名下载到对应目录

import urllib.request  # url request
import re  # regular expression
import os  # dirs
import time

'''
url 下载网址
pattern 正则化的匹配关键词
Directory 下载目录
'''

'''
1.流水线编译过程,执行apk --update add --no-cache xxx
2.报错ERROR: xxx package mentioned in index not found (try 'apk update')
3.内网环境缺依赖包,需要从清华源下载对应的包,但是需要根据报错一个个找,一个个点击下载麻烦
4.一开始打算下载官网全部依赖,但是数量太大,而且频繁拉取容易反爬,改为根据报错信息存放到E:\download\check.txt,程序自动识别包名下载到对应目录
'''

def BatchDownload(url, pattern, Directory):
    # 拉动请求,模拟成浏览器去访问网站->跳过反爬虫机制
    headers = {'User-Agent',
               'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]

    # 官网下载打开注释,获取网页内容
    # content = opener.open(url).read().decode('utf8')

    # 根据报错内容直接查询,官网下载注释
    with open("E:\download\check.txt", "r") as f:  # 打开文件
        content = f.readlines()  # 读取文件
        content = str(content)  # 转化为str方便正则匹配
        content = content.replace(': ', '')  # 利用两头字符串卡住关键词


    # 构造正则表达式,从content中匹配关键词pattern
    raw_hrefs = re.findall(pattern, content, 0)

    # 官网下载打开注释,set函数消除重复元素
    # list方便遍历,set去重,看情况选择
    # hset = list(raw_hrefs)

    # 创建本地文件夹存放依赖包,看情况选择
    dir_name = 'E:\download\main'
    if not os.path.isdir(dir_name):
        os.makedirs(dir_name)
    dir_name2 = 'E:\download\community'
    if not os.path.isdir(dir_name2):
        os.makedirs(dir_name2)


    # 下载链接
    for href in raw_hrefs:
        # 之所以if else 是为了区别只有一个链接的特别情况
        if (len(raw_hrefs) > 1):
            # realhref = href.replace('href="', '')  # 官网直接拉才有href字段
            realhref = href.replace('ERROR', '').replace('package', '')

            # main
            link = url + realhref + '.apk'
            filename = os.path.join(Directory, realhref + '.apk')

            # community
            url2 = "http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/community/aarch64/"
            link2 = url2 + realhref + '.apk'
            Directory2 = 'E:\download\community'
            filename2 = os.path.join(Directory2, realhref + '.apk')

            # 因为依赖包下载地址不唯一,找不到依赖尝试其他地址
            try:
                print("正在下载", filename + '.apk')
                urllib.request.urlretrieve(link, filename)
            except IOError:
                print("main无包,尝试community目录", filename2 + '.apk')
                urllib.request.urlretrieve(link2, filename2)
                print("community/" + realhref + ".apk" + "   OK!")
            else:
                print("main/" + realhref + ".apk" + "   OK!")
        else:
            link = url + href
            filename = os.path.join(Directory, href)
            print("正在下载", filename + '.apk')
            urllib.request.urlretrieve(link, filename)
            print("成功下载!")

        # 无sleep间隔,网站认定这种行为是攻击,反反爬虫
        time.sleep(1)


# 官网直接下载全部依赖
# BatchDownload('https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/community/aarch64/',r'\bhref\S*?.apk\b','E:\download')
# 根据缺包提示下载对应的依赖
BatchDownload('http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.14/main/aarch64/', r'\bERROR\S*?package\b', 'E:\download\main')

二、报错信息展示

        支持将缺少依赖的报错信息存放到E:\download\check.txt,脚本会根据正则自动匹配包名(类似skopeo-1.3.1-r2.apk)下载到对应目录E:\download\xxx\

三、执行结果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计教学辅助系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

1558_AURIX_TC275_RCU模块中的ESR管脚

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) CPU的安全状态,如果有bit为0说明SRAM等内容可能是不可靠的。 1. ESR的管脚是可以实现对外输出复位提示信息功能的。 2. ESR管脚的几种用法:作为输入触发复位、作为…

双重预防体系智能管理系统助力集团施工企业落实双重预防机制建设

安全警钟长鸣,为何事故仍不时发生?说明“安全网”织得不够密。当前我国建筑施工安全生产方面存在诸多薄弱环节和突出问题,强化安全生产主体责任落实,全面构建安全风险分级管控和隐患排查治理双重预防工作机制,坚决防范和遏制较大…

如何应对项目上线前出现Bug?

当你在测试阶段最后两天,发现测试执行情况不理想,和预估的进度相差较大时,是否会焦虑到不知所措?当你在上线前发现一个严重的问题,修复后需要重新执行一些验证测试及增加回归测试,此时你是否会惊慌&#xf…

使用nvm管理(切换)node版本

使用nvm切换node版本1. 完全删除之前的node及npm(清理干净Node: 应用程序,缓存的文件,环境变量 )2. 使用管理员身份安装nvm,下载如下3. 安装完nvm之后找到nvm下载路径对应的文件4. 使用管理员身份打开cmd,n…

β-葡聚糖偶联超顺磁纳米氧化铁颗粒|紫杉醇-二十二碳六烯酸—右旋糖酐偶联物

β-葡聚糖偶联超顺磁纳米氧化铁颗粒 中文名称:β-葡聚糖偶联超顺磁纳米氧化铁颗粒 纯度:95% 存储条件:-20C,避光,避湿 外观:固体或粘性液体 包装:瓶装/袋装 溶解性:溶于大部分有机溶剂&am…

Jenkins集成appium自动化测试(Windows篇)

目录:导读 一,引入问题 二,搭建思路 三,具体步骤 1,搭建Jenkins 2,新建节点 3,配置节点 4,启动代理 5,新建任务 6,配置任务 7,调试 四…

谁说菜鸟不会数据分析 | 学习笔记

一.前言 数据分析是为了提取有用信息和形成结论而对数据加以详细研究和概括总结的过程 数据分析的目的是把隐藏在一大批看似杂乱无章的数据背后的信息集中和提炼出来,总结出所研究对象的内在规律。在实际工作中,数据分析能够帮助管理者进行判断和决策&…

WebDAV之葫芦儿•派盘+麻雀记

麻雀记 支持WebDAV方式连接葫芦儿派盘。 想要一款非常小巧的笔记软件?占用设备内存小,功能非常丰富。比如写便签、清单、图片、倒数日、名片、纪念日、心情、绘图、地址、等等,并且你还可以使用看板、标签以及四象限等功能来帮助你更好地将所写内容归纳整理,快来体验下麻…

不删除分区的情况下怎么合并分区?如何合并磁盘分区

不删除分区的情况下怎么合并分区??本文将向您展示使用 Diskpart 命令和分区管理工具合并磁盘分区的可靠解决方案。请继续阅读,以获得合并磁盘分区的相关信息。 一、合并磁盘分区 也许你的磁盘上,有一个空间很大的分区&#xff0c…

ctfshow 大吉大利杯

veryphp 看着思路很简单&#xff0c;就是利用post传参和extract函数来给需要的参数赋值&#xff0c;再利用call_user_func调用qwq中的oao静态方法。 感觉最麻烦的就是 preg_match(/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\R(s|r).$/, $shaw_root)这个…

JavaScript进阶教程——包装对象、类型转换、作用域、闭包与模块化

文章目录包装对象类型转换显示转换隐式转换作用域let与const的用法&#xff1a;作用域链闭包与模块化封装包装对象 为什么原始类型可以使用方法和属性&#xff1a; toString()split()length属性 包装对象&#xff1a; new String()new Number()new Boolean() let num 123;…

Linux内存管理之UMA模型和NUMA模型

共享存储型多处理机有两种模型 均匀存储器存取&#xff08;Uniform-Memory-Access&#xff0c;简称UMA&#xff09;模型 (一致存储器访问结构) 非均匀存储器存取&#xff08;Nonuniform-Memory-Access&#xff0c;简称NUMA&#xff09;模型 (非一致存…

大学生阅读小说网页设计模板代码 柏书旧书网带登录表单 注册表单小说书籍网页作业成品 学校书籍网页制作模板 学生简单书籍阅读网站设计成品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

python Graphillion简介

Graphillion是一个用于高效图集操作的Python库。与NetworkX等现有的图形工具不同&#xff0c;Graphillion被设计为一次只处理一个图形&#xff0c;而Graphillion则非常有效地处理一个大型的图形集。令人惊讶的是&#xff0c;使用Graphillion可以在一台计算机上处理数万亿的图形…

SQL注入漏洞 | sleep型

文章目录前言MySQL sleep型测试数据库名长度数据库名表名列名字段值总脚本文件前言 SQL注入漏洞 | bool型 if(SQL语句,sleep(),null) if()、sleep()的使用 select * from table where id1 and sleep(2) //执行查询id1&#xff0c;同时sleep(2)。浏览器显示数据库返回的结果…

MyBatis Mapper四步走

1. 定义承载结果的Java类充当领域对象&#xff08;不使用MyBatis的内置map&#xff09;。 2.开发Mapper组件&#xff0c;也就是接口XML&#xff08;或注解&#xff09; 3.获取SqlSession&#xff0c;在获取Mapper组件对象。 4.调用Mapper组件的方法操作数据库。 ----------…

CSDN客诉周报第13期|修复3个重大bug,解决10个次要bug,采纳1个用户建议

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉周报》第13期&#xff0c;接下来就请大家一同回顾我们最近几周解决的bug&#xff5e; 一、重大问题 1、【数据中台】搜索功能失效&#xff0c;无法搜出内容 反馈量&#xff1a;300 …

Linux下的进程类别(内核线程、轻量级进程和用户进程)以及其创建方式

【推荐阅读】 需要多久才能看完linux内核源码&#xff1f; 手把手教你如何编写一个Makefile文件 了解ixgbe网卡驱动— 驱动注册&#xff08;纯代码分享&#xff09; 关于如何快速学好&#xff0c;学懂Linux内核。内含学习路线 Linux内核CPU调度域内容讲解 Linux进程类别 虽然我…

图像处理之《基于生成对抗网络和梯度下降逼近的鲁棒无覆盖隐写术》论文精读

一、相关知识 1、图像隐写术分类 本文对图像隐写术又做了新的分类&#xff0c;可以分为传统图像隐写术、无载体图像隐写术和基于深度学习的图像隐写术。 本文又将基于深度学习的图像隐写术又分为四种&#xff1a;基于嵌入的方法(即将传统的隐写术如LSB与生成模型相结合&…