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多线程http下载实现示例
Dec 30 Python
利用Python的Django框架中的ORM建立查询API
Apr 20 Python
python函数装饰器用法实例详解
Jun 04 Python
实例Python处理XML文件的方法
Aug 31 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
python enumerate函数的使用方法总结
Nov 15 Python
浅谈flask中的before_request与after_request
Jan 20 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
python函数调用,循环,列表复制实例
May 03 Python
详解python tcp编程
Aug 24 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
Pandas对每个分组应用apply函数的实现
Dec 13 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
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
PHP常用的小程序代码段
2015/11/14 PHP
实例讲解php数据访问
2016/05/09 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python定时器(Timer)用法简单实例
2015/06/04 Python
Python金融数据可视化汇总
2017/11/17 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
对python中使用requests模块参数编码的不同处理方法
2018/05/18 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
美国顶级水上运动专业店:Marine Products
2018/04/15 全球购物
学校百日安全生产活动总结
2014/07/05 职场文书
《将心比心》教学反思
2016/02/23 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
Python可视化神器pyecharts绘制水球图
2022/07/07 Python
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang