爬虫工作量由小到大的思维转变---<第三十一章 Scrapy Redis 初启动/conn说明书)>

发布时间:2023年12月28日

前言:

重点在读connection.py的源码,这个组件主要是用来连接的; 因为连接都无法做到,后面想更改点自定义就白扯了;

正文:

翻译版的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)

介绍

该模块包含两个主要的函数:
  • get_redis_from_settings(settings):
    • 该函数从Scrapy的设置对象中获取Redis客户端实例。它使用get_client来实例化客户端,并使用默认参数值 defaults.REDIS_PARAMS。您可以通过设置REDIS_PARAMS来覆盖这些默认值。此函数允许您通过设置Scrapy的设置来轻松配置和创建Redis连接。
  • get_redis(**kwargs):
    • 该函数返回一个Redis客户端实例。它使用提供的参数来初始化实例。如果提供了url参数,则通过redis_cls.from_url方法来实例化类。否则,它使用提供的参数来构造Redis客户端实例。

-------这些函数的目的是为了在Scrapy中与Redis服务器进行交互,例如在分布式爬虫中使用Redis作为任务队列、存储爬取的数据等;

案例:

1. 创建一个Scrapy项目:

scrapy startproject myproject
cd myproject


?

2. 在Scrapy项目的根目录下,创建一个新的Spider,并将Redis相关的配置添加到Scrapy的设置文件中(settings.py):

# 启用Scrapy-Redis插件
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 指定Redis连接信息
REDIS_URL = 'redis://127.0.0.1:6379'

3. 创建一个Spider,使用Redis进行分布式爬取:

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`方法进行爬取和解析。

4. 在Scrapy项目的主文件(main.py)中,导入并使用`get_redis_from_settings`函数来获取Redis连接实例:
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进去,项目能跑了,就是连接成功了!? 项目跑不了,就是没连接成功,那你就对着源码好好检查一下子!

文章来源:https://blog.csdn.net/m0_56758840/article/details/135254939
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。