首页 > 代码库 > 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之分布式爬虫
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。