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连接mysql调用存储过程示例
Mar 05 Python
Python httplib模块使用实例
Apr 11 Python
python定时检查某个进程是否已经关闭的方法
May 20 Python
Python守护进程和脚本单例运行详解
Jan 06 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 Python
Python中zip函数如何使用
Jun 04 Python
Python爬虫进阶之Beautiful Soup库详解
Apr 29 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程序员工具
2008/05/26 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
2019/09/26 PHP
js arguments对象应用介绍
2012/11/28 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
Python设计模式之MVC模式简单示例
2018/01/10 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
python实现AES加密解密
2019/03/28 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
管理心得体会
2013/12/28 职场文书
乔迁之喜主持词
2014/03/27 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技