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库urllib与urllib2主要区别分析
Jul 13 Python
python字符串排序方法
Aug 29 Python
零基础写python爬虫之神器正则表达式
Nov 06 Python
Django中使用locals()函数的技巧
Jul 16 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
Django自定义用户表+自定义admin后台中的字段实例
Nov 18 Python
flask实现验证码并验证功能
Dec 05 Python
Python实现钉钉订阅消息功能
Jan 14 Python
PyTorch笔记之scatter()函数的使用
Feb 12 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
python 通过使用Yolact训练数据集
Apr 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
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
YII路径的用法总结
2014/07/09 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
JS的Document属性和方法小结
2013/09/17 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
结合Vue控制字符和字节的显示个数的示例
2018/05/17 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
2018/05/25 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
Python 修改列表中的元素方法
2018/06/26 Python
详解python Todo清单实战
2018/11/01 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
美容院店长岗位职责
2014/04/08 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
水电施工员岗位职责
2015/04/11 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android