Python中如何为Scrapy框架开发一个管理界面?

https://github.com/DormyMo/SpiderKeeper

主要实现 scrapy 工程的部署,抓取任务状态监控,定时启动爬虫等功能

支持多个 scrapyd 服务 ,方便爬虫集群的管理

后续等功能完善了之后 想支持更多爬虫框架来着


Python中如何为Scrapy框架开发一个管理界面?
19 回复

很厉害啊,用什么写的?


对于Scrapy框架的管理界面开发,我建议采用Django作为后端,通过REST API与Scrapy进行交互。下面是一个完整的实现方案:

# 1. 首先安装必要依赖
# pip install django djangorestframework scrapy

# 2. 创建Django项目和应用
# django-admin startproject scrapy_manager
# cd scrapy_manager
# python manage.py startapp spider_control

# spider_control/models.py
from django.db import models

class Spider(models.Model):
    name = models.CharField(max_length=100)
    project = models.CharField(max_length=100)
    status = models.CharField(max_length=20, default='stopped')
    last_run = models.DateTimeField(null=True, blank=True)
    
    def __str__(self):
        return self.name

# spider_control/views.py
from rest_framework import viewsets
from .models import Spider
from .serializers import SpiderSerializer
import subprocess
import threading

class SpiderViewSet(viewsets.ModelViewSet):
    queryset = Spider.objects.all()
    serializer_class = SpiderSerializer
    
    def run_spider(self, spider_name):
        """异步运行爬虫"""
        def run():
            cmd = f'scrapy crawl {spider_name}'
            subprocess.run(cmd, shell=True, cwd='/path/to/your/scrapy/project')
        
        thread = threading.Thread(target=run)
        thread.start()
        return {'status': 'started', 'spider': spider_name}

# spider_control/serializers.py
from rest_framework import serializers
from .models import Spider

class SpiderSerializer(serializers.ModelSerializer):
    class Meta:
        model = Spider
        fields = '__all__'

# spider_control/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import SpiderViewSet

router = DefaultRouter()
router.register(r'spiders', SpiderViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
]

# 前端界面示例 (templates/spider_control/index.html)
"""
<!DOCTYPE html>
<html>
<head>
    <title>Scrapy Manager</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <h1>爬虫管理界面</h1>
        <div v-for="spider in spiders" :key="spider.id">
            <h3>{{ spider.name }}</h3>
            <p>状态: {{ spider.status }}</p>
            <button @click="runSpider(spider.name)">运行</button>
        </div>
    </div>
    
    <script>
        const { createApp } = Vue;
        
        createApp({
            data() {
                return {
                    spiders: []
                }
            },
            mounted() {
                this.fetchSpiders();
            },
            methods: {
                async fetchSpiders() {
                    const response = await fetch('/api/spiders/');
                    this.spiders = await response.json();
                },
                async runSpider(spiderName) {
                    await fetch(`/api/spiders/run/${spiderName}/`, {
                        method: 'POST'
                    });
                    alert('爬虫已启动');
                }
            }
        }).mount('#app');
    </script>
</body>
</html>
"""

# 3. 创建Scrapy项目集成脚本
# scrapy_integration.py
import os
import json
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerRunner
from twisted.internet import reactor

def get_spider_list(project_path):
    """获取Scrapy项目中的所有爬虫"""
    os.chdir(project_path)
    from scrapy.utils.spider import iter_spider_classes
    from scrapy import spiderloader
    from scrapy.utils.project import get_project_settings
    
    settings = get_project_settings()
    spider_loader = spiderloader.SpiderLoader.from_settings(settings)
    spiders = spider_loader.list()
    return [spider for spider in spiders]

# 4. 在Django中集成
# spider_control/management/commands/sync_spiders.py
from django.core.management.base import BaseCommand
from spider_control.models import Spider

class Command(BaseCommand):
    help = '同步Scrapy项目中的爬虫到数据库'
    
    def handle(self, *args, **options):
        from scrapy_integration import get_spider_list
        
        spiders = get_spider_list('/path/to/your/scrapy/project')
        for spider_name in spiders:
            Spider.objects.get_or_create(
                name=spider_name,
                defaults={'project': 'my_scrapy_project'}
            )
        self.stdout.write(f'同步了 {len(spiders)} 个爬虫')

这个方案的核心思路是:用Django提供管理界面和API,通过子进程调用Scrapy命令来运行爬虫。前端可以用Vue/React等框架实现交互界面,后端通过Django REST Framework提供API。

建议:用Django+DRF搭建管理后台,通过API控制Scrapy进程。

看着比 scrapyd 要好用…

v2 上真是爬虫玩家多 而且高端玩家多

怒赞。

windows 系统可以用不?

第 111 个赞

应该可以,没测试过

ui 可以的

哈哈,前排支持

先赞一个!

楼主强大,做成了我一直想做但却做不成的事,前排支持,然后给星

非常好用!
作者的 Issues 回复的也很快

请问,上传那个 egg 是 build-egg 生成的 egg,还是 scrapyd-deploy 成功之后自己生成的那个 egg 文件

爬出来的数据放在 dbs 里面的 sqlite 数据库了吗?可是用可视化工具读不出来数据。

不错,就是删除任务再新建,会提示达到最大工作量,而且人物也删除不掉

我想知道你是用了什么 python 的管理框架吗。

回到顶部