zoukankan      html  css  js  c++  java
  • 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了,当然有些代码还是需要改的。

  • 相关阅读:
    了解web前端基本常识
    解决移动端输入法挡住输入框的办法
    简单实现根据选项显示不同的表单
    关于“使用本服务器,放到正规的第三方服务器就不安全”的想法
    简单实现网页换肤功能
    Java项目引入eclipse注意事项
    hexo博客发布注意事项
    hexo博客出现“Cannot GET/xxxx”的错误
    C#中ToString()格式详解
    SQLSERVER 时间日期函数,查询今天日期、昨天、一个星期、半年前的数据
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/9297435.html
Copyright © 2011-2022 走看看