爬虫:(在这里不用配置start_url,直接可以取redis里面取start_url,可以多个)
from   scrapy_redis.spiders import RedisSpider
# class ChoutiSpider(scrapy.Spider):
class ChoutiSpider(RedisSpider):
name = 'baidu'##在这里设置了这个name,那么在redispider里面就可以按照这个key来找到里面对应的值(开始url,可能多个),
  #key的格式是:self.redis_key = self.redis_key % {'name': self.name}
allowed_domains = ['baidu.com']
  def parse(self, response):
  print('执行操作')
  print(response)
在settings里面的配置:
#true的话,就是集合,false的话,就为列表
REDIS_START_URLS_AS_SET=False#默认是false,列表的格式取数据出来
# REDIS_START_URLS_KEY = '%(name)s:start_urls'#不设置默认是这个,这个是存入redis里面的key,可以根据这来取value,例如:baidu:start_urls
如果是列表的话,取数据是lpop(key),key就是下面的这个
如果是集合的话,集合取数据是spop(key),例如:spop('baidu:start_urls')>>后面就是对应的全部的开始url(可以多个)

redis存入开始url:

在了一个.py文件里面存入开始url 列表:
import  redis
conn=redis.Redis(host='127.0.0.1',port=6379)
conn.lpush('baidu:start_urls','http://www.baidu.com')
如果是settings里面:
REDIS_START_URLS_AS_SET=False的话,就是列表的形式,存入就是lpush或者是rpush等操作
如果是true的话,那么存入就是集合的形式,sadd等操作
集合:
import  redis
conn=redis.Redis(host='127.0.0.1',port=6379)
conn.sadd('baidu:start_urls','http://www.baidu.com')##按照这个格式来存数据的
print(conn.smembers('baidu:start_urls'))

