您可以设置一个超时类,然后在try except 中运行您的代码。像这样的:
import signal
class timeout:
def __init__(self, seconds=1, error_message='Timeout'):
self.seconds = seconds
self.error_message = error_message
def handle_timeout(self, signum, frame):
raise TimeoutError(self.error_message)
def __enter__(self):
signal.signal(signal.SIGALRM, self.handle_timeout)
signal.alarm(self.seconds)
def __exit__(self, type, value, traceback):
signal.alarm(0)
def run_crawl():
while True:
print("This runs")
try:
with timeout(seconds=3):
run_crawl()
except Exception as e:
print(e)
注意:由于它使用signal,它只能在基于 UNIX 的系统上工作。
如果你想让它重新运行爬虫(自动重启),那么你可以把它全部放在一个无限循环中。
while True:
print("Restarting spider")
try:
with timeout(seconds=3):
run_crawl()
except Exception as e:
print(e)
这一切都假设您可以在x 秒后继续重新启动机器人而不会产生重大负面结果。 IE 如果您不断地反复抓取相同的页面,那么这将非常无缝地工作。
但是,如果您 [一次] 抓取一个很长的列表,并且只是希望它在没有错误的情况下完成,那么它的工作效果会不太好,但仍然可以通过将 x 设置为代表数量的数字来使用的时间大于成功执行时整个过程的持续时间(无论程序执行的长度如何,都是如此 - 如果您正在抓取一个需要 7 秒的站点,请不要将 x 设置为 3 秒完成,如果您执行 5 次需要 30 秒或 500 次需要 5 分钟也是如此,您需要将 x 设置为大于该持续时间的数量。
我特别区分你的机器人是否具有快速完成时间的原因是,如果它在一个超时为 30 秒的循环中失败,那么如果它失败,你平均会损失 15 秒,但如果你有如果执行时间为 30 分钟,那么当它失败时,您平均会损失 15 分钟,如果您的互联网平均每 15 分钟断开一次,那么您将在绝大多数时间里失败,您将需要更多地研究调试问题并实际解决它而不是解决它,因为这个“解决方案”绝对应该被视为一种解决方法。