如何用python编写无止境循环爬虫?

如何用python编写无止境循环爬虫?,python,python-3.x,web-crawler,Python,Python 3.x,Web Crawler,已编辑: 我有一个crawler.py,它每10分钟对某些站点进行一次爬网,并向我发送一些关于这些站点的电子邮件。爬虫已准备就绪并在本地工作 我如何调整它,以便发生以下两件事: 它将在我将上传到的主机上无休止地循环运行 有时我可以停止它(例如调试) 起初,我想做无休止的循环 crawler.py: while True: doCarwling() sleep(10 minutes) 然而,根据我在下面得到的答案,这是不可能的,因为宿主提供者会在一段时间后终止进程(出于问题的考虑

已编辑

我有一个
crawler.py
,它每10分钟对某些站点进行一次爬网,并向我发送一些关于这些站点的电子邮件。爬虫已准备就绪并在本地工作

我如何调整它,以便发生以下两件事:

  • 它将在我将上传到的主机上无休止地循环运行
  • 有时我可以停止它(例如调试)
  • 起初,我想做无休止的循环

    crawler.py:

    while True:
        doCarwling()
        sleep(10 minutes)
    
    然而,根据我在下面得到的答案,这是不可能的,因为宿主提供者会在一段时间后终止进程(出于问题的考虑,让我们假设每30分钟终止一次进程)。因此,我的无止境循环进程将在某个时候被终止

    因此,我想到了一个不同的解决方案: 假设我的爬虫程序位于“www.example.com\crawler.py”,每次访问它时,它都会执行函数run():

    因此,不会有无止境的循环。事实上,每次我的爬虫程序运行时,它也会访问URL,该URL将再次执行同一个爬虫程序。因此,不会有无止境的循环,不会有长时间运行的进程,我的爬虫程序将永远继续运行

    我的想法行得通吗? 有没有我没有想到的隐藏缺点?

    谢谢


    谢谢

    如果您正在使用Linux,您应该为您的脚本做一个
    cron
    工作。信息:

    如果你在使用Linux,你应该为你的脚本做一个
    cron
    工作。信息:

    如果您正在运行linux,我会设置并启动脚本,将其转换为服务。 它有很多优点,如: -从系统启动时开始 -崩溃时自动重启 -可管理:服务mycrawler重新启动


    或者,如果您希望它每10分钟运行一次,请忘记无休止的循环,然后执行cronjob

    如果您正在运行linux,我会设置并启动脚本,将其转换为服务。 它有很多优点,如: -从系统启动时开始 -崩溃时自动重启 -可管理:服务mycrawler重新启动


    或者,如果您希望让它每10分钟运行一次,请忘记无休止的循环,并像您在评论中所说的那样执行cronjob,您正在GoDaddy等公共共享服务器上运行。因此,
    cron
    在那里不可用,长时间运行的脚本通常是被禁止的-即使您使用的是
    sleep
    ,您的进程也会被终止

    因此,我看到的唯一解决方案是使用一个外部服务器,您必须控制它连接到公共服务器并每10分钟运行一次脚本。一种解决方案是在本地计算机上使用
    cron
    连接到主机上的特定页面**

    也许你可以找到允许定期运行脚本的在线服务,并使用它们,但我不知道

    **奖励:您可以直接作为回复获得结果,而无需向自己发送电子邮件

    更新 因此,在更新的问题中,您建议您使用脚本通过HTTP请求调用自己。我以前曾考虑过,但我以前的回答没有考虑过,因为我相信它不会起作用(一般)。 我担心的是:如果请求脚本的HTTP连接在脚本终止之前关闭,服务器会杀死脚本吗

    换句话说:如果你打开yoursite.com/script.py,运行需要60秒,10秒后关闭与服务器的连接,脚本会一直运行到正常结束吗

    我认为答案显然是“不,脚本将被杀死”,因此该方法将是无用的,因为您应该保证通过HTTP请求调用自身的脚本比被调用的脚本活得更长。我用烧瓶做了一个小实验,结果证明我错了:

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        import time
        print('Script started...')
        time.sleep(5)
        print('5 seconds passed...')
        time.sleep(5)
        print('Script finished')
        return 'Script finished'
    
    if __name__ == '__main__':
        app.run()
    
    如果我运行此脚本并向
    localhost:5000
    发出HTTP请求,并在2秒钟后关闭连接,则脚本将继续运行,直到结束,消息仍被打印

    因此,使用flask,如果您可以对自己执行异步请求,那么您应该能够拥有一个“无限循环”脚本

    不过,我不知道其他服务器上的行为。你应该做个测试

    控制 假设您的服务器允许您执行GET请求,并且即使连接已关闭,也可以让脚本运行,那么您几乎没有什么事情需要处理,例如,您的脚本仍必须运行足够快,才能在服务器允许的最长时间内完成,并且要使脚本每10分钟运行一次,在最多1分钟的允许时间内,您必须每打10个电话就计数一次

    此外,必须控制该机制,因为您不能按照请求中断它进行调试。至少,不是直接的

    因此,我建议您使用文件:使用一个文件将爬行拆分为更小的步骤,每个步骤都能够在不到一分钟内完成,然后在再次调用脚本时再次继续

    在实际执行爬网之前,使用文件计算脚本被调用的次数。例如,如果允许脚本生存90秒,但希望每10小时爬网一次,则这是必需的


    使用文件控制脚本:存储一个布尔标志,如果需要,可用于停止递归机制。

    如您在注释中所述,您正在GoDaddy等公共共享服务器上运行。因此,
    cron
    在那里不可用,长时间运行的脚本通常是被禁止的-即使您使用的是
    sleep
    ,您的进程也会被终止

    因此,我看到的唯一解决方案是使用一个外部服务器,您必须控制它连接到公共服务器并每10分钟运行一次脚本。一种解决方案是在本地计算机上使用
    cron
    连接
    
    
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        import time
        print('Script started...')
        time.sleep(5)
        print('5 seconds passed...')
        time.sleep(5)
        print('Script finished')
        return 'Script finished'
    
    if __name__ == '__main__':
        app.run()