一、简介
它是使用了纯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