Scrapy 网络爬虫框架部署教程

Scrapy 是 Python 生态中功能最强大的网络爬虫框架,提供了完整的请求调度、数据提取、管道处理和导出机制。将 Scrapy 部署在搬瓦工 VPS 上可以实现 24 小时不间断的数据采集任务,配合定时调度还能实现自动化监控和数据更新。本教程将从零开始介绍如何在搬瓦工 VPS 上搭建 Scrapy 开发环境并运行爬虫项目。

一、环境准备

Scrapy 基于 Python 运行,建议使用 Python 3.8 以上版本。搬瓦工 VPS 推荐安装 Ubuntu 22.04 系统。

1.1 安装 Python 和依赖

apt update && apt upgrade -y
apt install python3 python3-pip python3-venv python3-dev build-essential libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev -y

确认 Python 版本:

python3 --version

1.2 创建虚拟环境

使用虚拟环境可以隔离项目依赖,避免与系统 Python 包冲突:

mkdir -p /opt/scrapy-projects && cd /opt/scrapy-projects
python3 -m venv venv
source venv/bin/activate

1.3 安装 Scrapy

pip install scrapy
scrapy version

二、创建 Scrapy 项目

2.1 初始化项目

scrapy startproject myspider
cd myspider

项目结构如下:

myspider/
├── scrapy.cfg
└── myspider/
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders/
        └── __init__.py

2.2 创建 Spider

scrapy genspider example example.com

编辑 myspider/spiders/example.py,编写爬取逻辑:

import scrapy

class ExampleSpider(scrapy.Spider):
    name = 'example'
    allowed_domains = ['example.com']
    start_urls = ['https://example.com']

    def parse(self, response):
        for item in response.css('div.content'):
            yield {
                'title': item.css('h2::text').get(),
                'link': item.css('a::attr(href)').get(),
                'description': item.css('p::text').get(),
            }

        next_page = response.css('a.next::attr(href)').get()
        if next_page:
            yield response.follow(next_page, self.parse)

三、配置 Scrapy 项目

3.1 基础设置

编辑 myspider/settings.py 文件,配置关键参数:

# 遵守 robots.txt
ROBOTSTXT_OBEY = True

# 下载延迟(秒),避免对目标站点造成过大压力
DOWNLOAD_DELAY = 2

# 并发请求数
CONCURRENT_REQUESTS = 8

# 设置 User-Agent
USER_AGENT = 'Mozilla/5.0 (compatible; MyBot/1.0)'

# 启用自动限速
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 10
AUTOTHROTTLE_TARGET_CONCURRENCY = 2.0

# 日志级别
LOG_LEVEL = 'INFO'
LOG_FILE = '/var/log/scrapy.log'

3.2 定义 Item

编辑 myspider/items.py,定义数据结构:

import scrapy

class MyspiderItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    description = scrapy.Field()
    crawl_time = scrapy.Field()

3.3 配置 Pipeline

编辑 myspider/pipelines.py,实现数据处理逻辑:

import json
from datetime import datetime

class JsonExportPipeline:
    def open_spider(self, spider):
        self.file = open('/opt/scrapy-projects/output/data.jsonl', 'a')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        item['crawl_time'] = datetime.now().isoformat()
        line = json.dumps(dict(item), ensure_ascii=False) + '\n'
        self.file.write(line)
        return item

settings.py 中启用 Pipeline:

ITEM_PIPELINES = {
    'myspider.pipelines.JsonExportPipeline': 300,
}

四、运行与数据导出

4.1 运行爬虫

mkdir -p /opt/scrapy-projects/output
scrapy crawl example

4.2 直接导出数据

Scrapy 支持多种格式的数据导出:

# 导出为 JSON 文件
scrapy crawl example -o output/result.json

# 导出为 CSV 文件
scrapy crawl example -o output/result.csv

# 导出为 JSON Lines 格式
scrapy crawl example -o output/result.jsonl

五、数据库存储

对于大量数据采集任务,建议将数据写入数据库。以下示例将数据存储到 SQLite:

pip install sqlite3

在 Pipeline 中添加数据库存储逻辑:

import sqlite3

class SQLitePipeline:
    def open_spider(self, spider):
        self.conn = sqlite3.connect('/opt/scrapy-projects/output/data.db')
        self.cursor = self.conn.cursor()
        self.cursor.execute('''
            CREATE TABLE IF NOT EXISTS items (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                title TEXT,
                link TEXT,
                description TEXT,
                crawl_time TEXT
            )
        ''')
        self.conn.commit()

    def close_spider(self, spider):
        self.conn.close()

    def process_item(self, item, spider):
        self.cursor.execute('''
            INSERT INTO items (title, link, description, crawl_time)
            VALUES (?, ?, ?, ?)
        ''', (item.get('title'), item.get('link'),
              item.get('description'), item.get('crawl_time')))
        self.conn.commit()
        return item

六、定时任务调度

使用 cron 定时执行爬虫任务,实现自动化数据采集:

# 编辑 crontab
crontab -e

# 每天凌晨 3 点运行爬虫
0 3 * * * cd /opt/scrapy-projects/myspider && /opt/scrapy-projects/venv/bin/scrapy crawl example -o /opt/scrapy-projects/output/data_$(date +\%Y\%m\%d).json 2>&1 >> /var/log/scrapy-cron.log

七、使用 Scrapyd 部署

Scrapyd 是 Scrapy 的官方部署工具,提供 HTTP API 管理爬虫:

pip install scrapyd scrapyd-client

启动 Scrapyd 服务:

scrapyd &

使用 systemd 管理 Scrapyd:

cat > /etc/systemd/system/scrapyd.service <<EOF
[Unit]
Description=Scrapyd Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/scrapy-projects
ExecStart=/opt/scrapy-projects/venv/bin/scrapyd
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable scrapyd
systemctl start scrapyd

部署爬虫到 Scrapyd:

cd /opt/scrapy-projects/myspider
scrapyd-deploy default -p myspider

通过 API 调度爬虫:

# 启动爬虫
curl http://localhost:6800/schedule.json -d project=myspider -d spider=example

# 查看任务状态
curl http://localhost:6800/listjobs.json?project=myspider

# 取消任务
curl http://localhost:6800/cancel.json -d project=myspider -d job=JOB_ID

八、常见问题

请求被目标网站封禁

可以配置代理中间件和随机 User-Agent:

pip install scrapy-fake-useragent

settings.py 中启用:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
}

内存占用过高

对于大规模爬取任务,建议开启内存调试并设置限制:

MEMUSAGE_ENABLED = True
MEMUSAGE_LIMIT_MB = 512
MEMUSAGE_NOTIFY_MAIL = []
CLOSESPIDER_ITEMCOUNT = 100000

总结

Scrapy 是一个成熟且高效的网络爬虫框架,结合搬瓦工 VPS 的稳定网络环境,可以轻松构建自动化数据采集系统。部署时请务必遵守目标网站的 robots.txt 规则和相关法律法规,合理设置爬取频率。搬瓦工 VPS 的购买可参考 全部方案 页面,使用优惠码 NODESEEK2026 享受 6.77% 的折扣。如需在 VPS 上安装 Docker 环境,请参考 Docker 安装教程

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。