python自动下载网页中的文件,python 自动下载脚本

大家好,本文将围绕python自动下载文件到指定文件夹展开说明,python登录网站自动下载文件是一个很多人都想弄明白的事情,想搞清楚python自动下载网页中的文件需要先了解以下几个事情。

Source code download: 本文相关源码

使用paramiko包登录远程服务器并下载文件

import stat
import datetime
import paramiko
import os
import logging
import time
import shutil
transport = paramiko.Transport(('linux服务器ip',端口号))
transport.connect(username='账户名称',password='密码')

logging.basicConfig(level=logging.DEBUG,   # 控制台打印日志级别
                    filename='copy.log',     # 日志名称可以更改
                    #encoding="utf-8",
                    filemode='w',           # 模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志,a追加模式,默认不写的话就是追加模式
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:%(message)s' # 日志格式
                    )

sftp = paramiko.SFTPClient.from_transport(transport)
sftp = paramiko.SFTPClient.from_transport(transport)

def getRemoteFiles(remoteDir):
    # 加载 sftp 服务器文件对象(根目录):
    filesAttr = sftp.listdir_attr(remoteDir)
    try:
        # foreach遍历
        for fileAttr in filesAttr:
            # 文件最后修改时间,精确到天yyyy mm dd
            file_dt = datetime.datetime.fromtimestamp(
                fileAttr.st_mtime).strftime('%Y%m%d')
            # 判断是否为目录
            if stat.S_ISDIR(fileAttr.st_mode):
                # 1、当是文件夹时
                # 计算子文件夹在ftp服务器上的路径
                son_remoteDir = remoteDir + '/'+ filesAttr.filename
                # 生成器,迭代调用函数自身
                yield from getRemoteFiles(son_remoteDir)
            else:
                # 2、当是文件时
                # 生成器,添加"路径+文件名"到迭代器
                yield remoteDir + '/' +fileAttr.filename
    except Exception as e:
        print('getAllFilePath exception:', e)

# 远程remoteDir文件下载保存到本地localDir
def download_file(localDir, remoteDir):
    # 记录下载开始时间
    dt_start = datetime.datetime.now()
    logging.info('................. {}开始下载!................\n'.format(dt_start))

    # 判断输入的本地目录是否存在
    if not os.path.exists(localDir):
        # 若本地目录不存在,则创建该目录
        os.makedirs(localDir)

    # 实例化生成器,获取sftp指定目录下的所有文件路径
    files = getRemoteFiles(remoteDir)

    # foreach遍历
    for file in files:
        # 要下载的远程文件,本地时路径+文件名
        remoteFileName = file
        # 定义下载保存到本地时的路径+文件名
        localFileName = os.path.join(localDir,file.split('/')[-1])

        try:
            # 下载文件,本地已有同名文件覆盖
            sftp.get(remoteFileName, localFileName)
            logging.info('sftp服务器 {} 下载成功!\n 该文件保存本地位置是{} ! \n'.format(
                remoteFileName,localFileName))
        except Exception as e:
            print('%s下载出错!:\n' % (remoteFileName), e)
            # 下载失败,关闭链接
            sftp.close()

    # 下载成功,关闭链接
    sftp.close()
    # 记录下载结束时间
    dt_end = datetime.datetime.now()
    logging.info('..................... {} 下载完成!..................'.format(dt_end))
    # 记录下载时长
    dt_long = dt_end - dt_start
    logging.info('................ 本次下载共用时间 {} !...............\n'.format(dt_long))

#实例下载
download_file('需下载至的本地目录', "从远程服务器上下载内容的目录")

transport.close()

生成时间戳文件

生成的时间戳文件与本地目录并列,存放每次下载的内容,便于后续问题的排查

#创建时间戳文件
str = '下载至的本地目录' + datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
 # 判断文件是否存在,若文件存在则继续,直到该文件夹下不包含该文件名
while True == os.path.exists(str):
    str = str + datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
os.makedirs(str)  # 创建文件夹
def copy_allfiles(src,dest):
#src:原文件夹;dest:目标文件夹
  src_files = os.listdir(src)
  for file_name in src_files:
    full_file_name = os.path.join(src, file_name)
    if os.path.isfile(full_file_name):
        shutil.copy(full_file_name, dest)
#备份内容
copy_allfiles("下载至的本地目录",str)

定时自动执行下载任务

用调度器完成定时执行任务,将上述程序添加至run_program和schedule_program函数中

import time
import sched

# 创建调度器对象
scheduler = sched.scheduler(time.time, time.sleep)

def run_program():
    """需要自动运行的程序"""
    print("程序已自动运行")

def schedule_program():
    """将程序添加到调度器中"""
    scheduler.enter(60, 1, run_program, ())#表示半小时(1800s)执行一次,优先级为1
    scheduler.run()

while True:
    schedule_program()

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值