Scrapy-Redis分布式爬虫教学
时间: 2023-05-29 14:05:11 浏览: 103
Scrapy-Redis是基于Scrapy框架和Redis数据库的分布式爬虫。它是一种高效、可靠、易于扩展的解决方案,可以处理大规模的数据爬取任务。
本教学将介绍如何使用Scrapy-Redis搭建一个分布式爬虫,并通过Redis实现任务调度和数据传输。
1. 安装Scrapy-Redis
首先需要安装Scrapy-Redis库,可以通过pip命令进行安装:
```
pip install scrapy-redis
```
2. 配置Redis数据库
Scrapy-Redis需要使用Redis数据库作为数据传输和任务调度的中心。可以在本地或云服务器上安装Redis,并配置好相关参数。
在settings.py中添加Redis相关配置:
```python
REDIS_HOST = 'localhost' # Redis数据库主机
REDIS_PORT = 6379 # Redis数据库端口
REDIS_PARAMS = {'password': '123456'} # Redis数据库密码
REDIS_ENCODING = 'utf-8' # Redis数据库编码
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 去重过滤器
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 调度器
SCHEDULER_PERSIST = True # 是否持久化调度器
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue' # 优先级队列
```
3. 编写Spider
创建一个简单的Spider,用于爬取目标网站的数据。这里以爬取豆瓣电影Top250为例。
```python
import scrapy
class DoubanMovieSpider(scrapy.Spider):
name = 'douban_movie'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
for movie in response.css('.item'):
yield {
'title': movie.css('.title::text').get(),
'rating': movie.css('.rating_num::text').get(),
'link': movie.css('.hd a::attr(href)').get()
}
next_page = response.css('.next a::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
```
4. 修改Spider为RedisSpider
将Spider修改为RedisSpider,继承自RedisSpider类,并指定start_urls_key和redis_batch_size参数。
```python
import scrapy
from scrapy_redis.spiders import RedisSpider
class DoubanMovieSpider(RedisSpider):
name = 'douban_movie'
allowed_domains = ['movie.douban.com']
redis_key = 'douban_movie:start_urls'
redis_batch_size = 10
def parse(self, response):
for movie in response.css('.item'):
yield {
'title': movie.css('.title::text').get(),
'rating': movie.css('.rating_num::text').get(),
'link': movie.css('.hd a::attr(href)').get()
}
next_page = response.css('.next a::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
```
5. 添加RedisPipeline
创建一个RedisPipeline,用于将爬取到的数据保存到Redis数据库中。
```python
import json
import redis
class RedisPipeline(object):
def __init__(self, redis_host, redis_port, redis_password):
self.redis_host = redis_host
self.redis_port = redis_port
self.redis_password = redis_password
@classmethod
def from_crawler(cls, crawler):
return cls(
redis_host=crawler.settings.get('REDIS_HOST'),
redis_port=crawler.settings.get('REDIS_PORT'),
redis_password=crawler.settings.get('REDIS_PARAMS').get('password')
)
def open_spider(self, spider):
self.redis_client = redis.Redis(
host=self.redis_host,
port=self.redis_port,
password=self.redis_password
)
def close_spider(self, spider):
pass
def process_item(self, item, spider):
self.redis_client.lpush(spider.name + ':items', json.dumps(item))
return item
```
6. 启动爬虫
启动爬虫,将初始URL添加到Redis数据库中:
```
redis-cli lpush douban_movie:start_urls https://movie.douban.com/top250
```
启动爬虫:
```
scrapy crawl douban_movie
```
7. 查看爬取结果
通过Redis命令行客户端查看爬取结果:
```
redis-cli lrange douban_movie:items 0 -1
```
可以看到,爬取到的数据已经保存到Redis数据库中。
以上就是使用Scrapy-Redis搭建分布式爬虫的教学。通过Redis实现任务调度和数据传输,可以让爬虫更加高效、可靠、易于扩展。