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

时间: 2024-08-10 23:18:35

redis之分布式爬虫的相关文章

基于requests+redis的分布式爬虫

简单的网络爬虫是对一个url进行请求,并等待其返回响应.在数据量小的情况下很实用,但是当你的数据量很大,显然分布式爬虫就更占优势!关于分布式,一般是使用一台主机(master)充当多个爬虫的共享redis队列,其他主机(slave)采用远程连接master,关于redis如何安装,这里不多做介绍! 以爬虫伯乐在线的python文章为例,我的分布式爬虫由main01 main02 main03三个python文件构成,main01的主要任务是运行在master上,将文章的url爬取下来存入redi

Redis实现分布式爬虫

redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专门为scrapy开发的一套组件. 该组件可以让scrapy实现分布式 pip install scrapy-redis 分布式爬取的流程: 1 redis配置文件的配置 将 bind 127.0.0.1 进行注释 将 protected-mode no 关闭保护模式 2 redis服务器的开启:基于

基于Python使用scrapy-redis框架实现分布式爬虫 注

注:本文是在http://www.111cn.net/sys/CentOS/63645.htm,http://www.cnblogs.com/kylinlin/p/5198233.html的基础上加以改动的!版权归alex.shu,kylinlin所有. 1.首先介绍一下:scrapy-redis框架 scrapy-redis:一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能.github地址: https://github.com/darkrho/s

基于Redis的三种分布式爬虫策略

前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够"健壮"的情况下实现起来越简单/方便越好 最好支持"断点续爬"功能 Python分布式爬虫比较常用的应该是scrapy框架加上Redis内存数据库,中间的调度任务等用scrapy-redis模块实现. 此处简单介绍一下基于Redis的三种分布式策略,其实它们之间还是很相似

Python3分布式爬虫(scrap+redis)基础知识和实战详解

背景 随着业务需求的变化,大规模爬虫遇到各种问题.python爬虫具有先天优势,社区资源比较齐全,各种框架也完美支持.爬虫性能也得到极大提升.本次分享从基础知识入手,涉及python 的两大爬虫框架pyspider.scrapy,并基于scrapy.scrapy-redis 做了分布式爬虫的介绍(直接粘贴的ppt截图)会涉及 redis.mongodb等相关知识. 一.前沿 1.1 爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.

【Python3爬虫】爬取美女图新姿势--Redis分布式爬虫初体验

一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对IP的检测.本文介绍的是利用Redis数据库实现的分布式爬虫,Redis是一种常用的菲关系型数据库,常用数据类型包括String.Hash.Set.List和Sorted Set,重要的是Redis支持主从复制,主机能将数据同步到从机,也就能够实现读写分离.因此我们可以利用Redis的特性,借助req

【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验

一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对IP的检测.本文介绍的是利用Redis数据库实现的分布式爬虫,Redis是一种常用的菲关系型数据库,常用数据类型包括String.Hash.Set.List和Sorted Set,重要的是Redis支持主从复制,主机能将数据同步到从机,也就能够实现读写分离.因此我们可以利用Redis的特性,借助req

java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫

前言 使用之前单应用的队列仓库存储抓取的url存在以下两个弊端: 单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取 在加快爬虫抓取速度时候,我们有时候需要部署多节点,实现多节点抓取,加快抓取速度,但是多节点抓取同一个页面时候,怎样保证哪些url已经抓取了,而不需要再次抓取了,此时如果是单应用队列仓库将会不能区分 使用redis创建的url仓库(公共的仓库) 恰好解决了这个问题 多节点可以实现负载均衡,可以保证服务稳定性(其中一个挂掉了,不会对其

使用AKKA做分布式爬虫的思路

上周公司其他小组在讨论做分布式爬虫,我也思考了一下,提了一个方案,就是使用akka分布式rpc框架来做,自己写master和worker程序,client向master提交begin任务或者其它爬虫需求,master让worker去爬网页,worker都是kafka的同一个group然后从kafka里面拉取数据(URL),然后处理爬了的网页,解析内容,把爬下来的网页通过正则表达式匹配出嵌套的网页,然后请求actor判断是否爬过(防止生成有向图,让其变成树形结构)(这里应该是个单独的actor,这