开发者社区> lhyxcxy> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题。最好还是用scrapy-redis给出的例子代码 前言 scrapy是Python界出名的一个爬虫框架。Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘。有
+关注继续查看

此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题。最好还是用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的一些不同的地方。
scrapy1-redis
首先就是class的父对象变了,变成了特有的RedisSpider,这是scrapy-redis里面自己定义的新的爬虫类型。其次就是不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从list中pop出来成为请求的url地址。

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

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

具体来看。首先是settings.py文件。
settings1
跟scrapy一样,写明spider的位置。
pipeline
2个处理数据的pipeline中的类,数字越小优先执行。
mysql
因为数据要存放在mysql中,所以需要配置下mysql的信息。而redis是默认采用本地的,所以并没有配置信息,如果是连接别的主机的话,需要配置下redis的连接地址。
item.py文件
item
与scrapy相比多了个调度文件,多了个ItemLoader类,照着做就好了,ItemLoader类后面会用到的。
pipeline.py文件
mysqlpipe
最重要的是这个将结果存储到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文件
58url
这个爬虫实现了2个功能。1是如果next(也就是下一页)存在,则把下一页的地址压进redis的myspider:58_urls的这个list中,供自己继续爬取。2是提取出想要爬取的商品具体网址,压进redis的myspider:start_urls的list中,供另一个爬虫爬取。
58spider-redis.py文件
58spider-redis
这个爬虫是用来抓取具体的商品信息。可以看到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的基本应用。本人也比较小白,刚刚开始学习,如有什么问题,欢迎提出来共同进步。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
面试官:redis怎么使用的分布式锁
面试官:redis怎么使用的分布式锁
31 0
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践(下)
分布式缓存Redis分区(分片)的高可用方案在大厂中的实践
72 0
11、web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
xpath表达式  //x 表示向下查找n层指定标签,如://div 表示查找所有div标签  /x 表示向下查找一层指定的标签  /@x 表示查找指定属性的值,可以连缀如:@id @sr...
1039 0
12、web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代star...
1597 0
10、web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
Scrapy框架安装 1、首先,终端执行命令升级pip: python -m pip install --upgrade pip2、安装,wheel(建议网络安装) pip install...
1223 0
Redis分片(分布式缓存)
分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集. 1 分片何用 Redis 的分片承担着两个主要目标: 允许使用很多电脑的内存总和来支持更大的数据库。
5495 0
分布式系统框架Spring+Redis+SSO
以实战方式实现一套经典的分布式系统架构
3997 0
用Docker构建分布式Redis集群
本文讲的是用Docker构建分布式Redis集群,【编者的话】本文介绍了如何使用Docker搭建Redis集群,很多读者都在问Docker能带来哪些实质性的好处,我想本文就是一个很好的例子。不使用Docker你也可以搭建Redis集群,那使用Docker后会有怎么样的优势了?我想可以用两个词总结:快速和复用。
1313 0
scrapy-redis 和 scrapy-splash结合 做分布式渲染爬取
本人在scrapy-redis项目中的setting.py中配置,可时中有问题。但是可以使用以下方法: 首先,你要确保安装了splash,并且已经启动 (1)先安装scrapy-splash库: [python] view plain copy pip install scrapy-splash   (2)然后
4889 0
scrapy-redis 安装 及使用 结合例子解释
scrapy-redis安装及配置 scrapy-redis 的安装 pip install scrapy-redis easy_install scrapy-redis 下载 http://redis.io/download 版本推荐 stable 3.0.2 运行redis redis-server redis.conf 清空缓存 redis-cli flush
4531 0
+关注
lhyxcxy
专注于前后端服务器交互,人工智能,NLP领域
413
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载