分佈式爬蟲原理

分佈式爬蟲原理

  • 什麼是分佈式爬蟲:
    額,這個問題呢,我這樣解釋,例如爬取網站內的二級網站,咱們就須要獲取網站中的二級、三級...不少個網站,那麼咱們若是用本身一臺主機爬取明顯效率很低,這個時候咱們就須要其餘主機的幫助了,這個時候咱們就將做爲Master,爲其餘主機Slaver提供url的同時,啓動程序,沒錯,咱們的工做就這麼多,而Slaver主機的做用就是接收url,解析並獲取想要的數據。。。。

  • 那麼問題來了,咱們如何將Master抓取到的網站分給別的主機呢?

    那就須要數據庫了,並且是基於內存的數據庫,redis等。
    redis安裝配置:http://www.runoob.com/redis/r...
    配置中須要將redis.conf文件作簡單的修改:將bind 127.0.0.1和rdbcompression yes註釋掉。html


  • 最後如何單線程抓取網頁呢?

    你能夠和本身的小夥伴試一試一個Master和多個Slaver一塊兒獲取下bt影視網的網頁url,頗有意思:redis

"""
爬蟲:
    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)

爬蟲,,從入門到放棄,,,哈哈哈哈哈哈數據庫

相關文章
相關標籤/搜索