分散式爬蟲原理
-
什麼是分散式爬蟲:
額,這個問題呢,我這樣解釋,例如爬取網站內的二級網站,我們就需要獲取網站中的二級、三級…很多個網站,那麼我們如果用自己一臺主機爬取明顯效率很低,這個時候我們就需要其他主機的幫助了,這個時候我們就將作為Master,為其他主機Slaver提供url的同時,啟動程式,沒錯,我們的工作就這麼多,而Slaver主機的作用就是接收url,解析並獲取想要的資料。。。。
-
那麼問題來了,我們如何將Master抓取到的網站分給別的主機呢?
那就需要資料庫了,而且是基於記憶體的資料庫,redis等。
redis安裝配置:http://www.runoob.com/redis/r…
配置中需要將redis.conf檔案做簡單的修改:將bind 127.0.0.1和rdbcompression yes註釋掉。
-
最後如何單執行緒抓取網頁呢?
你可以和自己的小夥伴試一試一個Master和多個Slaver一起獲取下bt影視網的網頁url,很有意思:
"""
爬蟲:
for url in urls:
r = requests.get(url)
html_doc = r.text
多執行緒爬蟲:
urls( 佇列 內容)
work( 從佇列中獲取url --> 傳送請求 --> 解析response -- >儲存資料)
建立多個執行緒,每個執行緒啟動一個work,從而實現併發,提高爬蟲效率
分散式爬蟲:
urls(儲存到redis中,因為redis可被多臺電腦訪問,從而實現分散式)
每臺電腦從redis記憶體中獲取url-->傳送請求 --> 解析response -- >儲存資料
目標 :
使用分散式爬蟲,爬去http://www.btbtdy.net/btfl/dy30.html中所有頁
部署:
Master端不需要任何修改(Master必須安裝redis server)
Slaver端需要修改兩處:
1) 把rds = Redis(`127.0.0.1`,6379)修改成 rds = Redis(`master的ip`,6379)
2) 把第64行的程式碼start_request()註釋掉
"""
from redis import Redis
import requests
# pip install redis
# 儲存 urls
REDIS_KEY = "btdy:urls"
rds = Redis(`127.0.0.1`,6379)
def fetch(url):
"""
下載頁面,如果下載成功,返回response物件,否則返回None
:param url:待爬取的url
:return:返回response物件或者None
"""
r = requests.get(url)
if r.status_code == 200:
return r
return None
def start_request():
"""
獲取電視劇所有頁的地址,並把地址push到REDIS_KEY中
:return:
"""
start_url = `http://www.btbtdy.net/btfl/dy30.html`
urls = [`http://www.btbtdy.net/btfl/dy30-{0}.html`.format(str(page+1)) for page in range(62)]
rds.lpush(REDIS_KEY,*urls)
if __name__ == `__main__`:
# 從redis中的REDIS_URLS中獲取url
start_request()
while True:
_, url = rds.blpop(REDIS_KEY)
fetch(url)
爬蟲,,從入門到放棄,,,哈哈哈哈哈哈