scrapy是python界出名的一个爬虫框架。Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 
虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘。有能人改变了scrapy的队列调度,将起始的网址从start_urls里分离出来,改为从redis读取,多个客户端可以同时读取同一个redis,从而实现了分布式的爬虫。就算在同一台电脑上,也可以多进程的运行爬虫,在大规模抓取的过程中非常有效。

准备

既然这么好能实现分布式爬取,那都需要准备什么呢? 
需要准备的东西比较多,都有: 
- scrapy 
- scrapy-redis 
- redis 
- mysql 
- python的mysqldb模块 
- python的redis模块 
为什么要有mysql呢?是因为我们打算把收集来的数据存放到mysql中

1. scrapy安装

pip install scrapy
  • 1
  • 2

也可以clone下相应的github地址https://github.com/scrapy/scrapy/tree/1.1

2. scrapy-redis安装

pip install scrapy-redis
  • 1
  • 2

同样可以clone下相应的github地址https://github.com/rolando/scrapy-redis 
他俩具体有什么区别呢?https://www.zhihu.com/question/32302268/answer/55724369有知乎大神的回答

3.redis

redis本身只提供了在类linux环境中安装,不支持windows,官网http://redis.io/,如果需要在windows下做练习的朋友,可以参考我的这篇http://blog.csdn.net/howtogetout/article/details/51520254

4.mysql

因为我们打算用mysql来存储数据,所以mysql的配置是不可或缺的。下载地址http://dev.mysql.com/downloads/

5.mysqldb模块和redis模块

为什么需要这2个呢,是因为python不能直接操作数据库,需要通过库来支持。而这2个就是相应数据库的支持库。 
mysqldb:https://sourceforge.net/projects/mysql-python/files/mysql-python/1.2.3/,windows环境下可以直接下.exe来快速安装 
redis:

pip install redis

这样就是最简单的了。

动工

先来看下scrapy-redis的一些不同的地方。 
 
首先就是class的父对象变了,变成了特有的RedisSpider,这是scrapy-redis里面自己定义的新的爬虫类型。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从list中pop出来成为请求的url地址。

我们这次选取的对象是58同城的平板电脑信息。

首先来看一下架构信息。 
 
scrapy.cfg文件我们可以不管,readme.rst文件也不管(这个是github上有用的,scrapy创建项目的时候并没有) 
pbdnof58文件夹内的结构: 
 
items定义文件,settings设置文件,pipelines处理文件以及spiders文件夹。 
spiders文件夹盛放着我们编写的具体爬虫: 
 
可以看到里面有2个爬虫,一个是用来爬所有的url地址,并将其传递给redis。而另外一个则是根据爬取出来的地址处理具体的商品信息。

具体来看。首先是settings.py文件。 
 
跟scrapy一样,写明spider的位置。 
 
2个处理数据的pipeline中的类,数字越小优先执行。 
 
因为数据要存放在mysql中,所以需要配置下mysql的信息。而redis是默认采用本地的,所以并没有配置信息,如果是连接别的主机的话,需要配置下redis的连接地址。 
item.py文件 
 
与scrapy相比多了个调度文件,多了个ItemLoader类,照着做就好了,ItemLoader类后面会用到的。 
pipeline.py文件 

最重要的是这个将结果存储到mysql中。 
要在一个名为qcl的数据库之中建一个名叫58pbdndb的表。qcl对应settings的配置。

create table 58pbdndb(id INT NOT NULL AUTO_INCREMENT,title VARCHAR(100) NOT NULL,price VARCHAR(40) NOT NULL,quality VARCHAR(40),area VARCHAR(40),time VARCHAR(40) NOT NULL,PRIMARY KEY ( id )
)DEFAULT CHARSET=utf8;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意:我并没有在表的一开始检查字段是否存在,如果你在调试过程中不止一次的话,你可能需要多次删除表中数据。 
58Urlspider.py文件 
 
这个爬虫实现了2个功能。1是如果next(也就是下一页)存在,则把下一页的地址压进redis的myspider:58_urls的这个list中,供自己继续爬取。2是提取出想要爬取的商品具体网址,压进redis的myspider:start_urls的list中,供另一个爬虫爬取。 
58spider-redis.py文件 

这个爬虫是用来抓取具体的商品信息。可以看到ItemLoader类的add_path和add_value方法的使用。

最后

运行方法跟scrapy相同,就是进入pbdnof58文件夹下(注意下面是只有spiders文件夹的那个).输入

