超时时跳过URL

2 投票
3 回答
6066 浏览
提问于 2025-04-17 06:00

我有一堆网址的列表。

我正在用下面的代码来获取它们的内容:

for url in url_list:
    req = urllib2.Request(url)
    resp = urllib2.urlopen(req, timeout=5)
    resp_page = resp.read()
    print resp_page

但是当出现超时时,程序就会崩溃。我只想在遇到 socket.timeout: timed out 的时候,继续读取下一个网址。该怎么做呢?

谢谢!

3 个回答

1

听起来你只需要处理超时的异常错误。我没有收到你提到的socket.timeout的消息。

req = urllib2.Request("http://127.0.0.2")
try:
    resp = urllib2.urlopen(req, timeout=5)
except urllib2.URLError:
    print "Timeout!"

显然,你需要一个确实会超时的URL(127.0.0.2在你的电脑上可能不会超时)。

7

虽然已经有了答案,但我想指出,URLlib2 可能不是导致这个问题的唯一原因。

正如在这里提到的(而且根据问题描述来看也是如此),这个异常可能和 socket 库有关。

如果是这样的话,只需要再加一个 except

import socket

try:
    resp = urllib2.urlopen(req, timeout=5)
except urllib2.URLError:
    print "Bad URL or timeout"
except socket.timeout:
    print "socket timeout"
1

我先假设你说的“崩溃”是指“引发一个URLError”,就像在urllib2.urlopen的文档中描述的那样。你可以查看Python教程中的“错误和异常”部分。

for url in url_list:
    req = urllib2.Request(url)
    try:
        resp = urllib2.urlopen(req, timeout=5)
    except urllib2.URLError:
        print "Bad URL or timeout"
        continue # skips to the next iteration of the loop
    resp_page = resp.read()
    print resp_page

撰写回答