一、简介

它是使用了纯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框架架构图

python网络框架排名 python 网络框架_python网络框架排名

模块名

作用

是否实现

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