分布式爬虫原理

分布式爬虫原理

  • 什么是分布式爬虫:
    额,这个问题呢,我这样解释,例如爬取网站内的二级网站,咱们就须要获取网站中的二级、三级...不少个网站,那么咱们若是用本身一台主机爬取明显效率很低,这个时候咱们就须要其余主机的帮助了,这个时候咱们就将做为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)

爬虫,,从入门到放弃,,,哈哈哈哈哈哈数据库

相关文章
相关标签/搜索