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共享引用(多个变量引用)示例代码
Dec 04 Python
python基础教程之类class定义使用方法
Feb 20 Python
Python最长公共子串算法实例
Mar 07 Python
Python实现身份证号码解析
Sep 01 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
使用python socket分发大文件的实现方法
Jul 08 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
python生成随机数、随机字符、随机字符串
Apr 06 Python
Elasticsearch 索引操作和增删改查
Apr 19 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
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
node.js中的console用法总结
2014/12/15 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
Vue.js递归组件实现组织架构树和选人功能案例分析
2019/07/03 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
Python中的字典遍历备忘
2015/01/17 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
python如何通过protobuf实现rpc
2016/03/06 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
Python魔法方法详解
2019/02/13 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
Python ellipsis 的用法详解
2020/11/20 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
政协会议宣传标语
2014/10/09 职场文书
个人更名证明
2015/06/23 职场文书
高中数学教学反思范文
2016/02/18 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python