Scrapyrt实战指南 - 将爬虫转换为HTTP API服务

📂 所属阶段:第五阶段 — 战力升级(分布式与进阶篇)
🔗 相关章节:Scrapy-Redis分布式架构 · Docker容器化爬虫

你有没有遇到这种情况:写好了一个完美的Scrapy爬虫,却不知道怎么快速丢给后端/前端/第三方调用?或者想做个「输入URL→返回数据」的实时接口,又不想从零搭Flask/Django服务?今天这篇指南3分钟帮你搞定所有事!


🎯 Scrapyrt是什么

Scrapyrt(Scrapy Real-Time)是官方维护的轻量级插件,无需改一行爬虫代码,就能把Scrapy项目转成RESTful API服务,适合:

  1. 用户触发的「即时按需爬取」
  2. 微服务架构里的「数据采集组件」
  3. API网关后的「安全数据接口」

核心优势就4个:服务化架构、无状态易扩展、JSON格式通信、与现有Scrapy项目兼容。


🚀 3分钟快速启动

1. 准备环境与项目

# 1.1 安装(Python 3.6+)
pip install scrapy scrapyrt

# 1.2 快速创建一个极简示例Scrapy项目
scrapy startproject demo_spider
cd demo_spider
scrapy genspider example example.com

2. 改一行爬虫代码(支持动态URL)

打开 demo_spider/spiders/example.py,修改 start_requests 方法:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    
    # 核心修改:支持通过API传递的url参数
    def start_requests(self):
        urls = getattr(self, 'url', None)
        if urls:
            urls = [urls] if isinstance(urls, str) else urls
            for url in urls:
                yield scrapy.Request(url, callback=self.parse)
    
    def parse(self, response):
        yield {
            'url': response.url,
            'title': response.css('title::text').get().strip(),
            'status': response.status
        }

3. 启动服务

# 在demo_spider根目录下执行(默认端口6023)
scrapyrt

4. 验证服务

用浏览器或curl访问:

curl "http://localhost:6023/crawl.json?spider_name=example&url=https://httpbin.org/get"

你会立刻看到带数据的JSON响应!


🔌 核心API怎么用

Scrapyrt主要有2个核心端点(砍了非高频的):

1. /crawl.json(同步爬取,最常用)

GET请求,参数简单,适合小数据量、短时间的爬取任务:

参数名作用是否必填
spider_name爬虫名
url爬取URL
max_requests最大请求数(限制深度)
crawl_args传给爬虫的额外参数(JSON字符串)

2. /crawl.json/request(POST自定义Request)

POST请求,支持自定义Headers、Cookies、Meta等,适合复杂场景:

curl -X POST http://localhost:6023/crawl.json/request \
  -H "Content-Type: application/json" \
  -d '{
    "spider_name": "example",
    "request": {
      "url": "https://httpbin.org/headers",
      "headers": {"User-Agent": "Custom Spider 1.0"},
      "meta": {"custom_key": "custom_value"}
    }
  }'

🐍 Python极简客户端

不用手写curl,封装个10行左右的客户端就行:

import requests

class ScrapyrtClient:
    def __init__(self, base_url="http://localhost:6023"):
        self.base_url = base_url.rstrip('/')
    
    def crawl(self, spider_name, url, **kwargs):
        params = {"spider_name": spider_name, "url": url, **kwargs}
        resp = requests.get(f"{self.base_url}/crawl.json", params=params, timeout=300)
        resp.raise_for_status()
        return resp.json()

# 使用示例
client = ScrapyrtClient()
result = client.crawl("example", "https://httpbin.org/get")
print(result['items'][0]['title'])

🔒 快速安全加固

生产环境必须做这3步:

1. 用Nginx做反向代理(+ HTTPS)

把Scrapyrt放内网,只暴露Nginx端口:

# nginx.conf 简单配置
server {
    listen 443 ssl;
    server_name your-domain.com;

    # SSL证书(用Let's Encrypt免费的就行)
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        # 只允许固定IP访问
        allow 123.45.67.89;
        deny all;
        proxy_pass http://127.0.0.1:6023;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 加简单的API Key验证

Nginx可以通过 auth_request 做,或者快速改下Scrapyrt的启动代码(临时方案)。


🐳 Docker一键部署

标准化部署的首选,直接用Dockerfile:

# Dockerfile
FROM python:3.9-slim

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y gcc libxml2-dev libxslt1-dev \
    && rm -rf /var/lib/apt/lists/*

# 复制项目文件
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 安装Scrapyrt
RUN pip install scrapyrt

# 复制爬虫代码
COPY . .

# 暴露端口
EXPOSE 6023

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
    CMD curl -f http://localhost:6023/ || exit 1

# 启动命令
CMD ["scrapyrt", "-p", "6023", "-i", "/app"]

然后创建 requirements.txt,最后构建运行:

docker build -t scrapyrt-demo .
docker run -d -p 6023:6023 --name scrapyrt-container scrapyrt-demo

❌ 高频问题排查

1. 端口被占用

# 检查端口占用
lsof -i :6023
# 或换端口启动
scrapyrt -p 6024

2. 爬虫超时

修改启动参数或爬虫的 settings.py

# 启动参数:增加整体超时(秒)
scrapyrt -p 6023 --timeout 600

# settings.py:增加下载超时
DOWNLOAD_TIMEOUT = 120

3. 返回数据太大

限制单个任务的请求数:

curl "http://localhost:6023/crawl.json?spider_name=example&url=xxx&max_requests=5"

💡 核心最佳实践

  1. 容器化部署:隔离环境,快速扩展
  2. Nginx反向代理:加HTTPS、IP白名单、速率限制
  3. 限制资源:每个任务加 max_requests、整体并发加 --max-concurrent-requests
  4. 日志管理:用Docker的日志驱动或 logrotate 管理
  5. 健康检查:及时发现服务异常并重启

🏷️ 标签云: Scrapyrt HTTP API 实时爬虫 微服务 按需爬取 Docker部署