当django服务器运行时,每n分钟在后台运行蜘蛛

时间:2021-04-13 12:56:02

标签: django scrapy

我有一个 Django 项目。在这个项目中,有一些爬虫从一些网站上爬取数据并将其存储在数据库中。使用django,这些爬取的数据就显示出来了。

这是项目的结构:

-prj
   db.sqlite3
   manage.py
   -prj
       __init__.py
       settings.py
       urls.py
       wsgi.py
   -prj_app
       __init__.py
       prj_spider.py
       admin.py
       apps.py
       models.py
       runner.py
       urls.py
       views.py

我想在 django 服务器运行时每 5 分钟在后台运行所有蜘蛛。在 views.py 中,我导入了 runner.py,而在 runner.py 中,所有蜘蛛都开始爬行。

views.py:

from . import runner

runner.py:

from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from multiprocessing import Process, Queue
from .prj_spider import PrjSpider
from background_task import background

@background()
def run_spider(spider):
    def f(q):
        try:
            configure_logging()
            runner = CrawlerRunner()
            deferred = runner.crawl(spider)
            deferred.addBoth(lambda _: reactor.stop())
            reactor.run()
            q.put(None)
        except Exception as e:
            q.put(e)

    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    result = q.get()
    p.join()

    if result is not None:
        raise result

for spider in spiders:
    run_spider(DivarSpider, repeat=60)

运行服务器时,出现此错误:

<块引用>

TypeError: 类型类型的对象不是 JSON 可序列化的

还有这种类型的 runner.py,我得到以下错误:

runner.py:

@background()
def fetch_data():
    runner = CrawlerRunner()
    runner.crawl(PrjSpider)
    d = runner.join()
    d.addBoth(lambda _: reactor.stop())
    reactor.run()

fetch_data(repeat=60)

错误:

<块引用>

引发 error.ReactorNotRestartable()twisted.internet.error.ReactorNotRestartable

0 个答案:

没有答案