分散式爬蟲——爬取bilibili視訊資訊資源
一、專案介紹:
爬取bilibili網站上的全部視訊資訊(不包含直播;廣告和放映廳欄);資訊量為千萬級,爬取任務較為重,所以採取分散式爬蟲。
二、說明:
a、裝置說明:
1、mysql和redis部署在同一臺linux(也可以分開部署); 2、爬蟲部署在其他機器上; 3、另外所有機器均處於同一個區域網中; 4、採用私密ip代理
b、使用說明:
爬蟲裝置: cd ..../bilibili - redis ./bl-redis.sh 1 # 1.修改許可權:chmod 777 bl-redis.sh; 2、 此命令後面的數字表示要開啟的爬蟲個數,可以同時開啟多個;若是想要啟動5個爬蟲,就是./bl-redis.sh 5 redis裝置: $ redis-cli -h 192.168.1.111 -p 6379 >> lpush BlblSpider:start_urls http://www.bilibili.com
三、安裝
1、安裝redis
1、檢視系統是否安裝redis(centos系統) rpm -qa | grep "redis" 2、安裝redis yum install redis 3、版本檢視 redis-server -v 4、測試連線: 本地:redis-cli -h 127.0.0.1 -p 6379 遠端:redis-cli -h 192.168.1.111 -p 6379 5、redis命令 刪除全部:Flushall 檢視所有key:keys * 新增key:set kk 123 檢視key:get kk 爬蟲入口url:lpush BlblSpider:start_urls http://www.bilibili.com
2、安裝 scrapy-redis
注:程式碼為python2.7 pip2 install scrapy-redis
三、程式碼
1、redis設定
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 去重機制 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # redis排程機制 SCHEDULER_PERSIST = False # 爬蟲關閉時,是否清除redis去重 SCHEDULER_FLUSH_ON_START = True # 爬蟲啟動時候,是否清除redis中的keys SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue" # request佇列機制 REDIS_HOST = '192.168.1.111' # redis 的ip地址 REDIS_PORT = 6379 # redis 的連線埠
2、關閉爬蟲
採取擴充套件介面,呼叫extensions.py 中的函式,避免爬蟲長期空跑
MYEXT_ENABLED = True # 開啟擴充套件
IDLE_NUMBER = 720 # 配置空閒持續時間單位為 360個 ,一個時間單位為5s。 360個:半小時
# 在 EXTENSIONS 配置,啟用擴充套件
EXTENSIONS = {
'bilibili.extensions.RedisSpiderSmartIdleClosedExensions': 500,
}
3、ip代理
說明:這裡採用的時 快代理 的api介面,程式碼中的介面已經失效
DOWNLOADER_MIDDLEWARES = {
# 'bilibili.middlewares.BilibiliDownloaderMiddleware': 543,
# 'bilibili.middlewares.ChangeProxy': 543, # 取消此處的註釋,就可以在訪問時進行ip切換
}
另外關於ip代理需要思考的幾個問題: 1、什麼時候需要切換ip 本身的ip本ban,被拉黑了,無法繼續使用該ip請求目標網站 2、切換ip是否需要支出 (一般需要購買)免費的ip不需要花錢,不免費的ip需要花錢;但是,大部分絕大部分很大一部分的免費ip是不能用的 3、如何更優秀的切換ip a、代理ip給我們的api,是有請求限制的,例如有的限制3s,有的限制5s,等等 b、可能我們的一個代理ip獲取後,很快就會失效了;所以,一般情況下,代理ip都是先驗證,後使用 c、很有可能一個代理ip,我們可以訪問網頁多次,才會被ban
完善代理ip切換功能需要考慮的幾個問題: 1)ip是否可以 2)ip用多少次清除掉 3)每次獲取多少ip