Python 将一些已爬网的URL重新馈送到spider/scheduler
有一些URL(domain.com/list)列出了我需要定期爬网的10个链接。这些链接通常大约每30秒更改一次,所以我需要不断地重新爬网domain.com/list以检查新链接。由于大小的原因,对所有这些链接进行爬网有时需要30秒以上的时间,因此我无法每30秒对脚本进行一次爬网,因为我可能会遇到几个并发爬网程序。但是,由于爬行器在第一次运行时花费的时间太长而丢失一些链接是可以接受的情况 我编写了一些spider中间件来删除已经访问过的链接(对于链接仅部分更改的情况)。我试图在这个过程中包含一个新的请求,该请求是domain.com/list,且dont\u filter=True,因此列表会再次反馈给调度程序,但最终我收到了大量的请求。我的代码是:Python 将一些已爬网的URL重新馈送到spider/scheduler,python,scrapy,Python,Scrapy,有一些URL(domain.com/list)列出了我需要定期爬网的10个链接。这些链接通常大约每30秒更改一次,所以我需要不断地重新爬网domain.com/list以检查新链接。由于大小的原因,对所有这些链接进行爬网有时需要30秒以上的时间,因此我无法每30秒对脚本进行一次爬网,因为我可能会遇到几个并发爬网程序。但是,由于爬行器在第一次运行时花费的时间太长而丢失一些链接是可以接受的情况 我编写了一些spider中间件来删除已经访问过的链接(对于链接仅部分更改的情况)。我试图在这个过程中包含一
def process_spider_output(self, response, result, spider):
for i in result:
if isinstance(i, Request):
state = spider.state.get('crawled_links', deque([]))
if unquote(i.url) in state or i.url in state:
print "removed %s" % i
continue
yield i
yield spider.make_requests_from_url('http://domain.com/list')
这看起来很难看,我不确定它是否按预期工作。我还试图钩住蜘蛛空闲和关闭的信号,试图重新抓取网站,但没有成功
重新抓取特定URL以监视经常发生的更改,而不关闭正在使用的爬行器的最佳方法是什么
提前谢谢
爬行所有这些链接有时需要30秒以上,因为
大小,因此我无法cron脚本以每30秒执行一次,因为我
最终可能会出现几个并发的爬行器
有一种常见的做法,即使用包含进程PID的文件作为互斥锁,如果该文件存在且进程仍在运行,则退出。如果你把你的爬虫代码放到一个有这种结构的程序中
import sys
import os
PIDFILE = '/tmp/mycrawler.pid'
def do_the_thing():
# <your spider code here>
def main():
# Check if we're already running
if os.path.exists(PIDFILE):
pid = int(open(PIDFILE, 'r').read())
try:
os.kill(pid, 0)
print "We're already running as PID %d" % pid
sys.exit(1)
except OSError:
pass
# Write a PID file
open(PIDFILE, 'w').write(str(os.getpid()))
# Now do the thing, ensuring we delete PID file when done
try:
do_the_thing()
finally:
os.unlink(PIDFILE)
if __name__ == '__main__':
main()
导入系统
导入操作系统
PIDFILE='/tmp/mycrawler.pid'
定义做某事():
#
def main():
#检查我们是否已经在运行
如果os.path.exists(PIDFILE):
pid=int(打开(pid文件'r').read())
尝试:
os.kill(pid,0)
打印“我们已作为PID%d运行”%PID
系统出口(1)
除操作错误外:
通过
#编写一个PID文件
打开(PIDFILE,'w')。写入(str(os.getpid()))
#现在做这件事,确保完成后删除PID文件
尝试:
做那件事
最后:
取消链接(PIDFILE)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
…然后您可以随时从cron
运行它,它只需等待最后一个实例完成,然后再运行