scrapy 定时执行的两种方法

本文介绍了一种使用Python实现的定时爬虫任务调度方案。通过schedule库和多进程结合Scrapy框架,实现了对不同爬虫任务的周期性调度执行。每个爬虫任务可以根据其特定的需求设置不同的执行频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding: utf-8 -*-
import subprocess
import schedule
import time
import datetime
from multiprocessing import Process
from scrapy import cmdline
import logging
def crawl_work():
    # subprocess.Popen('scrapy crawl it')
    print('-'*100)
    # args = ["scrapy", "crawl", 'it']
    # while True:
    #     start = time.time()
    #     p = Process(target=cmdline.execute, args=(args,))
    #     p.start()
    #     p.join()
    #     logging.debug("### use time: %s" % (time.time() - start))
if __name__=='__main__':
    print('*'*10+'开始执行定时爬虫'+'*'*10)
    schedule.every(1).minutes.do(crawl_work)
    print('当前时间为{}'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
    print('*' * 10 + '定时爬虫开始运行' + '*' * 10)
    while True:
        schedule.run_pending()
        time.sleep(10)

# -*- coding: utf-8 -*-
from multiprocessing import Process
from scrapy import cmdline
import time
import logging

# 配置参数即可, 爬虫名称,运行频率
confs = [
    {
        "spider_name": "it",
        "frequency": 2,
    },
]


def start_spider(spider_name, frequency):
    args = ["scrapy", "crawl", spider_name]
    while True:
        start = time.time()
        p = Process(target=cmdline.execute, args=(args,))
        p.start()
        p.join()
        logging.debug("### use time: %s" % (time.time() - start))
        time.sleep(frequency)


if __name__ == '__main__':
    for conf in confs:
        process = Process(target=start_spider,args=(conf["spider_name"], conf["frequency"]))
        process.start()
        time.sleep(86400)

 

### 如何使用 FireCrawl 实现定时爬取 FireCrawl 是一种假设的爬虫框架,在此场景下可以类比为 Python 的 Scrapy 或其他类似的爬虫库。为了实现定时任务功能,通常会结合轻量级的任务调度器 APScheduler 来完成。以下是基于 APScheduler 和假定的 FireCrawl 框架实现定时爬取的一个完整示例。 #### 配置 APScheduler 进行定时爬取 APScheduler 提供了灵活的方式来定义和执行周期性任务。下面是一个完整的代码示例,展示如何通过 APScheduler 调度 FireCrawl 爬虫: ```python from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger import firecrawl # 假设这是 FireCrawl 库 def run_firecrawl_spider(): """ 启动 FireCrawl 爬虫任务。 此函数会被 APScheduler 定期调用。 """ spider = firecrawl.Spider(url="https://example.com", name="example_spider") # 初始化 Spider 对象 results = spider.start() # 开始运行爬虫并获取结果 print(f"Crawled data: {results}") # 打印抓取到的数据 # 创建后台调度器实例 scheduler = BackgroundScheduler() # 使用 CronTrigger 设置定时任务 (每天凌晨 2 点触发) trigger = CronTrigger(hour=2, minute=0) # 添加任务到调度器 scheduler.add_job(run_firecrawl_spider, trigger) # 启动调度器 scheduler.start() print("Scheduler started...") ``` 上述代码展示了如何利用 APScheduler 中的 `BackgroundScheduler` 类来创建一个后台线程调度程序,并设置了一个每日凌晨两点触发的任务[^1]。每次触发时都会调用 `run_firecrawl_spider()` 函数启动 FireCrawl 爬虫。 #### 关键点解析 - **Spider 初始化**: 在 `firecrawl.Spider` 方法中传入目标 URL 及其他参数初始化爬虫对象。 - **数据处理逻辑**: 抓取完成后可以通过返回的结果进一步存储至数据库或文件系统。 - **调度机制**: 使用 `CronTrigger` 设定精确的时间表,也可以替换为更简单的间隔时间触发器(如每小时一次)。 如果需要支持动态调整计划或者分布式环境下的高可用性,则可能还需要引入额外的技术栈,比如 Redis 或者 Kubernetes Job 控制器等。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值