编辑的
我有一个crawler.py,每10分钟抓取某些网站,并给我发一些有关这些网站的电子邮件。爬虫准备好了,并在当地工作。
我如何调整它,以便发生以下两件事:
一开始,我想做无止境的循环。
crawler.py:
while True:
doCarwling()
sleep(10 minutes)但是,根据我下面得到的答案,这是不可能的,因为主机提供商会在一段时间后终止进程(为了这个问题,让我们假设过程每30分钟就会被杀死一次)。因此,我没完没了的循环过程会在某个时候被扼杀。
因此,我认为pf有一个不同的解决方案:假设我的爬虫位于"www.example.com\crawler.py“,每次访问它时,它都执行函数run():
run()
doCarwling()
sleep(10 minutes)
call URL "www.example.com\crawler.py"这样,就不会有无休止的循环。事实上,每次我的爬虫运行时,它也会访问URL,这将再次执行相同的爬虫。因此,没有无休止的循环,没有长时间运行的进程,我的爬虫将永远继续运行。
我的想法会成功吗?有什么隐藏的缺点我没想过吗?
谢谢!
谢谢
发布于 2015-05-30 17:06:40
正如您在注释中所述,您正在一个公共共享服务器(如GoDaddy等)上运行。因此,cron在那里是不可用的,长时间运行的脚本通常是被禁止的--即使使用sleep,您的进程也会被终止。
因此,我看到的唯一解决方案是使用外部服务器,您必须在该服务器上控制连接到公共服务器并运行脚本,每10分钟一次。一种解决方案可能是在本地计算机上使用cron将wget或curl连接到主机上的特定页面。**
也许您可以找到允许定期运行脚本的在线服务,并使用这些服务,但我不知道。
**奖励:你可以直接得到结果作为回应,而不必给自己发电子邮件。
更新
因此,在您更新的问题中,您建议您使用脚本使用HTTP请求调用自己。我以前想过,但我在以前的回答中没有考虑到这一点,因为我相信它是行不通的(总体上)。
我担心的是:如果请求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秒后关闭连接,则脚本将继续运行到结束,并且消息仍将被打印。
因此,使用烧瓶,如果您可以对自己执行异步请求,您应该能够有一个“无限循环”脚本。
不过,我不知道其他服务器的行为。你应该做个测试。
控制
假设您的服务器允许您执行GET请求并让脚本运行,即使连接已关闭,您也没有什么需要处理的事情,例如,您的脚本仍然必须运行得足够快,以便在最大服务器时间间隔内完成,并且要使您的脚本每10分钟运行一次,最大允许时间为1分钟,您必须在每次调用10次时计数一次。
此外,必须对此机制进行控制,因为您不能根据请求中断它以进行调试。至少不是直接的。
因此,我建议您使用文件:使用一个文件将您的爬行拆分成更小的步骤,每个步骤能够在不到一分钟内完成,然后在脚本再次调用时继续。
在实际进行爬行之前,使用一个文件来计算调用脚本的次数。这是必要的,例如,如果脚本被允许活90秒,但您想每10小时爬行一次。
使用一个文件来控制脚本:存储一个布尔标志,如果需要的话,可以使用它来停止递归机制。
发布于 2015-05-30 16:29:52
如果您使用的是Linux,那么您应该为您的脚本做一个cron工作。信息:http://code.tutsplus.com/tutorials/scheduling-tasks-with-cron-jobs--net-8800
https://stackoverflow.com/questions/30548505
复制相似问题