【问题标题】:python 3 requests try-except failurepython 3请求try-except失败
【发布时间】:2015-05-18 09:46:10
【问题描述】:

我有一个程序可以从网站下载页面,在其中找到图片链接并下载这些图片。如果我尝试在具有快速和稳定 Internet 连接的计算机上运行该程序 - 几天和几周内一切正常。但是,如果我在 Internet 连接缓慢或不稳定的计算机上尝试这个程序——我有一个问题——“try-except”模块似乎无法正常工作。

---此功能下载内容-任何内容(页面或图片)

def downl(self,addr,cook,head2,errmess):
    global result
    try:
        result=requests.get(addr, cookies=cook, headers=head2)
    except:
        print(errmess) # error message
        time.sleep(5)
    return result

我将页面链接发送到该函数,然后其他函数在该页面中查找picture_link,然后我发送到相同的函数(downl)picture_link。在此之后,我将函数 (downl) 的结果保存为 .jpg 文件。正如我所说 - 在具有正常互联网连接的计算机上一切正常。结果,我的硬盘上有 5、10 或 5000 张图片。

但让我举一个小例子来说明互联网连接不好会发生什么。假设我们有 2 页,每页 1 张图片。

step 1) downloading 1st page (def downl)
step 2) taking picture_link from it
step 3) downloading picture (def downl)
step 4) saving 1st picture to hdd 1.jpg
step 5) downloading 2nd page (def downl)
step 6) taking picture_link from it
step 7) downloading picture (def downl) and receivind error message (errmess)
step 8) saving 2nd picture to hdd 2.jpg

例如:第一张图片可能是具有适当内容的普通 jpg。第二张图片将是带有 jpg 扩展名的文件,但将有第二页作为其内容(它将是通常的 html 文件,以错误的扩展名“jpg”保存)

换句话说:在第二张图片的下载过程中互联网出现问题,程序打印了一个关于它的错误(errmess),但是在无数次重试(正如我的函数中所假设的那样)它以某种方式通过了 try-except 块并返回之前的结果(第 2 页),保存为第 2 张图片。

请帮忙!如何让这个 try-except(或请求)永远工作,直到它下载它应该下载的内容(无论互联网连接发生什么错误),而不是通过以前的结果。

非常感谢您的时间和关注。

【问题讨论】:

  • global result 导致“失败”结果返回最后一个成功结果。 result 没有重新定义,仍然是 return-ed。抛出的确切错误是什么? ConnectionError?
  • 是的。我知道由于全局“结果”,我得到了以前的结果。但问题是关于其他事情 - 为什么程序会通过 try-except,它应该永远在其中循环,直到它下载图片。关于确切的错误 - 我今晚会在网络不好的电脑前查看确切的错误。

标签: python-3.x python-requests try-except


【解决方案1】:

那么你需要一个这样的 while True 循环:

def downl(self,addr,cook,head2,errmess):
    global result
    while(True):
        try:
            result=requests.get(addr, cookies=cook, headers=head2)
            return result
        except:
            print(errmess) # error message
            time.sleep(5)

【讨论】:

  • 非常感谢!在您的帮助下,它可以正常工作。 ))) 我们把它放在永恒的循环中,只有在积极的结果后才放出来。我可以要求解释吗?为什么没有 while True 循环它不起作用? try-except 不应该以同样的方式工作吗?还是设计为只进行一次迭代?这是否意味着 try-except 不是一个循环,它只是在出现已知错误时不让程序停止的一种方法?
  • 你最后的假设是正确的,try -except 只是捕获异常(错误)的一种方式。如果你想要一个循环,你必须使用循环(while 或 for)或递归函数。
  • 埃里克,非常感谢您的回答。据我所知 - 你是 python 的专家。也许你可以帮助我解决其他几个星期甚至没有人试图回答的问题? stackoverflow.com/questions/30079454/…
  • @UserNew:奉承会让你无处可去,但不要停止尝试 ;-) 我会看看。
  • ))) 所有女性都会受到奉承,她们占人类的 50% 以上。唯一比女性更容易受到奉承的生物是男性。 ;)
猜你喜欢
  • 2019-06-26
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2018-03-19
相关资源
最近更新 更多