我有一个 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