gpt4 book ai didi

python - Scrapy 卡住连接超时

转载 作者:行者123 更新时间:2023-12-04 13:49:50 25 4
gpt4 key购买 nike

我写了一个爬虫爬虫,它使用非常不可靠的互联网连接。这是一个给定的东西。我不能轻易或廉价地改变它 - 互联网连接偶尔会丢失,几秒钟后它就会恢复。
我观察到 Scrapy 18.4 爬虫会无限期卡住而不打印任何错误消息的行为。它停止对 Ctrl+C 作出 react ,这让我觉得这发生在 react 堆堆栈的某个地方,尽管我不能确定。
绝对没有错误消息使调试变得毫无希望。
问题 : 有没有人知道如何调试这个问题?由于上述原因,我真的没有任何有意义的日志可以附加。

最佳答案

您可以为超时设置一个类,然后在 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 的系统。
enter image description here
如果您希望它返回运行爬虫(自动重启),那么您可以将其全部置于无限循环中。
while True:
print("Restarting spider")
try:
with timeout(seconds=3):
run_crawl()
except Exception as e:
print(e)
这一切都假设您可以在 x 之后继续重新启动机器人秒没有重大负面结果。 IE 如果您不断地一遍又一遍地抓取相同的页面,那么这将非常无缝地工作。
然而,如果你正在抓取一个很长的列表 [一次] 并且只是希望它没有错误地完成,那么它的效果会不太好,但仍然可以通过设置 x 来使用。到一个数字,该数字表示成功执行时大于整个过程持续时间的时间量(无论程序执行的时间长短都是如此 - 如果您正在抓取,请不要将 x 设置为 3 秒一个需要 7 秒才能完成的站点,如果您正在执行 5 个需要 30 秒的站点或 500 个需要 5 分钟的站点,则同样如此,您需要将 x 设置为大于该持续时间的数量。
我特别将你的机器人与快速完成时间分开的原因是,如果它在循环中失败,超时为 30 秒,那么如果失败,你平均会失去 15 秒,但如果你有 30 分钟执行时间那么你会在失败时平均损失 15 分钟,如果你的互联网平均每 15 分钟就会断网,那么你会在绝大多数时间里失败,你需要多看看调试问题并实际解决它而不是解决它,因为这个“解决方案”绝对应该被视为一种解决方法。

关于python - Scrapy 卡住连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com