【问题标题】:Scrapy freeze on connection timeoutScrapy冻结连接超时
【发布时间】:2013-12-29 00:11:57
【问题描述】:

我编写了一个使用非常不可靠的 Internet 连接的爬虫爬虫。这是给定的。我无法轻易或廉价地更改它 - 有时互联网连接会丢失,几秒钟后它会恢复。

我观察到 Scrapy 18.4 爬虫会无限期冻结而不打印任何错误消息的行为。它停止对 Ctrl+C 做出反应,这让我觉得这发生在反应堆堆栈的某个深处,尽管我不能确定。

绝对没有错误消息使调试变得毫无希望。

问题:有人知道如何调试这个问题吗?由于上述原因,我真的没有任何有意义的日志可以附加。

【问题讨论】:

  • 嗯,好吧,在尝试了一些随机的事情之后,我似乎设法通过从 12.x 升级到 Twisted 13.2 来解决这个问题。我会及时通知你。
  • 更正:不,不是这样。
  • 如果可能的话,分享你使用的代码
  • 我认为你不需要代码,因为它发生在任何蜘蛛身上。这是网络堆栈中的一些核心问题。
  • 您是否尝试过在请求中使用超时?

标签: python timeout web-crawler scrapy twisted


【解决方案1】:

您可以设置一个超时类,然后在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 分钟断开一次,那么您将在绝大多数时间里失败,您将需要更多地研究调试问题并实际解决它而不是解决它,因为这个“解决方案”绝对应该被视为一种解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2015-09-09
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多