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实现ipsec开权限实例
Nov 11 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
pandas series序列转化为星期几的实例
Apr 11 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
python3+requests接口自动化session操作方法
Oct 13 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
Python实现程序判断季节的代码示例
Jan 28 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
python中bytes和str类型的区别
Oct 21 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
谈谈PHP语法(4)
2006/10/09 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
JS 实现点击a标签的时候让其背景更换
2013/10/15 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
Python 里最强的地图绘制神器
2021/03/01 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
四风问题自查报告剖析材料
2014/02/08 职场文书
放牛班的春天观后感
2015/06/01 职场文书
python 判断文件或文件夹是否存在
2022/03/18 Python
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers