scrapy-redis使用详解
描述:
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使用详解的更多相关文章
- redis配置详解
##redis配置详解 # Redis configuration file example. # # Note that in order to read the configuration fil ...
- CentOS7/RHEL7安装Redis步骤详解
CentOS7/RHEL7安装Redis步骤详解 CentOS7/RHEL7安装Redis还是头一次测试安装了,因为centos7升级之后与centos6有比较大的区别了,下面我们就一起来看看Cent ...
- Redis协议详解
smark Beetle可靠.高性能的.Net Socket Tcp通讯组件 支持flash amf3,protobuf,Silverlight,windows phone Redis协议详解 由于前 ...
- Redis学习——详解Redis配置文件(三)
一.Redis脚本简介 在我们介绍Redis的配置文件之前,我们先来说一下Redis安装完成后生成的几个可执行文件: redis-server .redis-cli .redis-benchmark ...
- Redis:默认配置文件redis.conf详解
转: Redis:默认配置文件redis.conf详解 # Redis配置文件样例 # Note on units: when memory size is needed, it is possibl ...
- Python操作redis学习系列之(集合)set,redis set详解 (六)
# -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...
- Redis配置文件redis.conf详解
一.Redis配置文件redis.conf详解 # Note on units: when memory size is needed, it is possible to specifiy # it ...
- [转]使用python来操作redis用法详解
转自:使用python来操作redis用法详解 class CommRedisBase(): def __init__(self): REDIS_CONF = {} connection_pool = ...
- linux离线部署redis及redis.conf详解
一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...
- Scrapy笔记03- Spider详解
Scrapy笔记03- Spider详解 Spider是爬虫框架的核心,爬取流程如下: 先初始化请求URL列表,并指定下载后处理response的回调函数.初次请求URL通过start_urls指定, ...
随机推荐
- BootStrap2学习日记10---单选框和复选框
<label>选择你的性别</label> <label class="radio"> <input type="radio&q ...
- 使用c3p0连接池
首先我们需要知道为什么要使用连接池:因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉,每次新建连接都需要140毫秒左右的时间而C3P0连接池会池化连接,随 ...
- Storm中并发程度的理解
Storm中涉及到了很多组件,例如nimbus,supervisor等等,在参考了这两篇文章之后,对这个有了更好的理解. Understanding the parallelism of a Stor ...
- [转]一步步教你如何在 Visual Studio 2013 上使用 Github
介绍 我承认越是能将事情变简单的工具我越会更多地使用它.尽管我已经知道了足够的命令来使用Github,但我宁愿它被集成到IDE中.在本教程中,我会告诉你使用Visual Studio 2013如何实现 ...
- LINQ to Entities 不识别方法“System.String ToString()”,因此该方法无法转换为存储表达式。
var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...
- python 基础——*args和**kwargs
*args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个dict. def func(one, *args, **kwargs): print type(one) ...
- javaweb学习总结十(xml解析<SAX以及DOM方式>)
一:XML解析技术 一般我们使用sun公司或者开源组织开发的工具包解析xml效率比较高. 1:jaxp解析xml,jaxp是sun公司开发的解析xml工具包 2:jaxp解析xml代码如下 a:获取d ...
- JAVA基础之理解JNI原理
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C.C++)的动态库进行交互,给其它语言发挥优势的机会. 有了J ...
- 本机连接虚拟机Oracle时报错的解决办法
虚拟机安装了Oracle服务器(桌面类)和客户端,里面使用plsql连接自己没有问题. 在本机连接虚拟机没有成功.虚拟机的地址是192.168.126.132,已经确认本机能ping通虚拟机. 先是报 ...
- JavaScript面试问题:事件委托和this
JavaScript不仅门槛低,而且是一门有趣.功能强大和非常重要的语言.各行各业的人发现自己最混乱的选择是JavaSscript编程语言.由 于有着各种各样的背景,所以不是每个人都对 ...