scrapy-redis 安装 及使用 结合例子解释

scrapy-redis安装及配置

scrapy-redis 的安装

pip install scrapy-redis

easy_install scrapy-redis

下载

http://redis.io/download

版本推荐

stable 3.0.2

运行redis

redis-server redis.conf

清空缓存

redis-cli flushdb

scrapy配置redis

settings.py配置redis(在scrapy-redis 自带的例子中已经配置好)

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

SCHEDULER_PERSIST = True

SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'

REDIS_URL = None # 一般情况可以省去

REDIS_HOST = '127.0.0.1' # 也可以根据情况改成 localhost

REDIS_PORT = 6379

在scrapy中使用scrapy-redis

spider 继承RedisSpider

class tempSpider(RedisSpider)  

name = "temp"

redis_key  = ''temp:start_url"

启动redis

在redis的src目录下,执行 ./redis-server启动服务器

执行 ./redis-cli 启动客户端

设置好setting.py的redis 的ip和端口

启动scropy-redis的代码;

如启动name= "lhy",start_urls="lhy:start_urls" 的spider。

如果在redis中没有 主键为lhy:start_urls 的list,则爬虫已只监听等待。

此时,在redis客户端执行:lpush lhy:start_urls   http://blog.csdn.net/u013378306/article/details/53888173

可以看到爬虫开始抓取。在 redis客户端下输入 keys *,查看所有主键

原来的 lhy:start_urls 已经被自动删除,并新建了 一个lhy:dupefilter (set),一个 lhy:items (list), 一个 lhy:requests(zset) 

lhy:dupefilter用来存储 已经requests 过的url的hash值,分布式去重时使用到,  lhy:items是分布式生成的items,lhy:requests是新生成的 url封装后的requests。

理论上,lhy:dupefilter 等于已经request的数量,一直增加

lhy:items 是经过 spider prase生成的

lhy:requests 是有序集合ZSET,scrapy-redis 重新吧他封装成了一个队列,requests是spider 解析生成新url后重新封装,如果不载有新的url产生,则随着spider的prase,一直减少。总之取request时出队列,新的url会重新封装成request后增加进来,入队列。

scrapy-redis 原理及解释

scrapy-redis 重写了scrapy的多个类,具体请看http://blog.csdn.net/u013378306/article/details/53992707

并且在setting.py中 配置了这些类,所以当运行scrapy-redis例子时,自动使用了scrapy-redis 重写的类。

下载scrapy-redis源代码 https://github.com/rolando/scrapy-Redis

文档结构如下:

其中,src 中是scrapy-redis的源代码。

example-redis 是写好的例子,其中有三个例子

(1)domz.py   (2) mycrawler_redis.py   (3) myspider.py

文档中队者三个例子的解释如下

* **dmoz**

  This spider simply scrapes dmoz.org.

* **myspider_redis**

  This spider uses redis as a shared requests queue and uses
  ``myspider:start_urls`` as start URLs seed. For each URL, the spider outputs
  one item.

* **mycrawler_redis**

  This spider uses redis as a shared requests queue and uses
  ``mycrawler:start_urls`` as start URLs seed. For each URL, the spider follows
  are links.

domz.py :此例子仅仅是抓取一个网站下的数据,没有用分布式

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class DmozSpider(CrawlSpider):
    """Follow categories and extract links."""
    name = 'dmoz'
    allowed_domains = ['dmoz.org']
    start_urls = ['http://www.dmoz.org/']

    rules = [
        Rule(LinkExtractor(
            restrict_css=('.top-cat', '.sub-cat', '.cat-item')
        ), callback='parse_directory', follow=True),
    ]

    def parse_directory(self, response):
        for div in response.css('.title-and-desc'):
            yield {
                'name': div.css('.site-title::text').extract_first(),
                'description': div.css('.site-descr::text').extract_first().strip(),
                'link': div.css('a::attr(href)').extract_first(),
            }

mycrawler_redis.py
此例子 使用 RedisCrawlSpider类,支持分布式去重爬取,并且 可以定义抓取连接的rules

from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor

from scrapy_redis.spiders import RedisCrawlSpider

class MyCrawler(RedisCrawlSpider):
    """Spider that reads urls from redis queue (myspider:start_urls)."""
    name = 'mycrawler_redis'
    redis_key = 'mycrawler:start_urls'

    rules = (
        # follow all links
        Rule(LinkExtractor(), callback='parse_page', follow=True),
    )

    def __init__(self, *args, **kwargs):
        # Dynamically define the allowed domains list.
        domain = kwargs.pop('domain', '')
        self.allowed_domains = filter(None, domain.split(','))
        super(MyCrawler, self).__init__(*args, **kwargs)

    def parse_page(self, response):
        return {
            'name': response.css('title::text').extract_first(),
            'url': response.url,
        }

