Python 用Redis简单实现分布式爬虫的方法


Posted in Python onNovember 23, 2017

Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台。

连接数据库

注意:假设现有几台在同一局域网内的机器分别为Master和几个Slaver

Master连接时host为localhost即本机的ip

_db = redis.Reds(host='localhost', port=6379, db=0)

Slaver连接时的host也为Master的ip,端口port和数据库db不写时为默认值6379、0

_db = redis.Redis(host='192.168.235.80')

Redis含列表、集合,字符串等几种数据结构,具体详细的几种数据结构的操作命令可查看Redis官网http://redis.io/commands,下面是对集合进行操作的一些命令

_db.sadd(key, *values) # 插入指定values到集合中并返回新插入的的值的数量
_db.spop(self.key) # 随机从集合中的得到一个元素将其从集合中删除并作为返回值返回
_db.smembers(self.key) # 返回集合的所有元素
_db.delete(key) # 删除整个集合, 成功返回1, 失败返回0
_db.srandmember(self.key) # 从集合中随机选取一个元素作为返回
_db.sismember(self.key, value) # 判断指定value是否在本集合中,成功返回1,失败返回0

例如,Master可利用redis将url上传到数据库

for i in range(20): # 将需爬取的糗事百科前20页的url并存入urls集合
  url = 'http://www.qiushibaike.com/hot/page/%d/' % (i + 1)
  _db.sadd('urls', url) # 将url插入关键字urls集合中,若url已存在则不再插入

进而Master和Slaver可从数据库里获取url

url = _db.spop('urls') # 随机从urls集合中取出一个url返回并将其删去

同理,Master可利用上面的方法将其他一些共用的资源上传到数据库,Slaver就可从数据库下载需要的东西。下面是一个完整的例子

# coding=utf-8
import urllib2
import re
import time
import redis

headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36'}
job_redis = redis.Redis(host='192.168.235.80') # host为主机的IP,port和db为默认值


class Clawer(object):

  identity = 'master' # 或slaver

  def __init__(self):
    if self.identity == 'master':
      for i in range(20): # 将需爬取的糗事百科前20页的url并存入urls集合
        url = 'http://www.qiushibaike.com/hot/page/%d/' % (i + 1)
        job_redis.sadd('urls', url)
    self.main()

  def get_content(self):
    """
    从糗事百科中获取故事
    :return: 故事列表
    """
    stories = []
    content_pattern = re.compile('<div class="content">([\w\W]*?)</div>([\w\W]*?)class="stats"') # 匹配故事内容(第一空)和是否含有图片(第二空)的模板
    pattern = re.compile('<.*?>') # 匹配包括括号及括号内无关内容的模板
    url = job_redis.spop('urls')
    while url: # 当数据库还存在网页url,取出一个并爬取
      try:
        request = urllib2.Request(url, headers=headers)
        response = urllib2.urlopen(request)
        text = response.read()
      except urllib2.URLError, e: # 若出现网页读取错误捕获并输出
        if hasattr(e, "reason"):
          print e.reason
      content = re.findall(content_pattern, text) # 获取含模板内容的列表
      for x in content:
        if "img" not in x[1]: # 过滤含图片的故事
          x = re.sub(pattern, '', x[0])
          x = re.sub('\n', '', x)
          stories.append(x)
      url = job_redis.spop('urls')
      time.sleep(3)

    return stories

  def main(self):
    self.get_content()

if __name__ == '__main__':
  Clawer()

将此代码在几台机器同时运行,调节其身份为master或slaver,做到简单的分布式爬虫

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
浅述python2与python3的简单区别
Sep 19 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
python中有函数重载吗
May 28 Python
python实现PolynomialFeatures多项式的方法
Jan 06 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 Python
Python3 伪装浏览器的方法示例
Nov 23 #Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 #Python
python数字图像处理之高级滤波代码详解
Nov 23 #Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 #Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 #Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 #Python
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 #Python
You might like
动易数据转成dedecms的php程序
2007/04/07 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
js密码强度检测
2016/01/07 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
微信小程序组件生命周期的踩坑记录
2021/03/03 Javascript
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
python实现扫描日志关键字的示例
2018/04/28 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
pygame实现五子棋游戏
2019/10/29 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python类的动态绑定实现原理
2020/03/21 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
Python 3.9的到来到底是意味着什么
2020/10/14 Python
Python可以用来做什么
2020/11/23 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
IE兼容css3圆角的实现代码
2011/07/21 HTML / CSS
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
Linux常见面试题
2013/03/18 面试题
《尊严》教学反思
2014/02/11 职场文书
巾帼志愿者活动方案
2014/08/17 职场文书
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL