python批量下载apache文件服务器文件

news2025/2/22 14:24:24

此脚本用于下载apache文件服务器中制定某个文件夹下所有文件与文件夹。

包含下载单个文件的方法、拼接url递归下载的方法、参数解析。

1 下载文件

功能点:

  1. 文件下载
    以追加写的方式打开一个新文件,按照块大小写入文件
 with open(filepath, 'wb') as file:  # 显示进度条
    for data in response.iter_content(chunk_size=1024):
        file.write(data)
  1. 文件大小
content_size = int(response.headers['content-length'])
  1. 下载计时
    这个简单,不做概述。
  2. 下载进度
    转义符\r代表回车,也就是打印头归位,(光标)回到当前行的开头。
    那么打印进度时,在前面加上该转义符,进度条则会覆盖住当前打印行,即可实现进度条刷新
print('\r'+"进度条:>>>")
print('\r'+"进度条:>>>>>")
print('\r'+"进度条:>>>")

image.png

2 下载链接

功能点:正则获取html中文件链接、拼接各级路径
由于apache文件服务器页面以html输出,且各文件、文件夹链接地址为相对地址,所以在解析html文件后,仍需对链接进行拼接。
image.png
根据网页结构,目录的链接以/结束,则可以此为判断依据。

  1. 获取链接
response = requests.get(root_url).text
urls = re.findall(r'<td><a href="(.*?)">', response, re.S | re.M)
  1. 拼接
# 判断链接不是目录,是文件则调用下载方法,root_url是当前请求路径,url是文件名
if not url.endswith('/'):
    tm += download_file(root_url+url, download_dir+url)
    continue # 跳过当前循环
# 至此,url只能是目录
# root_url拼接下一级目录url,递归调用当前获取url的方法

3 参数读取

模仿终端中大部分命令的执行方式,以--参数名=参数值的方法进行参数的传递。
思路: 构建参数字典,将参数以等号分割,去除左边的短横,根据参数名调用字典key,将参数值赋值到value。


查看完整代码

import requests, re, time, os, sys

def download_file(url, filepath):
    start = time.time()  # 下载开始时间
    response = requests.get(url, stream=True)  # stream=True必须写上
    size = 0  # 初始化已下载大小
    chunk_size = 1024  # 每次下载的数据大小
    content_size = int(response.headers['content-length'])  # 下载文件总大小
    try:
        if response.status_code == 200:  # 判断是否响应成功
            print('Downloading {file}, [File size]:{size:.2f} MB'.format(
                file=filepath,
                size=content_size / chunk_size / 1024))  # 开始下载,显示下载文件大小
            with open(filepath, 'wb') as file:  # 显示进度条
                for data in response.iter_content(chunk_size=chunk_size):
                    file.write(data)
                    size += len(data)
                    st = '>' * int(size * 50 / content_size)
                    if size == 0:
                        st = '>' * 50
                    print('\r' + '[下载进度]:%s%.2f%%' % (
                        st.ljust(50, " "), 
                        float(size / content_size * 100)), end=' ')
        end = time.time()  # 下载结束时间
        print('\tCompleted!,times: %.2f秒' % (end - start))  # 输出下载用时时间
        return end - start
    except:
        print("error")

def download_url(root_url, download_dir="downloads/"):
    if not download_dir.endswith('/'):
        download_dir += '/'
    response = requests.get(root_url).text
    urls = re.findall(r'<td><a href="(.*?)">', response, re.S | re.M)
    os.makedirs(download_dir, exist_ok=True)
    tm = float(0)
    for url in urls:
        if url == '/':
            continue
        if not url.endswith('/'):
            tm += download_file(root_url+url, download_dir+url)
            continue
        tm += download_url(root_url+url, download_dir=download_dir+url)
    return tm



if __name__ == '__main__':
    sys_args = sys.argv[1:]
    user_args_key = {0: 'url', 1: 'dir'}
    user_args = {'url': '', 'dir': ''}
    if len(sys_args) == 2:
        for i in range(len(sys_args)):
            if '=' in sys_args[i]:
                k, v = sys_args[i].rsplit('=', maxsplit=1)
                if k.lstrip('-').rstrip('=') not in user_args:
                    print('error1')
                    exit(1)
                user_args[k.lstrip('-').rstrip('=')] = v
            else:
                user_args[user_args_key[i]] = sys_args[i]
    elif len(sys_args) == 0:
        user_args['url'] = "http://172.20.188.160:8080/"
        user_args['dir'] = 'iso'
    else:
        print('error2')
        exit(1)

    print("Files will be save to %s." % user_args['dir'])
    tm = download_url(user_args['url'], user_args['dir'])
    print('Total Completed!,times: %.2f秒' % tm)

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

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

相关文章

Kafka实战 - 03 Kafka生产者:将X平台的告警和事件数据接入到S平台

文章目录1. 项目背景2. 依赖和配置3. 生产者配置 KafkaConfiguration4. 同步数据Topic枚举 SyncDataTopicEnum5. 请求体 DataSyncQo6. 同步数据控制层 AppSyncDataController7. 同步数据业务层 XdrDataSyncServiceImpl1. 项目背景 资产可能会遭受各种网络攻击&#xff0c;安全…

[附源码]Python计算机毕业设计SSM基于JAVA语言的宠物寄养管理(程序+LW)

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

1,4-丁炔二醇BYD物料中含有大量铜离子、二氧化硅等杂质怎么办?

