scrapy和scrapy-redis框架

1、scrapy

scrapy作为一款优秀的爬虫框架,在爬虫方面有这众多的优点。能快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

 

 

它的主要组件有如下几种:

引擎(Scrapy):用来处理整个系统的数据流处理, 触发事务(框架核心)

调度器(Scheduler):用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

下载器(Downloader):用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

爬虫(Spider):爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

项目管道(pipelines):负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

下载器中间件(Downloader Middlewares):位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应

爬虫中间件(Spider Middlewares):介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。

调度中间件(Scheduler Middlewares):介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

2、常用功能

1.创建scrapy项目:

scrapy startproject xxx
scrapy genspider baidu baidu.com
scrapy crawl baidu

 

2.start_requests方法

在启动scrapy项目会默认运行start_requests方法,通过重写这个方法可以实现很多功能

 

3.配置DUPEFILTER_CLASS

配置DUPEFILTER_CLASS可以达到去重,可以用scrapy的也可以用scrapy-redis的。

 

4.自动携带cookie

在获取请求时加上参数 meta={'cookiejar': True}  可以实现自动携带cookie,这样就不需要自己写了。

 

5.通过下载中间件实现代理

在Middlewares.py 里的xxDownloaderMiddleware类中的process_request方法里可以设置代理,设置request.meta['proxy'] 就行

 

3、scrapy-redis

使用这个首先需要安装redis,这个不说。scrapy-redis常用的设置有如下一些:

 1 去重+调度器:
 2 REDIS_HOST = '127.0.0.1'                            # 主机名
 3 REDIS_PORT = 6379                                   # 端口
 4 # REDIS_URL = 'redis://user:pass@hostname:9001'       # 连接URL(优先于以上配置)
 5 REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
 6 # REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定连接Redis的Python模块  默认:redis.StrictRedis
 7 REDIS_ENCODING = "utf-8"
 8 
 9 # 有引擎来执行:自定义调度器
10 # from scrapy_redis.scheduler import Scheduler
11 SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
12 
13 SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'          # 默认使用优先级队列(默认),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
14 SCHEDULER_QUEUE_KEY = '%(spider)s:requests'                         # 调度器中请求存放在redis中的key
15 SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"                  # 对保存到redis中的数据进行序列化,默认使用pickle
16 SCHEDULER_PERSIST = False                                            # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
17 SCHEDULER_FLUSH_ON_START = True                                     # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
18 # SCHEDULER_IDLE_BEFORE_CLOSE = 10                                    # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
19 SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'                  # 去重规则,在redis中保存时对应的key
20 SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'# 去重规则对应处理的类
21 DUPEFILTER_DEBUG = False

 

通过对这些配置进行更改就可以实现scrapy-redis了,当然有些代码还是需要改的。

posted @ 2018-07-12 00:34  starry_sky  阅读(1152)  评论(0编辑  收藏  举报