此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题。最好还是用scrapy-redis给出的例子代码

前言

scrapy是Python界出名的一个爬虫框架。Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘。有能人改变了scrapy的队列调度,将起始的网址从start_urls里分离出来,改为从Redis读取,多个客户端可以同时读取同一个redis,从而实现了分布式的爬虫。就算在同一台电脑上,也可以多进程的运行爬虫,在大规模抓取的过程中非常有效。

准备

既然这么好能实现分布式爬取,那都需要准备什么呢?

需要准备的东西比较多,都有:

- scrapy

- scrapy-redis

- redis

- python的mysqldb模块

- python的redis模块

为什么要有mysql呢?是因为我们打算把收集来的数据存放到mysql中

1. scrapy安装

pip install scrapy

2. scrapy-redis安装

pip install scrapy-redis

3.redis

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;

注意:我并没有在表的一开始检查字段是否存在,如果你在调试过程中不止一次的话,你可能需要多次删除表中数据。

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

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

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

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

最后来张数据库的图

本文相对比较简单,只是scrapy-redis的基本应用。本人也比较小白,刚刚开始学习,如有什么问题,欢迎提出来共同进步。

scrapy-redis mysql_scrapy-redis 构建分布式爬虫,此片文章有问题。不要用相关推荐

  1. 浅析redis与zookeeper构建分布式锁的异同

    作者:架构小菜 链接:https://www.jianshu.com/p/508620a76e00 进程请求分布式锁时一般包含三个阶段:1. 进程请求获取锁:2. 获取到锁的进程持有锁并执行业务逻辑: ...

  2. Redis实现分布式爬虫

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

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

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

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

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

  5. 如何构建一个分布式爬虫:基础篇

    继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...

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

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

  7. python爬虫分布式怎么构造_如何构建一个分布式爬虫:基础篇

    继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...

  8. scrapy框架之分布式爬虫

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

  9. scrapy-redis分布式爬虫学习记录

    目录 1. scrapy-redis是什么? 2. scrapy-redis工作原理 3.分布式架构 4. scrapy-redis的源码分析 5. 部署scrapy-redis 6. scrapy- ...

最新文章

  1. matlab 算法集锦
  2. Java单元测试-快速上手Junit
  3. 【MM模块】 Blanket PO 框架订单
  4. objective-C 自定义对象归档的实现
  5. Redis背后的故事
  6. Python的看门狗实现自动化实时对服务器、Windows或Linux文件夹的实时监控
  7. 工作193:vue.runtime.esm.js?2b0e:619 [Vue warn]: <transition-group> children must be keyed: <ElTag>
  8. 黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
  9. vivado使用方法
  10. 学前儿童健康教育 复习资料 渝粤题库整理
  11. gsm计算机网络,GSM是什么意思 GSM是什么网络【详细介绍】
  12. codevs 1296
  13. 显著性检测综述(完整整理)
  14. 802.1Q VLAN 简介
  15. 手把手教你如何用python制作自动翻译程序
  16. RDF数据(ttl)导入neo4j
  17. html实现点击图片全屏显示,用vue实现点击图片预览浏览器满屏大图
  18. Linux 内核编译
  19. java map key是否存在_java如何判断map集合中是否存在key?
  20. 极客时间_软件设计之美 笔记

热门文章

  1. [ARM异常]-linux中(aarch/aarch64)异常向量表介绍
  2. 详解虚函数的实现过程之多重继承(3)
  3. linux编译llvm代码
  4. IO和属性配置文件之组合拳
  5. python 获得两个数组(List)交集、并集与差集
  6. 10、 HAVING:过滤分组
  7. 1.5 字符串大小写转换(toLowerCase()和toUpperCase())
  8. 1.2.3 计算机系统的层次结构
  9. C语言易错题集 第一部
  10. C语言两种导入头文件的区别