scrapy_redis里面的spider源码分析:
class RedisMixin(object):
"""Mixin class to implement reading urls from a redis queue."""
redis_key = None
redis_batch_size = None
redis_encoding = None # Redis client placeholder.
server = None def start_requests(self):
"""Returns a batch of start requests from redis."""
return self.next_requests() def setup_redis(self, crawler=None):
"""Setup redis connection and idle signal. This should be called after the spider has set its crawler object.
"""
if self.server is not None:
return if crawler is None:
# We allow optional crawler argument to keep backwards
# compatibility.
# XXX: Raise a deprecation warning.
crawler = getattr(self, 'crawler', None) if crawler is None:
raise ValueError("crawler is required") settings = crawler.settings #####去配置文件里面那这个其始url,START_URLS_KEY = '%(name)s:start_urls',如果没有配置文件的话,就读取后面部分
if self.redis_key is None:
self.redis_key = settings.get(
'REDIS_START_URLS_KEY', defaults.START_URLS_KEY,
)##在这里可以自己设置这个格式,REDIS_START_URLS_KEY在settigs里面设置成自己想要保存的格式,注意:自己就按照这个
,格式进行保存,下面就以这个格式作为键进行查找到相对应的全部的开始url self.redis_key = self.redis_key % {'name': self.name}####在这里设置这个name的redis查询的key,如果在redis里面有这个key存在的话,就取出里面的值进行查找
'''
所以可以自己在添加开始到这个name里面去,这个key格式是固定的,START_URLS_KEY = '%(name)s:start_urls'''
######写入redis的这个key里面存进去,里面可以放url,多个,然后拿到多个开始的url
if not self.redis_key.strip():
raise ValueError("redis_key must not be empty") if self.redis_batch_size is None:
# TODO: Deprecate this setting (REDIS_START_URLS_BATCH_SIZE).
self.redis_batch_size = settings.getint(
###取配置文件里面取值,后面是int的类型,转化为int的类型
'REDIS_START_URLS_BATCH_SIZE',
settings.getint('CONCURRENT_REQUESTS'),
) try:
self.redis_batch_size = int(self.redis_batch_size)
except (TypeError, ValueError):
raise ValueError("redis_batch_size must be an integer") if self.redis_encoding is None:
self.redis_encoding = settings.get('REDIS_ENCODING', defaults.REDIS_ENCODING) self.logger.info("Reading start URLs from redis key '%(redis_key)s' "
"(batch size: %(redis_batch_size)s, encoding: %(redis_encoding)s",
self.__dict__) self.server = connection.from_settings(crawler.settings)
# The idle signal is called when the spider has no requests left,
# that's when we will schedule new requests from redis queue
crawler.signals.connect(self.spider_idle, signal=signals.spider_idle) def next_requests(self):
"""Returns a request to be scheduled or none."""
use_set = self.settings.getbool('REDIS_START_URLS_AS_SET', defaults.START_URLS_AS_SET)
fetch_one = self.server.spop if use_set else self.server.lpop
##做了判断,如果是REDIS_START_URLS_AS_SET=True得话,那么就为集合
##做了判断,如果是REDIS_START_URLS_AS_SET=False得话,那么就为列表
# XXX: Do we need to use a timeout here?
found = 0
# TODO: Use redis pipeline execution.
####在下面进行寻找,如果存在这个redis_key的话,就执行,有多个就执行多个其实url, ''''
下面是一直循环着,看有没有其实url,在redis里面,这个格式是,REDIS_START_URLS_KEY = '%(name)s:start_urls'>>
当为false的时候,就是以列表的形式查找
conn.lpush('baidu:start_urls','http://www.baidu.com')
当true的时候,就是集合 '''
while found < self.redis_batch_size:
data = fetch_one(self.redis_key)##可能是spop或者是lpop
if not data:
# Queue empty.
break
req = self.make_request_from_data(data)
if req:
yield req
found += 1
else:
self.logger.debug("Request not made from data: %r", data) if found:
self.logger.debug("Read %s requests from '%s'", found, self.redis_key) def make_request_from_data(self, data):
"""Returns a Request instance from data coming from Redis. By default, ``data`` is an encoded URL. You can override this method to
provide your own message decoding. Parameters
----------
data : bytes
Message from redis. """
url = bytes_to_str(data, self.redis_encoding)
return self.make_requests_from_url(url) def schedule_next_requests(self):
"""Schedules a request if available"""
# TODO: While there is capacity, schedule a batch of redis requests.
for req in self.next_requests():
self.crawler.engine.crawl(req, spider=self) def spider_idle(self):
"""Schedules a request if available, otherwise waits."""
# XXX: Handle a sentinel to close the spider.
self.schedule_next_requests()
raise DontCloseSpider

  

定制起始url(scrapy_redis)的更多相关文章

  1. python - scrapy 爬虫框架 ( 起始url的实现,深度和优先级,下载中间件 )

    1.  start_urls  --  起始URL 的内部实现(将迭代器转换为生成器) class QSpider(scrapy.Spider): name = 'q' allowed_domains ...

  2. Scarpy 起始url 自定义代理 自定义去重规则

    - start_urls - 内部原理 """ scrapy引擎来爬虫中去起始的URL: 1. 调用start_requests并获取返回值 2. v = iter(返回 ...

  3. Scrapy定制起始请求

    Scrapy引擎来爬虫中取起始的URL 1.调用start_requests方法(父类),并获取返回值 2.将放回值变成迭代器,通过iter() 3.执行__next__()方法取值 4.把返回值全部 ...

  4. Scrapy-redis 组件

    scrapy-redis 简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 特征 分布式爬取 可以启动多个spider工程,相互之间 ...

  5. Scrapy入门操作

    一.安装Scrapy: 如果您还未安装,请参考https://www.cnblogs.com/dalyday/p/9277212.html 二.Scrapy基本配置 1.创建Scrapy程序 cd D ...

  6. scrapy_redis使用介绍

    scrapy_redis是一个基于redis的scrapy组件,通过它可以快速实现简单的分布式爬虫程序,该组件主要提供三大功能: (1)dupefilter——URL去重规则(被调度器使用) (2)s ...

  7. iOS 打开本地 其他应用程序(URL Types)

    iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...

  8. ken桑带你读源码 之 scrapy_redis

    首先更大家说下  正式部署上线的爬虫会有分布式爬虫的需求  而且原本scrapy 的seen (判断重复url的池  不知道用啥词  已抓url吧 )  保存在磁盘 url 队列 也是保存在磁盘 (保 ...

  9. 解读Scrapy框架

    Scrapy框架基础:Twsited Scrapy内部基于事件循环的机制实现爬虫的并发.原来: url_list = ['http://www.baidu.com','http://www.baidu ...

随机推荐

  1. 错误 3 未找到类型“sdk:Label”。请确保不缺少程序集引用并且已生成所有引用的程序集。

    错误: 错误 3 未找到类型“sdk:Label”.请确保不缺少程序集引用并且已生成所有引用的程序集. 错误 1 命名空间“http://schemas.microsoft.com/winfx/200 ...

  2. SQL Server进阶(六)表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数

    概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...

  3. mybatis-servlet.xml配置SpringMVC样板

    <?xml version="1.0" encoding="UTF-8" ?><beans xmlns:xsi="http://ww ...

  4. Docker 容器的隔离性

    Docker 容器的隔离性 就是 使用Linux namespace 来隔离运行环境和成 cgroup 限制容器使用的资源.  namespace 可以顾名思义 命名空间:所以可以理解为每个独立的容器 ...

  5. ue4配置分析记录

    相关代码 UObject::CallFunctionByNameWithArguments  ExecuteConsoleCommand << 配置.ini[???.类名]    //要先 ...

  6. cocos2dx 动画控制概要

    -------------------------------------------------Cocos2d 播放动画Node : 节点,所有显示容器的基础 Sprite : 使用图片的节点 An ...

  7. 例:判断是不是自有属性hasOwnProperty方法

    自有属性和共有属性: 自有属性:直接保存在对象本地的属性 共有属性:保存在原型对象中,被所有子对象共享的属性 获取时:都可用对象.属性方法 赋值时:自有属性,必须:对象.属性 = 值 共有属性,必须: ...

  8. (2)Java数据结构--二叉树 -和排序算法实现

    === 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDe ...

  9. 二进制学习 wsample01a.exe

    有趣的二进制学习 wsample01a.exe 这是一个基础的入门小程序,点击运行后发现弹出小框,Hello! Windows 用ida静态分析程序,这一段是程序的主逻辑,也是全部逻辑:) 可以看到程 ...

  10. MySql cmd下的学习笔记 —— 有关子查询的操作(where型,from型,exists型子查询)

    先找到goods表 查询goods_id最大的商品 where型的子查询 查询goods_id最大的商品(不能用排序) 把两步写成一步,就是子查询 from型子查询 查找出每种cat_id下goods ...