使用 Scrapy-Redis 实现分布式爬虫

Scrapy 是一个强大的爬虫框架,而 Scrapy-Redis 则是其扩展,用于支持分布式爬虫。本文将手把手教你如何设置 Scrapy-Redis,并通过一个具体的流程图和代码示例,帮助你快速上手。

整体流程

步骤 描述
1 安装 Scrapy 和 Scrapy-Redis
2 创建 Scrapy 项目
3 配置项目使用 Scrapy-Redis
4 创建爬虫逻辑
5 验证分布式爬虫功能

下面我们逐步详细介绍每一个步骤。

1. 安装 Scrapy 和 Scrapy-Redis

首先,我们需要确保在我们的环境中已经安装了 Scrapy 和 Scrapy-Redis。打开终端并执行以下命令:

pip install scrapy scrapy-redis
  • scrapy:主爬虫框架。
  • scrapy-redis:扩展库,用于支持 Redis。

2. 创建 Scrapy 项目

接下来,我们需要创建一个新的 Scrapy 项目。你可以在终端中输入以下命令:

scrapy startproject myproject
  • myproject:替换为你想要的项目名称。

此时,Scrapy 会在当前目录下创建一个名为 myproject 的文件夹,并生成一系列默认文件。

3. 配置项目使用 Scrapy-Redis

打开 settings.py 文件并做如下更改:

# settings.py

# 激活 Redis 排队调度
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允许暂停的爬虫
SCHEDULER_PERSIST = True

# 指定去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# Redis 连接参数
REDIS_URL = 'redis://localhost:6379'
  • SCHEDULER:指定使用 Scrapy-Redis 的调度器。
  • SCHEDULER_PERSIST:指定是否允许停止爬虫后保持任务。
  • DUPEFILTER_CLASS:使用 Redis 的去重机制。
  • REDIS_URL:你的 Redis 连接地址。

4. 创建爬虫逻辑

spiders 文件夹中创建一个新的爬虫,命名为 my_spider.py

import scrapy
from scrapy_redis.spiders import RedisSpider

class MySpider(RedisSpider):
    name = "my_spider"
    redis_key = "my_spider:start_urls"  # Redis 中的键

    def parse(self, response):
        # 抓取响应内容
        title = response.css('title::text').get()
        yield {
            'title': title,
            'url': response.url
        }
  • MySpider:继承自 RedisSpider,用于支持分布式爬取。
  • redis_key:指定从 Redis 中读取 URL 的键。
  • parse:解析响应并提取信息。

5. 向 Redis 添加种子 URL

在命令行中,你可以使用以下命令向 Redis 存入种子 URL,这些 URL 会被 my_spider 使用:

redis-cli lpush my_spider:start_urls "
  • lpush:将 URL 推送到 Redis 列表中。
  • my_spider:start_urls:与之前 redis_key 一致的键。

验证分布式爬虫功能

现在可以用以下命令启动爬虫:

scrapy crawl my_spider

你可以在多个终端中启动多个爬虫实例,它们将共享任务,根据 Redis 消息来决定哪个爬虫来处理下一个 URL。

序列图

接下来,展示 Scrapy-Redis 整个流程的序列图:

sequenceDiagram
    participant User
    participant Scrapy
    participant Redis
    User->>Scrapy: 启动爬虫
    Scrapy->>Redis: 读取 URL
    Redis-->>Scrapy: 返回 URL
    Scrapy->>Scrapy: 访问 URL
    Scrapy->>Redis: 存储结果
    Redis-->>Scrapy: 返回成功

旅行图

这里是整个爬虫的工作旅行图:

journey
    title Scrapy 爬虫工作流
    section 初始化
      User starts the project: 5: User
      Project created: 4: Scrapy
    section 配置与启动
      Configurations set for Scrapy-Redis: 4: Scrapy
      Seed URLs pushed to Redis: 5: Redis
    section 抓取数据
      Scrapy reads URL from Redis: 4: Scrapy
      Scrapy processes the URL: 5: Scrapy
      Result stored in Redis: 4: Redis

结尾

通过上述步骤,你已经成功配置了 Scrapy-Redis,能够使用分布式爬虫进行数据抓取。Scrapy 与 Redis 的结合,使得大型爬虫任务的管理变得高效流畅。

在实际使用中,你可以根据具体需求,对爬虫的解析逻辑以及数据存储进行更深入的定制化开发。希望该教程能帮助你更好地实现自己的爬虫项目,也期望你在数据抓取的道路上越发顺利!