随时间的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 分钟 运行 您想要的蜘蛛
我想抓取一个网站,该网站每 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