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  __getattr__与__setattr__使用方法
Sep 06 Python
python中执行shell的两种方法总结
Jan 10 Python
基于python神经卷积网络的人脸识别
May 24 Python
详解Python如何生成词云的方法
Jun 01 Python
python 输出所有大小写字母的方法
Jan 02 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
python 工具 字符串转numpy浮点数组的实现
Mar 14 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
Chrome下ifame父窗口调用子窗口的问题示例探讨
2014/03/17 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
python安装教程
2018/02/28 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
优秀毕业生推荐信
2013/11/02 职场文书
对照检查剖析材料
2014/09/30 职场文书
合理化建议书
2015/02/04 职场文书
开学第一周值周总结
2015/07/16 职场文书
中秋节主题班会
2015/08/14 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
Python torch.flatten()函数案例详解
2021/08/30 Python
Redis实战高并发之扣减库存项目
2022/04/14 Redis