• 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了,当然有些代码还是需要改的。

  • 相关阅读:
    数据分析实战(4)-Kaggle-谷歌数据分析
    东财主力资金异动数据探索分析
    数据分析实战(2)-Kaggle-共享单核数据分析
    爬虫框架Scrapy 之(二) --- scrapy文件介绍
    爬虫框架Scrapy 之(一) --- scrapy整体认识
    atomic
    坑爹的缩写
    一些坑爹的结构体
    sensor hub
    android p 常识
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/9297435.html
Copyright © 2020-2023  润新知