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实现周期性抓取网页内容的方法
Nov 04 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
pycharm安装图文教程
May 02 Python
python连接数据库的方法
Oct 19 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
启动Atom并运行python文件的步骤
Nov 09 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 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实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
用JavaScript显示随机图像或引用
2009/04/21 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
Python处理字符串之isspace()方法的使用
2015/05/19 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
Python实现完整的事务操作示例
2017/06/20 Python
python实现Adapter模式实例代码
2018/02/09 Python
python+opencv实现阈值分割
2018/12/26 Python
Django单元测试工具test client使用详解
2019/08/02 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
selenium+Chrome滑动验证码破解二(某某网站)
2019/12/17 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
英文自荐信格式
2013/11/28 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
病假证明模板
2015/06/19 职场文书
员工考勤管理制度
2015/08/06 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
vue实现滑动解锁功能
2022/03/03 Vue.js
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL