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函数学习笔记
Oct 07 Python
python抓取网页时字符集转换问题处理方案分享
Jun 19 Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
Django权限设置及验证方式
May 13 Python
Python logging模块原理解析及应用
Aug 13 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 Python
python基础学习之递归函数知识总结
May 26 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
xml在joomla表单中的应用详解分享
2012/07/19 PHP
php数组删除元素示例
2014/03/21 PHP
javascript与CSS复习(三)
2010/06/29 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
Angular ng-class详解及实例代码
2016/09/19 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
详解package.json版本号规则
2019/08/01 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
python实现的jpg格式图片修复代码
2015/04/21 Python
深入浅析python中的多进程、多线程、协程
2016/06/22 Python
python list排序的两种方法及实例讲解
2017/03/20 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python 求某条线上特定x值或y值的点坐标方法
2019/07/09 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2013/01/18 面试题
团员自我评价范文
2015/03/10 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python
MySql重置root密码 --skip-grant-tables
2022/04/11 MySQL