python网络爬虫--scrapy框架(8)

一、简介

它是使用了纯python打造的爬虫框架,包含了数据获取、数据提取、数据存储等。

Scrapy 使用了 Twisted(其主要对手是Tornado)异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。

1.1 框架

框架:和其他三方库没什么本质的区别。

框架的优点:

1.可以简化开发,用少量的代码实现复杂的功能。
2.架构设计
3.代码的可维护性和可扩展性都比较强

框架的缺点:

1.入门门槛高

1.2 知识点

1.2.1 回调函数:

  • 在同步开发中没有回调函数的概念
  • 回调函数使用场景都是异步开发
  • 异步操作完成,主动通知给程序
    • 这个过程就叫回调

1.2.2 同步和异步

  • 同步
    • 程序线性执行
  • 异步
    • 程序并行执行
    • 异步通常都用在耗时操作中

1.2.3 yield

  • 加强版本的return
    • 返回并记录位置
    • 下次可以继续执行
  • 在Scrapy中大量使用
  • 可以不中断程序进行数据返回

1.2.4 观察者模式

1.2.5 Selector

  • 选择器,提取之后的对象
  • get
    • 获取内部的内容

2. scrapy框架的使用

2.1 创建工程

终端下:

scrapy startproject PROJECT_NAME

      PROJECT_NAME为工程名字

scrapy genspider SPIDER_NAME SPIDER_URL

      SPIDER_NAME 爬虫文件名、SPIDER_URL  爬取网站地址

2.2 scrapy项目的目录结构

  • PROJECT_NAME
    • PROJECT_NAME
      • spiders
        • _init_.py
      • _init_.py
      • items.py (定义数据的结构)
      • middleware.py
      • pipelines.py (管道,处理item数据)
      • settings.py
    • scrapy.cfg

Settings.py

包含参数描述
BOT_NAME工程名
SPIDER_MODULES爬虫文件的存放路径
NEWSPIDER_MODULE新创建的爬虫生成在哪
ROBOTSTXT是否遵守robots协议
CONCURRENT_REQUESTS同时最大的并发请求数
DOWNLOAD_DELAY下载延迟
COOKIES_ENABLED是否启用COOKIE
DEFAULT_REQUEST_HEADERS默认请求头
SPIDER_MIDDLEWARE爬虫中间件
DOWNLOADER_MIDDLEWARE下载中间件
EXTENSIONS拓展库
ITEM_PIPELINES数据管道
AUTOTHROTTLE自动限流、自动降频
HTTPCACHE网络缓存

Middleware

  • 在不修改源代码的情况下,动态添加功能和逻辑
  • SpiderMiddleware
  • DownloaderMiddleware

管道:

管道的使用需要在settings中开启
键是管道的位置
管道距离引擎的远近,越小越近,数据越先经过

2.3 新建爬虫文件的基本格式

新建名为 lab1.py 的文件

import scrapy


class Lab1Spider(scrapy.Spider):
    name = 'lab1'     # 爬虫的名字,唯一标识
    allowed_domains = ['lab.scrapyd.cn']   # 允许的主站,请求地址是它,会被过滤。
    start_urls = ['http://lab.scrapyd.cn/']  # 开始的地址

    def parse(self, response):
        """请求成功的回调函数,接收response"""
        pass

突破过滤:

  • 添加到允许的主站中
  • 在请求发出的时候,告诉它不要过滤

三、Scrapy爬虫框架执行流程

  • Engine引擎开始
    • 调用了spiders中的spider的启动方法
  • 获取到了spider中start_urls
  • 将urls转换成请求(request)发送出去
  • request通过downloader进行下载,请求
  • 生成response
  • response通过engine返回到spider中的回调函数 parse上
  • parse中做数据提取
    • 下一个请求的地址
    • 数据
    • 都需要通过yield进行返回处理
  • yield的地址会提交到Engine,分配到调度器,开始进行上面过程的循环
  • yield的数据,会交给ItemPipeline
    • 怎么存储就是开发者的事了

四、scrapy框架架构图

在这里插入图片描述

模块名作用是否实现
Scrapy Engine 引擎总指挥:负责数据和信号在不同模块间传递scrapy已实现
Scheduler 调度器一个队列,存放引擎发来的request请求scrapy已实现
Downloader 下载器把引擎发来的request请求下载,并发给引擎scrapy已实现
Spider 爬虫处理引擎发来的response,提取数据、url,并发给引擎需要手写
Item Pipeline 管道处理引擎发来的数据,比如存储需要手写
Downloader MiddleWares 下载中间件可自定义的下载扩展一般不用手写
Spider MiddleWares 爬虫中间件可自定义request请求和进行response过滤一般不用手写

五、scrapy框架的类