scrapy crawl myspider_58page和scrapy crawl myspider_58
  • 1
  • 2

可以输入多个来观察多进程的效果。。打开了爬虫之后你会发现爬虫处于等待爬取的状态,是因为2个list此时都为空。所以需要

lpush myspider:58_urls http://hz.58.com/pbdn/0/
  • 1
  • 2

来设置一个初始地址,好啦,这样就可以愉快的看到所有的爬虫都动起来啦。 
最后来张数据库的图 

ps:本文的github地址:https://github.com/qcl643062/spider/tree/master/pbdnof58

使用scrapy-redis构建简单的分布式爬虫相关推荐

  1. 简单的分布式爬虫(下载小说)

    最初下载小说的爬虫只有二十几行代码,虽然二十几行代码就可以完成这项工作,但是如果把爬虫的各个功能封装成不同的类,这样便于以后复用也便于阅读. 拓展之后,把刚开始下载小说的代码拓展成一个基础爬虫,但是这 ...

  2. 基于Redis实现简单的分布式锁

    在分布式场景下,有很多种情况都需要实现最终一致性.在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA事务 ...

  3. 使用Redis构建简单的社交网站

    第1关:创建用户与动态 #!/usr/bin/env python #-*- coding:utf-8 -*- import re import time import redis conn = re ...

  4. 如何构建一个分布式爬虫:理论篇

    ## 前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一 ...

  5. python分布式爬虫系统_如何构建一个分布式爬虫:理论篇

    前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较 ...

  6. Redis实现分布式爬虫

    redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专 ...

  7. scrapy框架之分布式爬虫

    概念:我们需要搭建一个分布式的机群,让其对一组资源进行分布联合爬取 作用:提升爬取数据的效率 如何实现分布式? 安装一个scrapy-redis的组件(使用的是redis数据库) 原生的scrapy是 ...

  8. 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验

    一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...

  9. 纯手工打造简单分布式爬虫(Python)

    https://www.cnblogs.com/qiyeboy/p/7016540.html 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试. ...

  10. Java 多线程爬虫及分布式爬虫架构探索

    维护待采集的 URL 多线程爬虫程序就不能像单线程那样,每个线程独自维护这自己的待采集 URL,如果这样的话,那么每个线程采集的网页将是一样的,你这就不是多线程采集啦,你这是将一个页面采集的多次.基于 ...

最新文章

  1. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
  2. python读文件的解码方式_跳过Python文件读取中的不可解码字符
  3. 有趣的0-1背包问题:分割等和子集
  4. 鸿蒙是安卓换皮UI,鸿蒙2.0是安卓换皮?还真不是
  5. IT巨头组队年末将推“Gen-Z”内存新架构,英特尔和思科缺席是闹哪样?
  6. Golang实践录:静态资源文件整合:初步使用
  7. html自适应布局_三分钟学会响应式布局和自适应布局
  8. python中string、json、bytes的转换
  9. php生成一个500错误_Hyperf 发布 v2.0.1 版本 | 企业级的 PHP 微服务云原生协程框架...
  10. java与spss交互_典型相关分析及其适用范围和spss操作(转)
  11. NXP iMX8基于eIQ框架测试Machine Learning
  12. ThinkPHP 汉字转成多种形式拼音
  13. WordPress中导入图片模糊
  14. 基于VisMockup装配公差分析技术(VisVSA)的介绍
  15. 我从实习到现在的经历,幸运女神总会来到!
  16. Python如何设置文件保存位置(txt文件保存位置)
  17. android电视 浏览器 全屏,小屏幕大世界 傲游云浏览器Android全屏模式
  18. 编写一个具有搜索功能的搜索框
  19. http 状态码以及http请求、响应
  20. 使用CODEX为你的项目编制一套代码库目录/索引

热门文章

  1. Django学习笔记-MySQL
  2. IDDD 实现领域驱动设计-理解限界上下文
  3. Tomcat + Spring MVC + HttpClient:怎样使用PUT和PATCH方法传递数据
  4. how to be successful with salesforce
  5. if判断与while、for循环语句
  6. 关于NSStringFromClass的一点见解
  7. row_number()分页返回结果顺序不确定
  8. [USACO11DEC] 牧草种植Grass Planting
  9. JMeter数据库操作详解
  10. Python远程连接Windows,并调用Windows命令(类似于paramiko)