scrapy 带时间的零碎递归回调

nbewdwxp  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(150)

我想创建一个每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)

然而,在scraper中添加time.sleep(5)似乎会扰乱scrapy的内部工作。出于某种原因,scrapy确实发出了请求,但产出项没有(或很少)输出到给定的输出文件。
我认为这与scrapy的请求优先级有关,它可能会优先发送一个新的请求,而不是产生被擦除的项目。会是这种情况吗?我试图编辑设置,从深度优先队列到宽度优先队列。这并没有解决问题。
我如何在给定的时间间隔内抓取一个网站,比如说5分钟?

monwx1rj

monwx1rj1#

因为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分钟运行一次您想要的spider

相关问题