【APSCHEDULER + SCRAPY定时爬虫】VALUEERROR: SIGNAL ONLY WORKS IN MAIN THREAD

之前一直用shell写的crontab来跑爬虫脚本
最近换了apscheduler来管理定时任务
代码大概是这个样子

import sys, os
from scrapy.cmdline import execute
from apscheduler.schedulers.blocking import BlockingScheduler


def start_scrapy():
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    execute(['scrapy', 'crawl', 'spider_name'])


sched.add_job(start_scrapy, 'interval', seconds=10)
sched.start()

结果signal报错了:


百度了很久也没找到这个错怎么搞

后来发现了一个帖子pyinstaller,scrapy和apscheduler

于是改用subprocess执行scrapy脚本

import sys, os
# from scrapy.cmdline import execute
import subprocess
from apscheduler.schedulers.blocking import BlockingScheduler


def start_scrapy():
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    # execute(['scrapy', 'crawl', 'spider_name'])
    subprocess.Popen('scrapy crawl spider_name')


sched.add_job(start_scrapy, 'interval', seconds=10)
sched.start()

结果报错:


原因是没有加上shell=True这个参数,加上之后运行成功

import sys, os
import subprocess
from apscheduler.schedulers.blocking import BlockingScheduler


def start_scrapy():
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    subprocess.Popen('scrapy crawl spider_name', shell=True)
    # 或者用run方法也行,Popen有安全隐患
    #subprocess.run(['scrapy', 'crawl', 'spider_name'])


sched.add_job(start_scrapy, 'interval', seconds=10)
sched.start()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值