描述:php
1.使用兩臺機器,一臺是win10,一臺是centos7,分別在兩臺機器上部署scrapy來進行分佈式抓取一個網站html
2.centos7的ip地址爲192.168.1.112,用來做爲redis的master端,win10的機器做爲slavepython
3.master的爬蟲運行時會把提取到的url封裝成request放到redis中的數據庫:「dmoz:requests」,而且從該數據庫中提取request後下載網頁,再把網頁的內容存放到redis的另外一個數據庫中「dmoz:items」linux
4.slave從master的redis中取出待抓取的request,下載完網頁以後就把網頁的內容發送回master的redisgit
5.重複上面的3和4,直到master的redis中的「dmoz:requests」數據庫爲空,再把master的redis中的「dmoz:items」數據庫寫入到mongodb中github
6.master裏的reids還有一個數據「dmoz:dupefilter」是用來存儲抓取過的url的指紋(使用哈希函數將url運算後的結果),是防止重複抓取的redis
安裝redis(http://blog.fens.me/linux-redis-install/)mongodb
windows安裝redis數據庫
下載地址:https://github.com/rgl/redis/downloadsjson
選擇最新版和你電腦的對應版本下載安裝
安裝完成後,
運行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