首页 > 系统相关 >多线程下载nginx站点目录下文件

多线程下载nginx站点目录下文件

时间:2024-09-18 16:24:44浏览次数:6  
标签:url 站点 nginx subdir file download path 多线程 dir

代码如下

import os
import time
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from concurrent.futures import ThreadPoolExecutor, as_completed 
from tqdm import tqdm

base_url = ""  # 要下载文件的基础URL
download_dir = ""  # 保存下载文件的目录
max_workers = 10  # 最大并发数

# 下载单个文件
def download_file(file_url, download_dir):
    if not os.path.exists(download_dir):
        os.makedirs(download_dir)

    file_name = file_url.split('/')[-1]  # 提取文件名
    file_path = os.path.join(download_dir, file_name)

    if os.path.isdir(file_path):
        print(f"错误:路径 {file_path} 是一个目录,无法作为文件保存!")
        return

    # 如果文件不存在则开始下载
    if not os.path.exists(file_path): 
        with requests.get(file_url, stream=True) as r:
            r.raise_for_status()  # 确保请求成功
            total_size = int(r.headers.get('content-length', 0))  # 获取文件大小
            with open(file_path, 'wb') as f, tqdm(
                    desc=file_path,
                    total=total_size,
                    unit='B',
                    unit_scale=True,
                    unit_divisor=1024
            ) as bar:
                for chunk in r.iter_content(chunk_size=1024):
                    if chunk:
                        f.write(chunk)
                        bar.update(len(chunk))
    else:
        print(f"文件 {file_path} 已存在,跳过下载。")

# 获取目录中的所有文件和子目录链接
def get_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    files = []  # 存放文件链接
    subdirs = []  # 存放子目录链接

    for link in soup.find_all('a'):
        href = link.get('href')
        if href not in ['../', '/']:  # 排除上级目录链接
            full_url = urljoin(url, href)  # 构建完整URL
            if href.endswith('/'):
                subdirs.append(full_url)  # 是子目录则添加到子目录列表
            else:
                files.append(full_url)  # 是文件则添加到文件列表

    return files, subdirs

# 并发下载文件和子目录中的文件
def download_concurrently(base_url, download_dir):
    files, subdirs = get_links(base_url)

    if not subdirs:  # 如果没有子目录,只顺序下载文件
        print(f"检测到目录下全是文件,顺序下载...")
        for file_url in files:
            download_file(file_url, download_dir)
    else:
        print(f"检测到有子目录,进行并发下载...")
        with ThreadPoolExecutor(max_workers=max_workers) as executor:
            futures = []
            for subdir in subdirs:
                subdir_name = subdir.split('/')[-2]
                subdir_path = os.path.join(download_dir, subdir_name)

                # 避免文件和目录同名冲突
                if os.path.isfile(subdir_path):
                    print(f"错误:路径 {subdir_path} 已存在且是文件,无法创建为目录!")
                    continue

                futures.append(executor.submit(download_files, subdir, subdir_path))

            # 顺序下载当前目录下的文件
            for file_url in files:
                futures.append(executor.submit(download_file, file_url, download_dir))

            # 显示并发任务的进度
            for future in as_completed(futures):
                try:
                    future.result()
                except Exception as e:
                    print(f"下载出错: {e}")

# 递归下载子目录中的文件
def download_files(url, download_dir):
    files, subdirs = get_links(url)

    if not os.path.exists(download_dir):
        os.makedirs(download_dir)

    for file_url in files:
        download_file(file_url, download_dir)

    for subdir in subdirs:
        subdir_name = subdir.split('/')[-2]
        subdir_path = os.path.join(download_dir, subdir_name)

        if os.path.isfile(subdir_path):
            print(f"错误:路径 {subdir_path} 已存在且是文件,无法创建为目录!")
            continue

        download_files(subdir, subdir_path)

if __name__ == "__main__":
    start_time = time.time()  # 记录开始时间
    download_concurrently(base_url, download_dir)
    end_time = time.time()  # 记录结束时间

    total_time = end_time - start_time
    print(f"总下载时间: {total_time:.2f} 秒")

