使用python Wget lib时下载错误

使用python Wget lib时下载错误,python,wget,Python,Wget,如果下载卡在XX%,有没有办法重新启动下载?我正在尝试进行刮取并下载相当多的文件。我正在使用下面的代码。它将解决连接错误,但如果卡住,它不会重新启动任何下载 for element in elements: for attempt in range(100): try: wget.download(element.get_attribute("href"), path) e

如果下载卡在XX%,有没有办法重新启动下载?我正在尝试进行刮取并下载相当多的文件。我正在使用下面的代码。它将解决连接错误,但如果卡住,它不会重新启动任何下载

    for element in elements:
        for attempt in range(100):
            try:
                wget.download(element.get_attribute("href"), path)
            except:
                print("attempt error, retry" + str(attempt))
            else:
                break

似乎没有重新启动下载的功能。我看了很多这个包的例子->。手册的页面不见了,pypi.org页面上确实有关于这样一个功能的任何信息

但是,您只需在
中添加除
之外的另一行即可重新启动下载。此代码将适用于您

# Set some variables to end loop after download success
# The download loop will exit if failed 5 times
downloaded = False
attempts = 0
for element in elements:
    while not downloaded and attempts < 5:
        try:
            wget.download(element.get_attribute("href"), path)
            # Set downloaded flag to end loop
            downloaded = True
        except:
            print("attempt error, retry" + str(attempt))
            wget.download(element.get_attribute("href"), path)
                attempts += 1
#在下载成功后设置一些变量以结束循环
#如果失败5次,下载循环将退出
下载=错误
尝试次数=0
对于元素中的元素:
未下载且尝试次数<5次时:
尝试:
wget.download(element.get_属性(“href”),路径)
#将下载标志设置为结束循环
下载=真
除:
打印(“尝试错误,重试”+str(尝试))
wget.download(element.get_属性(“href”),路径)
尝试次数+=1

使用的另一种方法是请求更流行的

import requests

def proceed_files():
    # Set some variables to end loop after download success
    # The download loop will exit if failed 5 times
    file_urls = ['list', 'of', 'file urls']
    for url in file_urls:
        downloaded = False
        attempts = 0
        while not downloaded and attempts < 5:
            if download_file(url):
                downloaded = True
            else:
                attempts += 1

def download_file(url):
    try:
        request = requests.get(url, allow_redirects=True)
        file_name = url.split('/')[:-1]
        open(file_name, 'wb').write(request.content)
        return True
    except:
        return False
导入请求
def procedu files():
#设置一些变量以在下载成功后结束循环
#如果失败5次,下载循环将退出
文件URL=['list','of','fileURL']
对于文件中的url\u url:
下载=错误
尝试次数=0
未下载且尝试次数<5次时:
如果下载_文件(url):
下载=真
其他:
尝试次数+=1
def下载文件(url):
尝试:
request=requests.get(url,allow\u redirects=True)
file_name=url.split('/')[:-1]
打开(文件名“wb”).write(请求.内容)
返回真值
除:
返回错误

如果下面的答案适合您,您可以将其标记为正确答案。它不是正确答案。是的,它是正确的。没有这样做的功能。我可以删除代码,这与OPs代码类似。但答案是正确的。没有其他方法可以只请求尚未下载的文件的一部分。问题是它在wget命令处被卡住,除非有方法在时间T和时间T+delta检查%download,如果%download没有更改,请重新启动wget命令。不太确定是否有这种方法?请使用请求库检查我编辑的答案您的代码不正确。您需要在元素中的元素的
中有重试循环,因此您正在重试单个文件,并且按照您的方式重试,如果重试中出现错误,应用程序将爆炸,因为错误在
中,但
除外。他的原版更好,在
try
中返回到retry。你是对的。我会更改它。问题是它被wget命令卡住了,除非有办法在时间T和时间T+delta检查%download,如果%download没有更改,请重新启动wget命令。不太确定是否有这种方法?如果下载意外中止(例如超时),它应该返回一个异常,不是吗?或者它只是保存了迄今为止可以加载的内容,而没有任何异常或错误?另外,由于它在WHILE循环中,它将不会继续到for循环中的下一个实例,除非它的download=True并且调度小于5。因此,只有当它被下载或达到最大尝试次数时,它才会进入下一个实例。如果没有错误(即没有意外中止),您可以在我的问题的屏幕截图上看到。它只是停留在2%,没有任何超时错误,并且拒绝做任何事情。在屏幕截图上,我可以看到第二个和第三个文件返回了一个异常(尝试错误,重试0)。所以,若它阻塞了2%并且并没有返回异常,那个么它仍然在等待服务器的响应。另一种方法是在后台通过子进程将其绑定到os wget,这是完全不同的方法。尝试错误是我知道文件存在连接错误(即无法开始下载文件),它将再次尝试连接。