大家好,本文将围绕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()