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

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

前言

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

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

2. scrapy-redis安装

pip install scrapy-redis

同样可以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;

注意:我并没有在表的一开始检查字段是否存在,如果你在调试过程中不止一次的话,你可能需要多次删除表中数据。
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的基本应用。本人也比较小白,刚刚开始学习,如有什么问题,欢迎提出来共同进步。

时间: 2024-09-19 10:10:24

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

《Redis官方文档》用Redis构建分布式锁

原文链接  译者:yy-leo   校对:方腾飞(红体标记重点) 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可以获得更好的可靠性. 这篇文章的目的就是尝试提出一种官方权威的用Redis实现分布式锁管理器的算法,我们把这个算法称为RedLock,我们相信这个算法会比一般的普通方法更加安全可靠.我们也

用Docker构建分布式Redis集群

本文讲的是用Docker构建分布式Redis集群,[编者的话]本文介绍了如何使用Docker搭建Redis集群,很多读者都在问Docker能带来哪些实质性的好处,我想本文就是一个很好的例子.不使用Docker你也可以搭建Redis集群,那使用Docker后会有怎么样的优势了?我想可以用两个词总结:快速和复用. 我们经常会遇到这样一个问题:当我们想进行一个完整的测试的时候,往往缺少硬件或者其它资源.为了满足需求,我可能需要三台服务,或者说三个虚拟机.但是我发现我们没有时间来创建它们,并且如果要物理

基于Dubbo框架构建分布式服务

Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配置就能够实现分布式服务调用,也就是说服务提供方(Provider)发布的服务可以天然就是集群服务,比如,在实时性要求很高的应用场景下,可能希望来自消费方(Consumer)的调用响应时间最短,只需要选择Dubbo的Forking Cluster模式配置,就可以对一个调用请求并行发送到多台对等的提供方

基于Redis的分布式锁真的安全吗?(下)

自从我写完这个话题的上半部分之后,就感觉头脑中出现了许多细小的声音,久久挥之不去.它们就像是在为了一些鸡毛蒜皮的小事而相互争吵个不停.的确,有关分布式的话题就是这样,琐碎异常,而且每个人说的话听起来似乎都有道理.   今天,我们就继续探讨这个话题的后半部分.本文中,我们将从Antirez反驳Martin Kleppmann的观点开始讲起,然后会涉及到Hacker News上出现的一些讨论内容,接下来我们还会讨论到基于Zookeeper和Chubby的分布式锁是怎样的,并和Redlock进行一些对

基于Redis的分布式锁真的安全吗?(上)

网上有关Redis分布式锁的文章可谓多如牛毛了,不信的话你可以拿关键词"Redis 分布式锁"随便到哪个搜索引擎上去搜索一下就知道了.这些文章的思路大体相近,给出的实现算法也看似合乎逻辑,但当我们着手去实现它们的时候,却发现如果你越是仔细推敲,疑虑也就越来越多.   实际上,大概在一年以前,关于Redis分布式锁的安全性问题,在分布式系统专家Martin Kleppmann和Redis的作者antirez之间就发生过一场争论.由于对这个问题一直以来比较关注,所以我前些日子仔细阅读了与这

Shopify构建分布式可扩展应用的最佳实践

本文讲的是Shopify构建分布式可扩展应用的最佳实践,[编者的话]在构建大型分布式系统应用时,如何降低不同部分之间的依赖,增强系统的弹性,电商解决方案提供商 Shopify 给出了解决方法. @Container大会,专为一线开发者和运维工程师设计的顶级容器技术会议. 本文介绍了 Shopify 构建弹性平台的方法.这篇文章不仅读起来有意思,而且你可以把它运用到实践中,构建自有的弹性平台. Shopify 面临的扩展挑战 电商解决方案提供商 Shopify 每个月的独立访问用户大约有 3 亿.

scrapy_redis 和 docker 实现简单分布式爬虫

简介 在使用 scrapy 爬取 IT桔子公司 信息,用来进行分析,了解 IT 创业公司的一切情况,之前使用 scrapy 写了一个默认线程是10的单个实例,为了防止被 ban IP 设置了下载的速度,3万多个公司信息爬了1天多才完成,现在想到使用分布式爬虫来提高效率. 技术工具: Python3.5 scrapy scrapy_redis redis docker1.12 docker-compose Kitematic mysql SQLAlchemy 准备工作 安装 Docker 点这里

基于java的分布式爬虫

分类 分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行.由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL发送给其他爬虫.这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置. 根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1.基于局域网分布式网络爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高速的网络连接相互通信.这些爬虫通过同一个网络

使用Python的Scrapy框架编写web爬虫的简单示例_python

 在这个教材中,我们假定你已经安装了Scrapy.假如你没有安装,你可以参考这个安装指南. 我们将会用开放目录项目(dmoz)作为我们例子去抓取. 这个教材将会带你走过下面这几个方面:     创造一个新的Scrapy项目     定义您将提取的Item     编写一个蜘蛛去抓取网站并提取Items.     编写一个Item Pipeline用来存储提出出来的Items Scrapy由Python写成.假如你刚刚接触Python这门语言,你可能想要了解这门语言起,怎么最好的利用这门语言.假如