赞
踩
重点在读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' #这里面的值随便你定义
- #例如,你写成:"s:B" -->在redis同链接下,输入:`lpush s:B https://wangzhi.com`一样能跑
-
- 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进去,项目能跑了,就是连接成功了! 项目跑不了,就是没连接成功,那你就对着源码好好检查一下子!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。