• 高级深入--day45


    官方站点:GitHub - rmax/scrapy-redis: Redis-based components for Scrapy.

    scrapy-redis的官方文档写的比较简洁,没有提及其运行原理,所以如果想全面的理解分布式爬虫的运行原理,还是得看scrapy-redis的源代码才行。

    scrapy-redis工程的主体还是是redis和scrapy两个库,工程本身实现的东西不是很多,这个工程就像胶水一样,把这两个插件粘结了起来。下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统:

    1. connection.py

    负责根据setting中配置实例化redis连接。被dupefilter和scheduler调用,总之涉及到redis存取的都要使用到这个模块。

    1. # 这里引入了redis模块,这个是redis-python库的接口,用于通过python访问redis数据库,
    2. # 这个文件主要是实现连接redis数据库的功能,这些连接接口在其他文件中经常被用到
    3. import redis
    4. import six
    5. from scrapy.utils.misc import load_object
    6. DEFAULT_REDIS_CLS = redis.StrictRedis
    7. # 可以在settings文件中配置套接字的超时时间、等待时间等
    8. # Sane connection defaults.
    9. DEFAULT_PARAMS = {
    10. 'socket_timeout': 30,
    11. 'socket_connect_timeout': 30,
    12. 'retry_on_timeout': True,
    13. }
    14. # 要想连接到redis数据库,和其他数据库差不多,需要一个ip地址、端口号、用户名密码(可选)和一个整形的数据库编号
    15. # Shortcut maps 'setting name' -> 'parmater name'.
    16. SETTINGS_PARAMS_MAP = {
    17. 'REDIS_URL': 'url',
    18. 'REDIS_HOST': 'host',
    19. 'REDIS_PORT': 'port',
    20. }
    21. def get_redis_from_settings(settings):
    22. """Returns a redis client instance from given Scrapy settings object.
    23. This function uses ``get_client`` to instantiate the client and uses
    24. ``DEFAULT_PARAMS`` global as defaults values for the parameters. You can
    25. override them using the ``REDIS_PARAMS`` setting.
    26. Parameters
    27. ----------
    28. settings : Settings
    29. A scrapy settings object. See the supported settings below.
    30. Returns
    31. -------
    32. server
    33. Redis client instance.
    34. Other Parameters
    35. ----------------
    36. REDIS_URL : str, optional
    37. Server connection URL.
    38. REDIS_HOST : str, optional
    39. Server host.
    40. REDIS_PORT : str, optional
    41. Server port.
    42. REDIS_PARAMS : dict, optional
    43. Additional client parameters.
    44. """
    45. params = DEFAULT_PARAMS.copy()
    46. params.update(settings.getdict('REDIS_PARAMS'))
    47. # XXX: Deprecate REDIS_* settings.
    48. for source, dest in SETTINGS_PARAMS_MAP.items():
    49. val = settings.get(source)
    50. if val:
    51. params[dest] = val
    52. # Allow ``redis_cls`` to be a path to a class.
    53. if isinstance(params.get('redis_cls'), six.string_types):
    54. params['redis_cls'] = load_object(params['redis_cls'])
    55. # 返回的是redis库的Redis对象,可以直接用来进行数据操作的对象
    56. return get_redis(**params)
    57. # Backwards compatible alias.
    58. from_settings = get_redis_from_settings
    59. def get_redis(**kwargs):
    60. """Returns a redis client instance.
    61. Parameters
    62. ----------
    63. redis_cls : class, optional
    64. Defaults to ``redis.StrictRedis``.
    65. url : str, optional
    66. If given, ``redis_cls.from_url`` is used to instantiate the class.
    67. **kwargs
    68. Extra parameters to be passed to the ``redis_cls`` class.
    69. Returns
    70. -------
    71. server
    72. Redis client instance.
    73. """
    74. redis_cls = kwargs.pop('redis_cls', DEFAULT_REDIS_CLS)
    75. url = kwargs.pop('url', None)
    76. if url:
    77. return redis_cls.from_url(url, **kwargs)
    78. else:
    79. return redis_cls(**kwargs)
  • 相关阅读:
    MATLAB算法实战应用案例精讲-【人工智能】边缘计算(附python代码实现)
    npm i 报错 gifsicle pre-build test failed
    关于保存和恢复 View 层次结构,系统的工作流程是这样的
    【JavaSE】类与对象
    ceph分布式存储
    前端部署项目
    公网ip和私网ip的区别
    SpringBoot电商实战Day8 冒泡排序 贪心算法
    一篇文章让你没有爬不到的shipin,只有顶不住的shipin
    使用FFmpeg从音视频处理到流媒体技术的探索和实战应用
  • 原文地址:https://blog.csdn.net/qq_41813416/article/details/134224884