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不带重复的全排列代码
Aug 13 Python
跟老齐学Python之类的细节
Oct 13 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
Feb 17 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
python flask实现分页的示例代码
Aug 02 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
关于Python中进度条的六个实用技巧分享
Apr 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
用PHP读取IMAP邮件
2006/10/09 PHP
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
jquery选择符快速提取web表单数据示例
2014/03/27 Javascript
jQuery知识点整理
2015/01/30 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
vue实现登录拦截
2020/06/29 Javascript
vue 导出文件,携带请求头token操作
2020/09/10 Javascript
python简单分割文件的方法
2015/07/30 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
python实现飞机大战游戏
2020/10/26 Python
完美解决python3.7 pip升级 拒绝访问问题
2019/07/12 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
python定时截屏实现
2020/11/02 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
护士演讲稿优秀范文
2014/04/30 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书