5.1 Spider

  • 属性

    • crawler
    • custom_settings
    • settings
    • name
    • start_urls
  • 方法

    • logger
    • log
    • from_crawler
    • start_requests
    • make_requests_from_url
    • parse
    • update_settings
    • handles_request
    • close
  • 常用

    • log
    • start_requests
    • parse

    5.2 Request

    • 属性
    • body
    • callback
    • cookies
    • dont_filter
    • errorback
    • flags
    • headers
    • method
    • priority
    • url
  • 方法

    • copy
    • replace
    • from_curl
    • cb_kwargs
    • meta
    • encoding
  • 常用

    • url
    • callback
    • headers
    • cookies
    • errorback

5.3 Response

  • 属性
    • body
    • certificate
    • flags
    • headers
    • ip_address
    • request
    • status
    • url
  • 方法
    • cb_kwargs
    • meta
    • text
      • 默认不能使用
      • 返回的内容不一定是文字
    • copy
    • replace
    • urljoin
      • 拼接相对路径
      • 基于当前页面拼接子页面
    • css
      • 他们两个都是针对文本的
    • xpath
      • 他们两个都是针对文本的
    • follow
    • follow_all
  • 常用
    • meta
      • 其实就是request上的
      • 在request上设置,在response可以获取
      • 通信的一种形式

5.4 object_ref

  • scrapy中存在资源统计模块
  • object_ref 就是统计的标记

5.5 log 日志

  • 企业开发项目中
  • 一般会将调试(运行)信息存储到文件中
  • 所有的编程语言都有的一种工具
  • python中的日志一个内置模块
  • logging

六、日志

Log简介

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

通过log的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用log足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用的健康状况,及时发现问题并快速定位、解决问题,补救损失。

Log的用途

不管是使用何种编程语言,日志输出几乎无处不再。总结起来,日志大致有以下几种用途:

  • 问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在安装配置时,通过日志可以发现问题。
  • 状态监控:通过实时分析日志,可以监控系统的运行状态,做到早发现问题、早处理问题。
  • 安全审计:审计主要体现在安全上,通过对日志进行分析,可以发现是否存在非授权的操作

Log等级

  • DEBUG最详细的日志信息,典型应用场景是 问题诊断
  • INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
  • WARNING当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
  • ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息 如IO操作失败或者连接问题
  • CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

Log模块的四大组件

  • Loggers

    提供应用程序代码直接使用的接口

  • Handlers

    用于将日志记录发送到指定的目的位置

    FileHandler:logging.FileHandler;日志输出到文件
    RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚
    SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址
    HTTPHandler:logging.handlers.HTTPHandler;通过"GET"或者"POST"远程输出到HTTP服务器
    等等
    
    
  • Filters

    提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)

  • Formatters

    用于控制日志信息的最终输出格式

    %(levelno)s:打印日志级别的数值
    %(levelname)s:打印日志级别的名称
    %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s:打印当前执行程序名
    %(funcName)s:打印日志的当前函数
    %(lineno)d:打印日志的当前行号
    %(asctime)s:打印日志的时间
    %(thread)d:打印线程ID
    %(threadName)s:打印线程名称
    %(process)d:打印进程ID
    %(message)s:打印日志信息
    
    
    datefmt:指定时间格式,同time.strftime();
    
    level:设置日志级别,默认为logging.WARNNING;
    
    stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
    
    

    示例

import logging
logger = logging.getLogger(name)
logger.setLevel(level = logging.INFO)
handler = logging.FileHandler(“log.txt”)
handler.setLevel(logging.INFO)
formatter = logging.Formatter(’%(asctime)s - %(name)s - %(levelname)s - %(message)s’)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info(“Start print log”)
logger.debug(“Do something”)
logger.warning(“Something maybe fail.”)
logger.info(“Finish”)

七、scrapy框架进阶

6.1 面向切面编程

  • 面向切面编程
    • 在不修改源代码的情况下,动态添加逻辑和功能
  • 核心点
    • 切点
      • 介入时的函数
      • 切点位置
        • 能自己造,超级复杂
        • 内置切点
    • 切面
      • 介入时获得的数据
      • 切面数据
        • 自己造的,想要啥就写啥数据
        • 内置切点对应的切面
          • 固定的

6.2 中间件

  • Scrapy内置两种类型的中间件
    • DownloaderMiddleware
      • 基本都是编写这个
      • 介入到请求发送,响应接收过程中
      • 介入到数据获取过程中
    • SpiderMiddleware
      • 介入到爬虫和引擎交互过程中

DownloaderMiddleware中间件:

  • 函数(方法)
    • from_crawler
    • spider_opened
    • process_request
    • process_response
    • process_exception

scrapy嵌入selenium:

  • 使用DownloaderMiddleware实现
    • 在process_request实现
    • 在请求发出之前
    • 使用Selenium进行网页的访问
    • 将内容获取回来
    • 包装成Response
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值