1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产品、维生素B6的主要原料&#xff0c;还可以用于镀镍的增亮剂、防腐抑制剂等领域。 1,4&#xff0d;丁二醇&#xff08;BDO&#xff09;是一种…

[附源码]Python计算机毕业设计SSM基于web的社团管理系统(程序+LW)

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

免费开源的图片修复工具Lama Cleaner

什么是 Lama Cleaner &#xff1f; Lama Cleaner 是由 SOTA AI 模型提供支持的图像修复工具。可以从图片中移除任何不需要的物体、缺陷和人&#xff0c;或者擦除并替换&#xff08;powered by stable diffusion&#xff09;图片上的任何东西。 看看官方提供的视频&#xff0c;应…

图片怎么转换成PDF格式?这两种方法都可以实现转换

怎么把图片转换成PDF格式呢&#xff1f;大家在日常中也会经常使用到图片&#xff0c;不管是出门游玩还是办公学习&#xff0c;图片都会给我们带来极大的便利。但是一旦图片的数量多了起来&#xff0c;我们又不能删除&#xff0c;那么这些图片的存放就是一个关键的问题&#xff…

[附源码]计算机毕业设计的小说阅读系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

“数据湖存储”冠军杯足球赛开幕,腾讯云存储出征!

“数据湖存储”冠军杯是数据湖领域内的世界级赛事&#xff0c;随着云上“数据湖存储”产品理念的逐步普及&#xff0c;今年的比赛也获得了国内外众多球迷的关注。腾讯云以COS、GooseFS、GooseFSx、元数据加速器、COS加速器等球员组成的球队一路披荆斩棘&#xff0c;成为最闪耀的…

化工集团公司安全风险智能化管控平台

加快数字化发展&#xff0c;大力推进信息化、工业化融合&#xff0c;是国家新时代、新阶段作出的重要决策部署&#xff0c;是化工集团公司打造世界领先企业的必由之路。要充分认识加快数字化发展的重要性紧迫性。要锚定集团公司数字化转型升级的总目标&#xff0c;坚持顶层设计…

Java 开发如何通过 IoT 边缘 ModuleSDK 进行协议转换

操作场景 使用 ModuleSDK 开发插件应用&#xff0c;接入其他协议设备&#xff08;如 HTTP 请求数据&#xff09;&#xff0c;将其他协议的数据转化为 MQTT 协议 JSON 数据上报到 IoTDA。 代码解析 项目结构如下 ModbusDriver 代码解析 片段一 通过 DriverClient.createFromEnv…

[附源码]Nodejs计算机毕业设计基于Web课堂签到管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

web开发框可以为提升办公效率赋能吗?

提升办公效率可以引用专业的web开发框架&#xff0c;值得一提的是&#xff0c;随着数字化时代的到来&#xff0c;要想做好数据管理&#xff0c;低代码开发平台功不可没&#xff0c;在做好数据管理的过程中发挥了重要的应用价值。研发低代码开发平台&#xff0c;流辰信息一直都以…

从BI到ABI,守正创新的思迈特软件持续推进国产BI产业创新

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业近年来&#xff0c;国内外数字化转型加速渗透&#xff0c;企业客户已不再满足“用上”数据&#xff0c;能否“用好”数据、提升管理效率成为企业数字化转型的核心诉求。在提升企业管理效率的工具中&#xff0c;商业智能&…

Linux C编程一站式学习笔记1

Linux C编程一站式学习笔记 chap1程序的基本概念 打算重学计算机&#xff0c;重学C语言 这本书的前言写的真好 实在是惭愧… 文章目录Linux C编程一站式学习笔记 chap1程序的基本概念一.程序和编程语言1.什么是程序2.程序由指令组成3.编程语言编译执行过程解释执行过程本节总结…

力扣(LeetCode)1697. 检查边长度限制的路径是否存在(C++)

并查集离线查询 由于评测系统对 vectorvectorvector 的排序可能较慢&#xff0c;使用结构体保存 vectorvectorvector &#xff0c;接下来的查询和边集就对结构体操作。 结构体的属性 aaa 点 、 bbb 点 、ccc 长度、 ddd 顺序。重载 <<< &#xff0c;排序时按照 ccc …

ssm+Vue计算机毕业设计校园图书漂流系统(程序+LW文档)

ssmVue计算机毕业设计校园图书漂流系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

C++基础篇之什么是 数据结构

&#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1f334;2022年12月12日&#x1f334; ✉…

12.1、后渗透测试--提权

meterpreter提权方式&#xff1a; getsystem自动提权bypassuac提权migrate1、getsystem自动提权 meterpreter > getsystemgetsystem工作原理&#xff1a;getsystem创建一个新的Windows服务&#xff0c;设置为SYSTEM运行&#xff0c;当它启动时连接到一个命名管道。getsystem…

Java 线程池详解

线程池&#xff08;thread pool&#xff09;&#xff1a;一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;对线程统一管理。 使用线程池的优势 提高效率&#xff0c;创建好一定数量的线程放在池中&am…

技术分享 | 被测系统架构与数据流分析

深入了解测试过程中被测系统的架构与数据流&#xff0c;有助于理解业务逻辑&#xff0c;梳理业务用例以及促进部门协同。 更深的理解业务逻辑是指要分析公司是做什么的&#xff0c;公司的重要的商务决策是什么&#xff0c;公司内部数据流是怎么运行的&#xff0c;有哪些常见的…