scrapy-redis分布式爬虫框架
时间: 2024-12-31 21:38:10 浏览: 45
### Scrapy-Redis 分布式爬虫框架概述
Scrapy-Redis 是一个扩展库,旨在使多个 Scrapy 爬虫实例共享相同的待爬取 URL 队列以及已处理过的指纹记录。这使得不同机器上的多个爬虫可以协同工作,从而提高效率并减少资源浪费[^1]。
#### 主要特性
- **URL 调度器集成**:通过配置 `SCHEDULER` 参数为 `'scrapy_redis.scheduler.Scheduler'` 来启用 Redis 作为调度器。
- **请求去重机制**:利用 Redis 的集合数据结构来存储已经访问过页面的唯一标识符(通常是哈希后的 URL 或者其他形式的指纹)。设置项 `DUPEFILTER_CLASS='scrapy_redis.dupefilter.RFPDupeFilter'` 可以激活此功能[^3]。
- **持久化支持**:即使在爬虫意外终止的情况下也能保持进度不变,因为所有的状态都保存到了 Redis 中。当重启服务时可以从上次停止的地方继续执行任务。
#### 安装与基本配置
为了开始构建基于 Scrapy 和 Redis 的分布式爬虫应用,首先需要安装必要的依赖包:
```bash
pip install scrapy-redis
```
接着,在项目的 settings 文件里加入如下几行代码来进行初始化配置:
```python
# 启用 Redis 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 不清除 Redis 队列中的请求队列, 允许暂停/恢复运行
SCHEDULER_PERSIST = True
# 设置请求去重类
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 将所有抓取到的数据保存至指定的 Redis 键名下
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,
}
# 连接本地 Redis 实例,默认端口6379
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
```
#### 创建简单的 Spider 示例
下面是一个非常基础的例子展示如何定义一个新的 Spider 类继承自 `CrawlSpider` 并将其连接到 Redis 上面:
```python
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.utils import bytes_to_str
class ExampleSpider(CrawlSpider):
name = 'example_spider'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
Rule(LinkExtractor(allow=r'/page/\d+$'), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = {}
# 提取所需字段...
yield item
if __name__ == '__main__':
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'FEED_FORMAT': 'json',
'FEED_URI': 'items.json',
'LOG_LEVEL': 'INFO',
'DOWNLOAD_DELAY': 2,
'CONCURRENT_REQUESTS_PER_DOMAIN': 8,
# 添加 Scrapy-Redis 特定选项
'SCHEDULER': "scrapy_redis.scheduler.Scheduler",
'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter"
})
process.crawl(ExampleSpider)
process.start()
```
上述例子展示了怎样创建一个名为 `example_spider` 的爬虫,并指定了它应该遵循哪些链接模式 (`Rule`) 。每当匹配成功的链接被发现时就会调用 `parse_item()` 方法进一步解析目标网页内容。
阅读全文
相关推荐


















