scrapy-redis mysql_scrapy-redis 构建分布式爬虫,此片文章有问题。不要用
此篇文章为转载,只供学习,有很多问题,如没有解决分布式去重问题。最好还是用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 构建分布式爬虫,此片文章有问题。不要用相关推荐
- 浅析redis与zookeeper构建分布式锁的异同
作者:架构小菜 链接:https://www.jianshu.com/p/508620a76e00 进程请求分布式锁时一般包含三个阶段:1. 进程请求获取锁:2. 获取到锁的进程持有锁并执行业务逻辑: ...
- Redis实现分布式爬虫
redis分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的爬取 原生的scrapy是不可以实现分布式爬虫, 原因如下: 调度器无法共享 管道无法共享 scrapy-redis组件:专 ...
- 【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验
一.写在前面 之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验.所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对I ...
- 如何构建一个分布式爬虫:理论篇
## 前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一 ...
- 如何构建一个分布式爬虫:基础篇
继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...
- python分布式爬虫系统_如何构建一个分布式爬虫:理论篇
前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较 ...
- python爬虫分布式怎么构造_如何构建一个分布式爬虫:基础篇
继上篇(如何构建一个分布式爬虫:理论篇)我们谈论了Celery的基本知识后,本篇继续讲解如何一步步使用Celery构建分布式爬虫.这次我们抓取的对象定为celery官方文档(Celery - Dist ...
- scrapy框架之分布式爬虫
概念:我们需要搭建一个分布式的机群,让其对一组资源进行分布联合爬取 作用:提升爬取数据的效率 如何实现分布式? 安装一个scrapy-redis的组件(使用的是redis数据库) 原生的scrapy是 ...
- scrapy-redis分布式爬虫学习记录
目录 1. scrapy-redis是什么? 2. scrapy-redis工作原理 3.分布式架构 4. scrapy-redis的源码分析 5. 部署scrapy-redis 6. scrapy- ...
最新文章
- matlab 算法集锦
- Java单元测试-快速上手Junit
- 【MM模块】 Blanket PO 框架订单
- objective-C 自定义对象归档的实现
- Redis背后的故事
- Python的看门狗实现自动化实时对服务器、Windows或Linux文件夹的实时监控
- 工作193:vue.runtime.esm.js?2b0e:619 [Vue warn]: <transition-group> children must be keyed: <ElTag>
- 黄聪:C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件,有图解
- vivado使用方法
- 学前儿童健康教育 复习资料 渝粤题库整理
- gsm计算机网络,GSM是什么意思 GSM是什么网络【详细介绍】
- codevs 1296
- 显著性检测综述(完整整理)
- 802.1Q VLAN 简介
- 手把手教你如何用python制作自动翻译程序
- RDF数据(ttl)导入neo4j
- html实现点击图片全屏显示,用vue实现点击图片预览浏览器满屏大图
- Linux 内核编译
- java map key是否存在_java如何判断map集合中是否存在key?
- 极客时间_软件设计之美 笔记