如何在python中编写无限循环爬虫?

时间:2015-05-30 16:24:00

标签: python python-3.x web-crawler

EDITED

我有crawler.py每10分钟抓取一些网站,并向我发送一些有关这些网站的电子邮件。爬虫准备好并在本地工作。

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

  1. 它将在我将上传到的主机上无限循环运行?
  2. 有时候我可以阻止它(例如调试)。
  3. 起初,我想过做无休止的循环,例如

    crawler.py:

    while True:
        doCarwling()
        sleep(10 minutes)
    

    然而,根据我在下面得到的答案,这是不可能的,因为托管服务提供商在一段时间后终止进程(仅为了问题,让我们假设每30分钟就杀死一次)。因此,我的无限循环过程会在某些时候被杀死。

    因此,我认为这是一个不同的解决方案: 让我们假设我的抓取工具位于“www.example.com \ crawler.py”,每次访问它时,它都会执行run()函数:

    run()
         doCarwling()
         sleep(10 minutes)
         call URL "www.example.com\crawler.py"
    

    因此,没有无限循环。实际上,每次我的爬虫运行时,它也会访问将再次执行相同爬虫的URL。因此,没有无限循环,没有长时间运行的进程,我的爬虫将继续永远运行。

    我的想法会奏效吗? 我有没有想过的任何隐藏的缺点?

    谢谢!

    由于

3 个答案:

答案 0 :(得分:2)

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

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

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

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

更新

因此,在您更新的问题中,您建议您使用脚本通过HTTP请求调用自身。我之前想过这个,但我之前的回答并没有考虑到它,因为我相信它不会起作用(总的来说)。

我担心的是:如果请求的HTTP连接在脚本终止之前关闭,服务器是否会终止脚本?

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

我认为答案很明显"不会,脚本将会被杀死#34;因此你应该保证通过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秒后关闭连接,脚本将继续运行直到结束并且仍然打印消息。

因此, with flask ,如果你可以对自己做一个异步请求,你应该能够拥有一个"无限循环"脚本。

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

控制

假设您的服务器允许您执行GET请求并且即使连接已关闭也会运行脚本,您几乎无需处理任何事情,例如您的脚本仍然必须运行在最长服务器时间限制内快速完成,并且为了使您的脚本每10分钟运行一次,最大允许时间为1分钟,每次拨打10个电话时都需要计算。

此外,必须控制此机制,因为您无法根据请求中断调试。至少,不是直接。

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

在实际执行爬网之前,使用文件计算脚本的调用次数。例如,如果脚本允许活动90秒,但您希望每10小时爬行一次,则必须执行此操作。

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

答案 1 :(得分:1)

如果您正在使用Linux,则应该为您的脚本执行cron作业。信息:http://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800

答案 2 :(得分:1)

如果您正在运行Linux,我会设置并启动脚本http://upstart.ubuntu.com/getting-started.html以将其转换为服务。 它提供了许多优点,例如: - 从系统启动开始 - 崩溃时自动重启 -Manageable:service mycrawler restart ...

或者,如果您希望每10分钟运行一次,请忘记无限循环并执行cronjob http://en.wikipedia.org/wiki/Cron