说明

脚本用于从一个目录中下载文件,并且支持递归处理子目录。它使用了concurrent.futures库来实现多线程并发下载,从而提高下载速度。脚本的主要功能包括:

  1. 下载单个文件:使用requests模块获取文件,配合tqdm显示进度条。
  2. 获取目录链接:通过解析HTML页面,提取当前目录下的所有文件和子目录。
  3. 并发下载:如果有子目录,则创建线程池并发处理子目录和文件。
  4. 递归下载:对于每个子目录,递归下载其中的文件。

标签:url,站点,nginx,subdir,file,download,path,多线程,dir
From: https://www.cnblogs.com/Unstoppable9527/p/18418783

相关文章

  • centos 监控web站点是否500 脚本
    要监控CentOS上的Web站点是否返回500错误,你可以编写一个简单的shell脚本,使用curl命令来检查HTTP响应状态码。以下是一个基本的脚本示例:#!/bin/bash#Web站点的URLURL="http://yourwebsite.com"#使用curl命令检查HTTP响应状态码STATUS=$(curl-o/dev/null--silent--head......
  • Nginx-HTTP和反向代理web服务器
    概述Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,公开版本1.19.6发布于2020年12月15日。其将源代码以类BSD许可证的形式发布,因它的稳......
  • Java EE(多线程)
    1.认识线程(Thread)  1️⃣每个线程都是一个独立的执行流,都可以单独参与cpu的调度.  2️⃣每个进程里至少包含一个线程时(及为主线程)或多个线程,同一个进程创建多个线程时,线程会共享同一份资源(内存➕   文件描述符.)     ⚠️:多个进程之间并不会共享同一份资源......
  • 第八章,多线程
    高级编程文章目录高级编程第八章,多线程一,多线程二,主线程三,线程的创建和启动四,线程的状态五,同步方法六,线程安全的类型七,常见类型对比第八章,多线程一,多线程什么是多线程如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”多个线程交替占......
  • java多线程模拟多个售票员从同一个票池售票
    程序功能这段代码模拟了多个售票员从一个有限的票池中售票的过程。主要功能如下:票池共有50张票,多个售票员(线程)并发进行售票。使用同步机制确保线程安全,避免多个售票员同时出售同一张票。每个售票员不断检查票池是否有票,有票则售出一张,直到票池中的票售完为止。代码cl......
  • go多线程
    1、简单使用(这个执行完成,如果进程执行比较久,这里不会等待它们结束)packagemainimport"time"funcmain(){ gofunc(){ println("Hello,World!") }() time.Sleep(1*time.Second)}2、wg.Add(数量)使用,这个会等待,直到全部完成funcmain(){wg:=sync.......
  • nginx配置的简单介绍
    Nginx基础使用目录结构进入Nginx的主目录我们可以看到这些主要文件夹confhtmllogssbinconf用来存放配置文件相关html用来存放配置文件相关sbinnginx的主程序Nginx配置与应用场景最小配置worker_processesworker_processes1;默认为1,表示开启一个业务......
  • Java多线程复习
    目录3种创建方式(现阶段推荐Runnable接口)下载网上的图片(利用了commons-io中的copyUrlToFiles方法)小结买票的例子(Thread的构造方法,获取当前线程的名称,线程休眠)龟兔赛跑的例子实现Callable接口线程停止线程休眠线程礼让Join方法(main线程与Thread子线程)线......
  • python多线程程序设计 之一
    python多线程程序设计之一全局解释器锁线程APIsthreading.active_count()threading.current_thread()threading.excepthook(args,/)threading.get_native_id()threading.main_thread()threading.stack_size([size])线程对象成员函数构造器start/runjoin线程子类实列......
  • Linux实操笔记2 Ubuntu安装Nginx的不同方法
    今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。一、Nginx是什么?以下是来自Nginx中文文档的内容。Nginx是一个高性能的Web和反向代理服务器,它具有有很多非常优越的特性:作为Web服务器:相比Apache,Nginx使用更少的......