分布式爬虫原理

分布式爬虫原理

  • 什么是分布式爬虫:
    额,这个问题呢,我这样解释,例如爬取网站内的二级网站,我们就需要获取网站中的二级、三级…很多个网站,那么我们如果用自己一台主机爬取明显效率很低,这个时候我们就需要其他主机的帮助了,这个时候我们就将作为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)

爬虫,,从入门到放弃,,,哈哈哈哈哈哈

    原文作者:zzZ摇篮曲
    原文地址: https://segmentfault.com/a/1190000015788906
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