1. 程式人生 > >scrapy-redis使用詳解

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

描述:

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