首页 > 代码库 > redis之分布式爬虫

redis之分布式爬虫

分布式爬虫一般最少需要三台机器,一台为主服务器,用于生产爬虫任务,其它服务器用于消费爬虫任务。

 

 

准备爬取妹子图,主页地址

 

主服务器生产爬取任务

getUrlList.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__Author__ = ‘KongZhaGen‘

import requests
import bs4
import redis

def creUrlList():
    # 连接到redis服务器,需要密码
    r = redis.Redis(host="192.168.10.106",password="redis")
    # 准备爬取10个页面的图片
    for i in range(10):
        url = "http://www.meizitu.com/a/" + str(5500+i) + ".html"
        req = requests.get(url)
        soup = bs4.BeautifulSoup(req.text,"lxml")
        # 通过css方法获取所有图片的路径
        a_list = soup.select("#picture p img")
        # 将图片路径放到redis数据库的imglist中,待客户端爬取
        for a in a_list:
            r.rpush("imglist",a.attrs[‘src‘])

if __name__ == ‘__main__‘:
    creUrlList()

 

客户端服务器用于消费爬取任务

getImg.py

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__Author__ = ‘KongZhaGen‘
import requests
import redis
import time

def downLoad(url):
    ‘‘‘
    给一个url,生成一张图片
    :param url: 
    :return:
    ‘‘‘
    # 设置headers用于反爬
    headers = {
       ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36‘
    }
    # 生成图片的名称
    name = ‘-‘.join(url.split("/")[-3:])
    # 获取图片的内容
    req = requests.get(url,headers=headers)
    # 如果获取成功,将内容写入文件中
    if req.status_code == 200:
        with open(name,‘wb‘) as fp:
            fp.write(req.content)
    else:
        print "get img faild"

def getImg():
    ‘‘‘
    循环读取redis队列任务,用于爬取图片
    :return:
    ‘‘‘
    # 连接redis
    r = redis.Redis(host="192.168.10.106",password="redis")
    Flag = True
    while Flag:
        # 从imglist中获取图片地址
        url = r.rpop("imglist")
        # 图片地址获取完后退出程序
        if url:
            try:
                downLoad(url)
                time.sleep(3)
                print url
            except Exception as e:
                print e
                time.sleep(10)
        else:
            Flag = False
            print "任务已取完"

if __name__ == ‘__main__‘:
    getImg()

  

在主服务器执行getUrlList.py

结果:生成了imglist列表
127.0.0.1:6379> keys *
1) "imglist"
2) "names"

  

在客户端执行getImg.py

技术分享

 

redis之分布式爬虫