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

wps96F0.tmp

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

安装完成后,

运行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 wps96F1.tmp

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

wps96F2.tmp

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

wps96F3.tmp

可以确信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没有东西)

图片3

由此确认好了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对应的类型如下

wps9705.tmp

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

图片2

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

图片1

将爬取到的数据导入到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

参考地址