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 相关文章推荐
pygame学习笔记(5):游戏精灵
Apr 15 Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
Python使用pickle模块储存对象操作示例
Aug 15 Python
python lxml中etree的简单应用
May 10 Python
详解python深浅拷贝区别
Jun 24 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
python 线程的五个状态
Sep 22 Python
Python基于Opencv识别两张相似图片
Apr 25 Python
如何用Python搭建gRPC服务
Jun 30 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
PHP 采集程序中常用的函数
2009/12/09 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
实用框架(iframe)操作代码
2014/10/23 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
一次$.getJSON不执行的简单记录
2016/07/19 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
在Django的模型中添加自定义方法的示例
2015/07/21 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
基于python实现聊天室程序
2018/07/27 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
Python爬取知乎图片代码实现解析
2019/09/17 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
2020/05/11 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
学生会主席就职演讲稿
2014/01/14 职场文书
结婚保证书范文
2014/04/29 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
六五普法学习心得体会
2016/01/21 职场文书
ThinkPHP5和ThinkPHP6的区别
2021/03/31 PHP
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android