随时间的scrapy递归回调

scrapy recursive callback with time

我想抓取一个网站,该网站每 5 分钟抓取一次给定网页的信息。我通过在递归回调之间添加 5 分钟的睡眠时间来实现这一点,如下所示:

    def _parse(self, response):

        status_loader = ItemLoader(Status())

        # perform parsing        

        yield status_loader.load_item()


        time.sleep(5)
        yield scrapy.Request(response._url,callback=self._parse,dont_filter=True,meta=response.meta)

但是,将 time.sleep(5) 添加到 scraper 似乎会扰乱 scrapy 的内部工作原理。由于某些原因,scrapy 确实发出了请求,但是收益项目没有(或很少)输出到给定的输出文件。

我认为这与 scrapy 的请求优先级有关,它可能优先于发送新请求而不是生成已抓取的项目。会是这样吗?我尝试编辑设置以从深度优先队列变为广度优先队列。这并没有解决问题。

我将如何以给定的时间间隔抓取网站,比如说 5 分钟?

它不会工作,因为 Scrapy 默认是异步的。

尝试设置这样的玉米作业 -

import logging
import subprocess
import sys
import time

import schedule


def subprocess_cmd(command):
    process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    logging.info(proc_stdout)


def cron_run_win():
    # print('start scraping... ####')
    logging.info('start scraping... ####')
    subprocess_cmd('scrapy crawl <spider_name>')


def cron_run_linux():
    # print('start scraping... ####')
    logging.info('start scraping... ####') 
    subprocess_cmd('scrapy crawl <spider_name>')


def cron_run():
    if 'win' in sys.platform:
        cron_run_win()
        schedule.every(5).minutes.do(cron_run_win)

    elif 'linux' in sys.platform:
        cron_run_linux()
        schedule.every(5).minutes.do(cron_run_linux)

    while True:
        schedule.run_pending()
        time.sleep(1)


cron_run()

根据您使用的 os

,这将每 5 分钟 运行 您想要的蜘蛛