重点在读connection.py的源码,这个组件主要是用来连接的; 因为连接都无法做到,后面想更改点自定义就白扯了;
import sys
import six
from scrapy.utils.misc import load_object
from . import defaults
# 快捷方式映射 '设置名称' -> '参数名称'
SETTINGS_PARAMS_MAP = {
'REDIS_URL': 'url',
'REDIS_HOST': 'host',
'REDIS_PORT': 'port',
'REDIS_DB': 'db',
'REDIS_ENCODING': 'encoding',
}
if sys.version_info > (3,):
SETTINGS_PARAMS_MAP['REDIS_DECODE_RESPONSES'] = 'decode_responses'
def get_redis_from_settings(settings):
"""从给定的Scrapy设置对象返回一个redis客户端实例。
此函数使用``get_client``来实例化客户端,并使用``defaults.REDIS_PARAMS``作为参数的默认值。
您可以使用``REDIS_PARAMS``设置来覆盖它们。
参数
----------
settings : Settings
一个Scrapy设置对象。参见下面支持的设置。
返回
-------
server
Redis客户端实例。
其他参数
----------------
REDIS_URL : str, 可选
服务器连接URL。
REDIS_HOST : str, 可选
服务器主机。
REDIS_PORT : str, 可选
服务器端口。
REDIS_DB : int, 可选
服务器数据库。
REDIS_ENCODING : str, 可选
数据编码。
REDIS_PARAMS : dict, 可选
其他客户端参数。
Python 3 Only
----------------
REDIS_DECODE_RESPONSES : bool, 可选
设置`decode_responses` kwarg在Redis cls的构造函数中。
"""
params = defaults.REDIS_PARAMS.copy()
params.update(settings.getdict('REDIS_PARAMS'))
# XXX: Deprecate REDIS_* settings.
for source, dest in SETTINGS_PARAMS_MAP.items():
val = settings.get(source)
if val:
params[dest] = val
# 允许 ``redis_cls`` 是一个类的路径。
if isinstance(params.get('redis_cls'), six.string_types):
params['redis_cls'] = load_object(params['redis_cls'])
return get_redis(**params)
# 向后兼容的别名。
from_settings = get_redis_from_settings
def get_redis(**kwargs):
"""返回一个redis客户端实例。
参数
----------
redis_cls : class, 可选
默认值为 ``redis.StrictRedis``。
url : str, 可选
如果给定,将使用``redis_cls.from_url``来实例化该类。
**kwargs
要传递给``redis_cls``类的额外参数。
返回
-------
server
Redis客户端实例。
"""
redis_cls = kwargs.pop('redis_cls', defaults.REDIS_CLS)
url = kwargs.pop('url', None)
if url:
return redis_cls.from_url(url, **kwargs)
else:
return redis_cls(**kwargs)
-------这些函数的目的是为了在Scrapy中与Redis服务器进行交互,例如在分布式爬虫中使用Redis作为任务队列、存储爬取的数据等;
scrapy startproject myproject
cd myproject
?
# 启用Scrapy-Redis插件
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 指定Redis连接信息
REDIS_URL = 'redis://127.0.0.1:6379'
import scrapy
from scrapy_redis.spiders import RedisSpider
class MySpider(RedisSpider):
? ? name = 'myspider'
? ? redis_key = 'myspider:start_urls'
? ? def parse(self, response):
? ? ? ? # 处理爬取到的数据
? ? ? ? # ...
? ? ? ? yield scrapy.Request(url, callback=self.parse)
在这个例子中,我们先继承`RedisSpider`类来创建我们的Spider。`redis_key`属性指定了初始URL在Redis中的键。Scrapy-Redis插件会自动从该键读取URL,并且使用`parse`方法进行爬取和解析。
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy_redis import get_redis_from_settings
from myproject.myspider import MySpider
# 获取Redis连接实例
settings = scrapy.settings.Settings()
redis_conn = get_redis_from_settings(settings)
# 创建CrawlerProcess
process = CrawlerProcess(settings)
process.crawl(MySpider, redis_conn=redis_conn)
process.start()
通过使用`get_redis_from_settings`函数,我们从Scrapy的设置对象中获取Redis连接实例。然后,我们可以将该连接实例传递给我们的Spider,并使用`redis_conn`参数进行配置。最后,我们使用`CrawlerProcess`来创建和启动爬虫进程。
一般来说,这么操作一番下来! 你丢个起始url进去,项目能跑了,就是连接成功了!? 项目跑不了,就是没连接成功,那你就对着源码好好检查一下子!