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中捕捉详细异常信息的代码示例
Sep 18 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
Python 内置函数memoryview(obj)的具体用法
Nov 23 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
快速了解Python开发环境Spyder
Jun 29 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
May 24 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
PHP+MYSQL开发工具及资源收藏
2007/01/02 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
轻松实现php文件上传功能
2017/02/17 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
详解JavaScript作用域和作用域链
2019/03/19 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
python模块之re正则表达式详解
2017/02/03 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
python 实现简易的记事本
2020/11/30 Python
HTML5标签小集
2011/08/02 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
什么是测试驱动开发(TDD)
2012/02/15 面试题
运动会广播稿500字
2014/01/28 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
女儿满月酒致辞
2015/07/29 职场文书
python not运算符的实例用法
2021/06/30 Python
python实现剪贴板的操作
2021/07/01 Python