Scrapy简单易用、灵活易拓展,任何人都可以根据需求方便的修改。它的开发社区活跃,并且是跨平台的,在Linux、 MaxOS以及Windows平台都可以使用。
Scrapy用途广泛,可以用于数据挖掘、监测和自动化。
网络爬虫是指:在互联网上自动爬取网站内容信息的程序,也被称作网络蜘蛛或网络机器人。
大型的爬虫程序被广泛应用于搜索引擎、数据挖掘等领域,个人用户或企业也可以利用爬虫收集对自身有价值的数据。
3、网络爬虫的基本流程
任何爬虫程序都遵循这三个基本流程:请求数据、解析数据和保存数据。
请求的数据除了普通HTML页面之外,还有JSON数据、字符串数据、图片、视频、音频等等。
当整个数据被请求后得到,对数据内容进行分析,并筛选出需要的内容。
将数据以某种格式保存起来,如:写入文件中(csv、json)等,或保存到数据库(MySQL、MongoDB)等等。
切换到项目中,即按照提示,切换到quotes文件夹中去
Spider 是用户编写用于从单个网站(或者一些网站)爬取数据的类。
为了创建一个Spider,必须继承']
4、站长之家全网爬案例
继前面的分析,完成后续项目
将每一个链接里的第一个页面数据信息爬取下来
Scrapy_redis 在scrapy 的基础上实现了更多,更强大的功能,具体体现在:reqeust去重,爬虫持久化,和轻松实现分布式
那么,scrapy_redis是如何帮助我们抓取数据的呢?
Scrapy并不会共享调度队列,也就是说Scrapy是不支持分布式的。为了支持分布式,我们需要让Scrapy支持共享调度队列,也就是改造成共享调度和去重的功能。
默认情况下Scrapy是不支持分布式的,需要使用基于Redis 的 Scrapy-Redis 组件才能实现分布式。
Redis数据库充当分发工具
将一个爬虫代码,分别部署在多台电脑上,共同完成整个爬虫任务。
使用Redis服务器来集中处理所有的请求,主要负责请求的去重和调度。通过这种方式,所有电脑端的爬虫共享了一个爬取队列,并且每个电脑端每次得到的请求都是其他爬虫未曾访问的。从而提高了爬虫效率。
得到一个请求之后,检查一下这个Request是否在Redis去重,如果在就证明其它的spider采集过,如果不在就添加进调度队列,等待别人获取。
Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件。
Scrapy-redis 提供了下面四种组件(components):(四种组件意味着这四个模块都要做相应的修改)
- Scheduler(调度器) - 原本在本机进行调度,现在在服务器进行调度,即redis数据库进行调度
- Duplication Filter(去重) - 原本去重后的数据保存到本地,保存到元组和列表,现在要保存到服务器中去
queue换成redis数据库(也是指redis队列),便能让多个spider去同一个数据库里读取,这样实现共享爬取队列。
Redis支持多种数据结构,这些数据结构可以很方便的实现这样的需求:
-
列表有lpush(),lpop(),rpush(),rpop(),这些方法可以实现先进先出,或者先进后出式的爬取队列。
-
集合元素是无序且不重复的,可以很方便的实现随机排序且不重复的爬取队列。
-
Scrapy的Request带有优先级控制,Redis中的集合也是带有分数表示的,可以用这个功能实现带有优先级调度的爬取队列。
Scrapy把待爬队列按照优先级建立了一个字典结构,比如:
然后根据request中的优先级,来决定该入哪个队列,出列时则按优先级较小的优先出列。由于Scrapy原来的Scheduler只能处理Scrapy自身的队列,不能处理Redis中的队列,所以原来的Scheduler已经无法使用,应该使用Scrapy-Redis的Scheduler组件。
Scrapy自带去重模块,该模块使用的是Python中的集合类型。该集合会记录每个请求的指纹,指纹也就是Request的散列值。指纹的计算采用的是hashlib的sha1()方法。计算的字段包含了,请求的Method,URL,Body,Header这几个内容,这些字符串里面只要里面有一点不同,那么计算出来的指纹就是不一样的。也就是说,计算的结果是加密后的字符串,这就是请求指纹。通过加密后的字符串,使得每个请求都是唯一的,也就是指纹是惟一的。并且指纹是一个字符串,在判断字符串的时候,要比判断整个请求对象容易。所以采用了指纹作为判断去重的依据。
Scrapy-Redis要想实现分布式爬虫的去重功能,也是需要更新指纹集合的,但是不能每个爬虫维护自己的单独的指纹集合。利用Redis集合的数据结构类型,可以轻松实现分布式爬虫的指纹判重。也就是说:每台主机得到Request的指纹去和Redis中的集合进行对比,如果指纹存在,说明是重复的,也就不会再去发送请求,如果不曾存在于Redis中的指纹集合,就会发送请求,并且将该指纹加入Redis的集合中。这样就实现了分布式爬虫的指纹集合的共享。
爬取所有省份链接内的新房和二手房。