如何用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分钟对某些站点进行一次爬网,并向我发送一些关于这些站点的电子邮件。爬虫已准备就绪并在本地工作
我如何调整它,以便发生以下两件事:
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()