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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
python删除过期log文件操作实例解析
Jan 31 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
Mar 31 Python
对numpy中array和asarray的区别详解
Apr 17 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
基于python指定包的安装路径方法
Oct 27 Python
python2.7实现邮件发送功能
Dec 12 Python
Python为何不能用可变对象作为默认参数的值
Jul 01 Python
Tensorflow分批量读取数据教程
Feb 07 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
实用函数5
2007/11/08 PHP
PHP安全防范技巧分享
2011/11/03 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
浅谈Sizzle的“编译原理”
2015/04/14 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
Python OS模块常用函数说明
2015/05/23 Python
深入理解Python3 内置函数大全
2017/11/23 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
Python post请求实现代码实例
2020/02/28 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
力学专业毕业生自荐信
2013/11/17 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
企业宣传标语
2014/06/09 职场文书
生物技术专业求职信
2014/06/10 职场文书
装修活动策划方案
2014/08/27 职场文书
规范化管理年活动总结
2014/08/29 职场文书
六一儿童节标语
2014/10/08 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
2016年母亲节寄语
2015/12/04 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS