1哭尝、Linux下安裝scrapy
? 如果沒有pip先下載
? sudo apt-get install python-pip
? scrapy框架有可能依賴于下面的兩個庫
? sudo apt-get install python-dev
? sudo apt-get install libevent-dev
? pip install scrapy
2哥攘、redis安裝
? Linux下安裝:
? cd 壓縮包的路徑下(cd Desktop)
? tar -zxvf redis-3.2.8.tar.gz
? cp -r ./redis-3.2.8 /usr/local/redis (如果被拒絕,用sudo cp ...)
? sudo make install
? 如果有錯材鹦,請輸入指令:sudo make MALLOC=libc
? 運行起來服務(wù)器:
? cd /usr/local/redis/src
? ./redis-server
? 服務(wù)器啟動以后逝淹,該redis數(shù)據(jù)就可以處理數(shù)據(jù)了;操作該數(shù)據(jù)庫需要打開其客戶端
? 另開一個終端
? cd /usr/local/redis/src
? ./redis-cli
? 127.0.0.1:6379>ping
? PONG 說明服務(wù)器打開成功
? 關(guān)閉服務(wù)器
? 在客戶端輸入命令:shutdown [nosave|save]
? 【注意】如果是遠程連接的客戶端桶唐,則不能shutdown
? 遠程訪問:redis-cli -h xxx.xx.xx.xx -port 6379 -a password
? redis-cli -h 10.36.135.43
? 在windows中栅葡,redis-server默認不允許遠程訪問,可以在配置文件中打開
? 配置即是redis目錄下的redis.windows.conf
? 然后修改如下:
? 56行注釋掉 即: # bind 127.0.0.1
? 75行把后面值改成 no 即:protected-mode no
? 然后把服務(wù)器重啟即可
3尤泽、redis介紹
? Redis 是完全開源免費的欣簇,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫
? Redis與其他key-value緩存機制相比有一下特點:
? Redis支持數(shù)據(jù)的持久化坯约,可以將內(nèi)存中的數(shù)據(jù)保存到磁盤
? Redis不僅支持key-value類型的數(shù)據(jù)熊咽,同時還支持list、set闹丐、zset横殴、hash
? Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份
?
? 支持的五大數(shù)據(jù)類型:string卿拴、hash衫仑、list梨与、set、zset
? 如何將數(shù)據(jù)存入Redis數(shù)據(jù)惑畴?通過指令來存(每種數(shù)據(jù)類型存儲都對應(yīng)著一種指令)
? 1)字符串:string是redis的最基本的類型蛋欣,redis默認最大能夠存儲512M的數(shù)據(jù) 字符串的指令是set和get
? (1)設(shè)置鍵值
? 普通鍵值:set key value (如:set name 'wuyali')
? 鍵的生存時間:setex key seconds 10 (如:setex sex 10 'M')
? 設(shè)置多個鍵值:mset key value [key value ...]
? (2) 獲取 :get key
? 獲取多個:get key [key ... ]
? (3) 運算 :要求值是字符串類型的數(shù)字
? 加1:incr key
? 減1:decr key
? 加若干:incrby key intnum
? 減若干:decrby key intnum
? (4) 其他
? 追加值: appned key value
? 獲取值得長度:strlen key
? 2、key的操作
? 1)查找鍵如贷,參數(shù)支持正則
? keys pattern
? 2)判斷是否存在
? exists key
? 3)查看key對應(yīng)的value的類型
? type key
? 4)刪除鍵及其對應(yīng)的值
? del key [key ... ]
? 5)設(shè)置過期
? expire key seconds
? 6)查看有效時間
? ttl key
? 3陷虎、hash
? hash在這里主要是存儲對象(或者字典)
? {
? name:"JackMa",
? age:18
? }
? 指令:hset
? 1、設(shè)置
? 設(shè)置單值:hset key field value (此時key代表數(shù)據(jù)中的鍵杠袱,值就是field value這個鍵值對)
? 設(shè)置多值:hmset key field value [field value]
? 2尚猿、獲取
? 獲取一個屬性的值:hget key field
? 獲取多個屬性的值:hmget key field [field...]
? 獲取key對應(yīng)的所有的屬性和值:hgetall key
? 獲取所有的屬性:hkeys key
? 獲取所有的值:hvals key
? 其他指令:
? hlen key
? hexiste key field
? hdel key field
? 4、list類型: 列表的元素類型是string
? ["qwer",'asdw','1234']
? 1楣富、設(shè)置
? 在頭部插入:lpush key value [ value....]
? 在尾部插入:rpush key value [vlaue ...]
? 在一個元素的前部|后部插入:linsert key before|after pivot value (如:linsert stars before 'A' 'B')
? 設(shè)置指定索引的元素值
? lset key index value
? 2凿掂、獲取
? 1)移除并返回key對應(yīng)的list的第一個元素:lpop key
? 2)移除并返回key對應(yīng)的list的嘴一個元素:rpop key
? 3)返回存儲在key的列表中的指定范圍的元素:lrange key start end
? llen key
? lindex key index
? ltrim key start end
? 5、set : 無序集合纹蝴,元素類型為string類型庄萎,元素不能重復
? 添加元素:sadd key member [member ... ]
? 獲取:
? 根據(jù)可以返回集合所有的元素:smembers key
? 返回幾個的元素個數(shù):scard key
? 運算
? 交集:sinter key [key ... ]
? 并集:sunion key [ key ... ]
? 差集:sdiff key [key ...]
? 判斷元素是否在集合中:sismember key member
? 6塘安、zset : 有序集合糠涛,元素類型string,元素具有唯一性
? 添加: zadd key score member [score member]
(score 優(yōu)先級別 索引順序從0開始排)
? 獲燃娣浮:zrange key star end
? zcard key 獲取個數(shù)
? score的值在min和max之間的元素的個數(shù): zcount key min max
? 【注】在一個Redis鏈接中總共有16個數(shù)據(jù)忍捡,我們可以自主選擇,指令如下:
? select 0-15
4切黔、分布式使用
? scrapy_redis組件
? pip install scrapy_redis
1砸脊、scrapy和scrapy_redis的區(qū)別
? scrapy是一個通用的爬蟲框架,不支持分布式
? scrapy_redis就是為實現(xiàn)scrapy的分布式而誕生的纬霞,它里面提功了redis的組件凌埂,通過這些redis組件,就可以實現(xiàn)分布式
? 2诗芜、官網(wǎng)案例
? http://github.com/rmax/scrapy-redis
? 三個樣本
? dmoz.py 傳統(tǒng)的CrawlSpider侨舆,目的就是把數(shù)據(jù)保存在redis,運行方式 指令:scrapy crawl dmoz
? myspider_redis.py 繼承自RedisCrawlSpider绢陌,start_url被redis_key給取代了,其他地方不變
分布式爬蟲開發(fā)的步驟:
? 把原來普通的部署在分布式的系統(tǒng)上運行熔恢,就構(gòu)成了分布式爬蟲
? 1脐湾、環(huán)境部署
? scrapy: 爬蟲運行的基礎(chǔ) (如果服務(wù)端不參與分布式的爬取可以不裝)
? scrapy_redis :組件(也可以認為是scrapy和redis交互的中間件),用于把scrapy爬蟲和redis數(shù)據(jù)庫聯(lián)系起來
? redis服務(wù)器:用于存儲分布式爬蟲爬取到的數(shù)據(jù)叙淌,一般情況下我們將redis服務(wù)器部署在Linux系統(tǒng)上秤掌,Windows上也可安裝(但是這個服務(wù)不能用于生產(chǎn)環(huán)境)愁铺;無論是在Linux上還是在Windows上,都必須配置其能夠遠程訪問
? 2、測試redis服務(wù)器是否聯(lián)通
? 如果ping了不PONG
? 1)服務(wù)器沒有配置遠程連接
? 2)服務(wù)器崩潰
? 3)服務(wù)器出現(xiàn)沖突 config set stop-writes-on-bgsave-error no
? 4)其他意外情況:http://www.baidu.com
? 3闻鉴、在普通的scrapy爬蟲框架下去爬取茵乱,保證爬蟲爬取的數(shù)據(jù)沒有錯誤再去分布式系統(tǒng)上部署
? 測試數(shù)據(jù)格式是否正確
? 先測:json 目的主要是看代碼是否有誤 【比如:用xpath的時候路徑寫錯等】
? 再測redis 目的主要是看一下有木有系統(tǒng)級的錯誤 【如:redis服務(wù)器崩潰】
4、部署分布式
? 服務(wù)器端(master端):
? 可以用某一臺主機作為redis服務(wù)器的運行方(即服務(wù)端)孟岛,也稱為master
? 客戶端(slaver端):
? 1)把普通爬蟲修改成分布式瓶竭,去掉start_urls(不讓slaver隨意的執(zhí)行),替換成redis_key(為了讓master能夠控制slaver的爬去)
2)修改自己配置文件渠羞,即在配置文件中加上scrapy_redis的組件
5斤贰、爬去
slaver端:首先要運行起來,等待master發(fā)出起始地址再開始
master端:在適當?shù)臅r候像redis服務(wù)器中放入一個起始地址的列表