描述:

1.使用两台机器,一台是win10,一台是centos7,分别在两台机器上部署scrapy来进行分布式抓取一个网站

2.centos7的ip地址为192.168.1.112,用来作为redis的master端,win10的机器作为slave

3.master的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”

4.slave从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis

5.重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中

6.master里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的

安装redis(http://blog.fens.me/linux-redis-install/)

windows安装redis

下载地址:https://github.com/rgl/redis/downloads

选择最新版和你电脑的对应版本下载安装

安装完成后,

运行redis服务器的命令:安装目录下的redis-server.exe

运行redis客户端的命令:安装目录下的redis-cli.exe

centos7安装redis

直接运行命令:yum install redis -y即可,安装完成后默认启动redis服务器

安装完成后,redis默认是不能被远程连接的,此时要修改配置文件/etc/redis.conf

#注释bind

#bind 127.0.0.1

修改后,重启redis服务器

systemctl restart redis

在centos7环境下启动redis服务器的命令:systemctl start redis,启动客户端的命令:redis-cli

如果要增加redis的访问密码,修改配置文件/etc/redis.conf

#取消注释requirepass

requirepass redisredis  # redisredis就是密码(记得自己修改)

增加了密码后,启动客户端的命令变为:redis-cli -a redisredis

测试是否能远程登陆

使用windows的命令窗口进入redis安装目录,用命令进行远程连接centos7的redis:

redis-cli -h 192.168.1.112 -p 6379

在本机上测试是否能读取master的redis

在远程机器上读取是否有该数据

可以确信redis安装完成

安装部署scrapy-redis

安装scrapy-redis命令(https://github.com/rolando/scrapy-redis)

pip install scrapy-redis

部署scrapy-redis:

slave端:在windows上的settings.py文件的最后增加如下一行

REDIS_URL = 'redis://192.168.1.112:6379'

master端:在centos7上的settings.py文件的最后增加如下两行

REDIS_HOST = 'localhost'

REDIS_PORT = 6379

在windows中配置好了远程的redis地址后启动两个爬虫(启动爬虫没有顺序限制),此时在windows上查看redis,可以看到windows上运行的爬虫的确是从远程的reids里获取request的(因为本地的redis没有东西)

由此确认好了scrapy-redis安装配置完成

使用redis-dump将redis的数据导出来查看(可选)

在centos7上安装redis-dump (https://github.com/delano/redis-dump)

yum -y install gcc ruby-devel rubygems compass gem

修改rvm安装源(http://genepeng.com/index.php/346)

gem sources --remove https://rubygems.org/

gem sources -a https://ruby.taobao.org/

gem sources -l

gem install redis-dump -y

运行了example里的dmoz之后,连接redis,查看到生成了以下的三个数据库,并且每个value对应的类型如下

在centos7上使用redis-dump命令(redis-dump -u 127.0.0.1:6379 > db_full.json)导出该数据库,再查看存储到的数据(在这里我只提取了每个数据库的前几条)

下图就是上面数据库“dmoz:items”里所爬取的内容

将爬取到的数据导入到mongodb中

等到爬虫结束后,此时运行process_items.py来把位于master的redis中的“dmoz:items”逐一读取到json中,所以如果要把item存储到mongodb中,就应该修改process_items.py文件,如下

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import json

import redis

import pymongo

def main():

    # r = redis.Redis()

    r = redis.Redis(host='192.168.1.112',port=6379,db=0)

    client = pymongo.MongoClient(host='localhost', port=27017)

    db = client['dmoz']

    sheet = db['sheet']

    while True:

        # process queue as FIFO, change `blpop` to `brpop` to process as LIFO

        source, data = r.blpop(["dmoz:items"])

        item = json.loads(data)

        sheet.insert(item)

        try:

            print u"Processing: %(name)s <%(link)s>" % item

        except KeyError:

            print u"Error procesing: %r" % item

if __name__ == '__main__':

    main()

其实可以在爬虫一边运行的时候,一边运行process_items.py文件

注意:如果要重新运行爬虫记得把master上的redis清空,因为master里的数据库“dmoz:dupefilter”是用来过滤重复的请求

192.168.1.112:6379> flushdb

scrapy-redis使用详解的更多相关文章

  1. redis配置详解

    ##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...

  2. CentOS7/RHEL7安装Redis步骤详解

    CentOS7/RHEL7安装Redis步骤详解 CentOS7/RHEL7安装Redis还是头一次测试安装了,因为centos7升级之后与centos6有比较大的区别了,下面我们就一起来看看Cent ...

  3. Redis协议详解

    smark Beetle可靠.高性能的.Net Socket Tcp通讯组件 支持flash amf3,protobuf,Silverlight,windows phone Redis协议详解 由于前 ...

  4. Redis学习——详解Redis配置文件(三)

    一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...

  5. Redis:默认配置文件redis.conf详解

    转: Redis:默认配置文件redis.conf详解 # Redis配置文件样例 # Note on units: when memory size is needed, it is possibl ...

  6. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  7. Redis配置文件redis.conf详解

    一.Redis配置文件redis.conf详解 # Note on units: when memory size is needed, it is possible to specifiy # it ...

  8. [转]使用python来操作redis用法详解

    转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...

  9. linux离线部署redis及redis.conf详解

    一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...

  10. Scrapy笔记03- Spider详解

    Scrapy笔记03- Spider详解 Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数.初次请求URL通过start_urls指定, ...

随机推荐

  1. 《Entity Framework 6 Recipes》中文翻译——第九章EntityFramework在N层架构程序中的应用(七)

    在WCF服务中的序列化代理 问题 您有一个从查询返回的动态代理对象,你想要把它像POCO对象已经进行序列化.在序列化基于实体对象的POCO(普通旧CLR对象)时,实体框架会自动生成一个动态生成的派生类 ...

  2. 装饰者模式--《Head First DesignPattern》

    装饰者模式动态地将责任附加到对象杭,若要拓展功能,装设置提供了比继承更有弹性的替代方案. 星巴兹有多种咖啡,它们具有不同的价格.在购买咖啡时,也可以要求在其中加入各种调料,例如豆浆.摩卡.奶泡等等.需 ...

  3. Java基础知识强化102:线程间共享数据

    一.每个线程执行的代码相同: 若每个线程执行的代码相同,共享数据就比较方便.可以使用同一个Runnable对象,这个Runnable对象中就有那个共享数据. public class MultiThr ...

  4. java开发:分享一下使用urlrewrite实现网址的个性访问

    很多网站都有一些比较个性的域名访问方式,如:http://www.xxx.com/u/pp  点开就可以看到pp的个人主页了,这种地址比较容易让人记住,那今天就来讲讲这种技术的实现方式. 1.使用ja ...

  5. Linux C编程--格式化I/O

    printf(格式控制,输入表列) 例:printf("%d%d",a,b) (1)d格式符:输出一个有符号的十进制整数 (2)c格式符:输出一个字符 (3)s格式符:输出一个字符 ...

  6. 牢记!SQL Server数据库开发的二十一条注意点

    如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL  Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS). ...

  7. Objective-c中的对象间的消息传递以及消息路由

    刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用.心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学 ...

  8. 当html中存在url中如: onclick="toView('参数1')", 参数1是特别字符,如&asop;&quot;' "等时,浏览器解析时会报错。解决方法如文中描述

    解决方案: 自定义标签将字符串转换成unicode编码后输出显示到页面即可 解析原理:解析顺序html  ---url ----javascript---url,由于unicode编码在htm解析阶段 ...

  9. javascrip笔记——图片加载

    var t_img; // 定时器 var isLoad = true; // 控制变量 // 判断图片加载状况,加载完成后回调 isImgLoad(function(){ // 加载完成 }); / ...

  10. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...