分散式爬蟲原理

zzZ搖籃曲發表於2019-02-16

分散式爬蟲原理

  • 什麼是分散式爬蟲:
    額,這個問題呢,我這樣解釋,例如爬取網站內的二級網站,我們就需要獲取網站中的二級、三級…很多個網站,那麼我們如果用自己一臺主機爬取明顯效率很低,這個時候我們就需要其他主機的幫助了,這個時候我們就將作為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)

爬蟲,,從入門到放棄,,,哈哈哈哈哈哈

相關文章