myspider.py 此例子支持分布式去重爬取,但不支持定义规则抓取url

from scrapy_redis.spiders import RedisSpider

class MySpider(RedisSpider):
    """Spider that reads urls from redis queue (myspider:start_urls)."""
    name = 'myspider_redis'
    redis_key = 'myspider:start_urls'

    def __init__(self, *args, **kwargs):
        # Dynamically define the allowed domains list.
        domain = kwargs.pop('domain', '')
        self.allowed_domains = filter(None, domain.split(','))
        super(MySpider, self).__init__(*args, **kwargs)

    def parse(self, response):
        return {
            'name': response.css('title::text').extract_first(),
            'url': response.url,
        }
时间: 2024-09-15 22:53:53

scrapy-redis 安装 及使用 结合例子解释的相关文章

分布式业务Redis安装与集群配置

       Redis在百度百科里的解释:Redis是一个开源的使用ANSI  C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,包括C#.Java.PHP等等,甚至连Javascript都做了很好的封装.        可见Redis的数据是持久化的,可以分担一个项目中的部分业务,Redis的数据是存储在服务器内存当中的,这样可以极大的加快访问速度,因为内存的读取速度远远超过磁盘和数据库,这在很大程序的上解决了大并发的困惑:同时Redis和

[喵咪Redis]Redis安装与介绍

[喵咪Redis]Redis安装与介绍 前言 哈喽大家好啊,这次要来和大家一起来了解学习Redis的一系列技术,最终目的是搭建一个高可用redis集群自动负载灾备,那我们先从最基础的Redis的一些基本介绍以及安装来说起! 附上: 喵了个咪的博客:w-blog.cn Redis官网:http://redis.io/ Redis命令大全:http://doc.redisfans.com/ Redsi源码地址:http://download.redis.io/releases/ GitHub地址:h

众包中空间任务具体指什么,能不能举个例子解释一下,从生活中的实例说一下,不要抽象的

问题描述 众包中空间任务具体指什么,能不能举个例子解释一下,从生活中的实例说一下,不要抽象的 2C 众包中空间任务具体指什么,能不能举个例子解释一下,从生活中的实例说一下,不要抽象的

redis 安装和配置

首先编译 tar -zxvf redis-3.0.3.tar.gz cd redis-3.0.3 make cd src make install make完成后,有产生可执行文件(绿色的)                     redis-server:redis服务器的启动程序                     redis-cli:redis命令行工具,也可为客户端                     redis-benchmark:redis性能测试工具(读写)        

linux redis安装之后,set 什么命令都不执行

问题描述 linux redis安装之后,set 什么命令都不执行 每次输入命令 回车后,都变成了换行,有大神知道怎么解决吗? 解决方案 http://redis.readthedocs.org/en/latest/string/set.html SET key "new-value" 解决方案二: 多谢回答,我的命令没问题啊,问题是命令回车 不执行

redis安装,redis项目以来,redis和spring整合,redis的service,redis的service实现类

一.redis安装: Redis-3.2.6.tar.gz安装,参考方式: 用源码工程来编译安装 1.  到官网下载最新stable版,这里使用的是:redis-3.2.6.tar.gz 2.  cd /usr/local   3.  make redis-src 4.  tar -zxvf    redis-3.2.6.tar.gz  -C  ./redis-src/ 2.解压源码并进入目录cd  /usr/local/redis-src/redis-3.2.6 3. 先执行make,检查是否

db2-DB2数据库有Schema 或 Catalog 这样的概念吗? 有的话麻烦举个例子解释下。

问题描述 DB2数据库有Schema 或 Catalog 这样的概念吗? 有的话麻烦举个例子解释下. DB2数据库有Schema 或 Catalog 这样的概念吗? 有的话麻烦举个例子解释下.

Linux下Redis安装配置教程_Redis

redis作为NoSQL数据库的一种应用,响应速度和命中率上还是比较高效的.项目中需要用集中式可横向扩展的缓存框架,做了一点调研,即便redis.memcached存在效率上的差异(具体比较参考http://timyang.net/data/mcdb-tt-redis/),但其实都能满足目前项目的需求:但是redis还是比较风骚的,支持链表和集合操作,支持正则表达式查找key,目前项目缓存的结果大多是链表,如果链表新增或者修改数据的话,redis就体现出了极大的优势(memcached只能重新加

CentOS系统下Redis安装和自启动配置的步骤_Redis

一. 安装Redis Redis的安装其实相当简单,推荐的方式是下载redis的源码,并在本机编译后安装. 首次进入主文件夹的下载目录下,执行wget下载源码 [zhxilin@localhost ~]$ cd 下载 [zhxilin@localhost 下载]$ wget http://download.redis.io/redis-stable.tar.gz 接下来解压之后,移动到/usr/redis目录下 [zhxilin@localhost 下载]$ tar -zxvf redis-st