基于 Scrapy-Redis 全国房源信息抓取系统

基于 Scrapy-Redis 全国房源信息抓取系统

摘要

近几年,人们对房源信息的关注度越来越高。如何对全国房源信息进行灵活高效的采集并存储,对全国房源信息的分析工作起到重要作用。文中在分析房天下站点特征结构的基础上采用 Python 开源框架 Scrapy 搭配 Redis 数据库,设计实现了一套抓取速度快、扩展性高的分布式爬虫系统,获取的数据具有良好的实时性和准确性,为后续分析工作提供了有力的数据支撑。
关键字 :Scrapy 框架;Scrapy-Redis;分布式爬虫;可视化

前言

爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色。相比于其他技术,爬虫技术虽然在实现上比较简单,没有那么多深奥的技术难点,但想要构建一套稳定、高效、自动化的爬虫框架,也并不是一件容易的事情。本文介绍了一种分布式爬虫框架的实现方法和工作原理。[1−2]

结构设计

scrapy 是一个 python 爬虫框架,爬取的效率极高,具有高度的定制性,但是不支持分布式。而 scrapy-redis 是一套基于 redis 库,运行在 scrapy 框架之上的组件,可以让scapy 支持分布式策略。[3]
Salverr 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。
选择 redis 数据库的原因:[4]

  • redis支持主从同步,而且数据都是缓存 在内存中的,所以基于redis的分布式爬
    虫,对请求和数据的高频率读取效率都非常高
  • scrapy-redis和scrapy的关系就像电脑和固态硬盘一样,是电脑中的一个插件,能
    让电脑更快的运行
  • scrapy是一个爬虫框架,scrapy-redis则是这个框架上可以选择的插件,它可以让
    爬虫跑得更快。
Scrapy框架调度器

基于 Scrapy-Redis 全国房源信息抓取系统_第1张图片 图1 Scrapy 框架

Scrapy框架解释

如图1所示未Scrapy框架,该框架解释[5]如下:

  1. 从优先级队列中获取requests对象,交给engine;
  2. engine将requests对此昂交给下载器下载,期间会通过downloadmiddleware的process_request方法;
  3. 下载器完成下载,获得response对象,将该对象交给engine,期间会经过downloadmiddleware的process_response()方法;
  4. engine将获得的response对象交给spider进行解析,期间会经过spidermiddleware的process_spider_input()方法;
  5. spider解析下载器下载下来的response,返回item或links(url);
  6. item或者link经过spidermiddleware的process_spider_out()方法,交给engine;
  7. engine将item交给item pipeline,将links交给调度器;
  8. 在调度器中,先将requests对象利用scrapy内置的指纹函数生成一个指纹;
  9. 如果requests对象中的don’t filter参数设置为False,并且该requests对象的指纹不在信息指纹的队列中,那么就把该requests对象放到优先级队列中。
中间件

spider与engine之间(爬虫中间件)
介于scrapy引擎和爬虫之间的框架,主要工作就是处理爬虫的响应输入和请求的输
出。
download与engine之间(下载器中间件)
介于scrapy引擎和下载器之间的框架,主要是处理scrapy引擎与下载器之间的请求和响应。
scrapy框架中的middleware.py

  • Scrapy Middleware有以下几个函数被管理
  1. process_spider_input:接收一个response对象并处理;
  2. process_spider_exception:spider出现异常时被调用;
  3. process_spider_output:当spider处理response返回result时,就会调用该
    方法;
  4. process_spider_requests:当spider发出请求时,被调用;
  • Download Middleware有以下几个函数被管理
  1. process_requests:requests通过下载中间件的时候,该方法被调用,这里可
    以通过设置代理,设置request.meta[‘proxy’]就OK了;
  2. process_response:下载结果经过中间件的时候会被这个方法解惑来进行处
    理;
    3… process_exception:下载过程中出现异常的时候会被调用。
scrapy的优缺点

优点:scrapy 是异步的,写middleware,方便写一些统一的过滤器。
缺点:基于python的爬虫框架,扩展性比较差,基于twisted框架,运行中的exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。

Scrapy-Redis框架

基于 Scrapy-Redis 全国房源信息抓取系统_第2张图片

图 2 Scrapy-Redis 框架
如图2所示,可以发现,scrapy-redis在scrapy的架构上增加了redis,与scrapy相差无几。本质的区别就是,将scrapy的内置的去重的队列和待抓取的request队列换成了redis的集合。此改动就使scrapy-redis具备分布式特性。

Scrapy-Redis组件

Scrapy-redis提供了下面四种组件(components):(四种组件意味着这四个模块都要做相应的修改)。

Scheduler组件

Scrapy改造了python本来的collection.deque(双向队列)形成了自己的Scrapy queue,但是Scrapy多个spider不能共享待爬取队列Scrapy queue, 即Scrapy本身不支持爬虫分布式,scrapy-redis 的解决是把这个Scrapy queue换成redis数据库(也是指redis队列),从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。
Scrapy中跟“待爬队列”直接相关的就是调度器Scheduler,它负责对新的request进行入列操作(加入Scrapy queue),取出下一个要爬取的request(从Scrapy queue中取出)等操作。它把待爬队列按照优先级建立了一个字典结构,然后根据request中的优先级,来决定该入哪个队列,出列时则按优先级较小的优先出列。为了管理这个比较高级的队列字典,Scheduler需要提供一系列的方法。但是原来的Scheduler已经无法使用,所以使用Scrapyredis的scheduler组件。

Duplication Filter组件

Scrapy中用集合实现这个request去重功能,Scrapy中把已经发送的request指纹放入到一个集合中,把下一个request的指纹拿到集合中比对,如果该指纹存在于集合中,说明这个request发送过了,如果没有则继续操作。在scrapy-redis中去重是由Duplication Filter组件来实现的,它通过redis的set 不重复的特性,巧妙的实现了Duplication Filter去重。scrapy-redis调度器从引擎接受request,将request的指纹存⼊redis的set检查是否重复&

你可能感兴趣的:(Python,数据分析,python,爬虫,redis,数据可视化)