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的Asyncore异步Socket模块及实现端口转发的例子
Jun 14 Python
python在每个字符后添加空格的实例
May 07 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
解决python的空格和tab混淆而报错的问题
Feb 26 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 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
PHPLog php 程序调试追踪工具
2009/09/09 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
JavaScript自定义超时API代码实例
2020/04/30 Javascript
儿童学习python的一些小技巧
2018/05/27 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
Python如何读写CSV文件
2020/08/13 Python
基本款天堂:Everlane
2017/05/13 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
工程师岗位职责
2013/11/08 职场文书
2014升学宴答谢词
2014/01/26 职场文书
入党积极分子自我鉴定
2014/02/18 职场文书
业务内勤岗位职责
2014/04/30 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
收款委托书范本
2014/09/11 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
红色故事汇观后感
2015/06/18 职场文书
2015年国庆节标语大全
2015/07/30 职场文书
财务人员入职担保书
2015/09/22 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
Apache Calcite 实现方言转换的代码
2021/04/24 Servers
anaconda python3.8安装后降级
2021/06/11 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS