Scrapy框架有两个主要的对象Reques与Response,他们贯穿在爬虫的始终,最终爬虫通过他们将数据串联起来。
Request对象是在Spider中生成,包含HTTP请求信息,在框架中经过一系列传递、处理,最终达到Downloader下载器,下载器执行Request中的请求进行数据抓取,将生成的响应包装成一个Response对象,在经过传送处理,最终返回到发送Request的Spider中。
爬虫Spider中间件是用来处理Response响应的,而Downloader中间件是用来处理Request请求的。
激活中间件:启用Spider中间件时,需要将其加入SPIDER_MIDDLEWARES设置中。该设置位于settings.py文件中,是字典类型对的,其中键为中间件的路径,值为中间件的顺序。
启用中间件的有序列表:
第一个中间件是最靠近引擎的,最后一个中间件是最靠近Spider的。
一般自定义中间件在500-700之间最为妥当。
如果要禁用中间件,可以将中间件的值赋为None,键还是中间件的路径,修改的是中间件的顺序。
编写Spider中间件
中间件与管道类似,每个中间件组件都实现了以下一个或多个方法的Python类。
1.process_spider_input(response,spider)
说明:
当参数response通过参数spider中间件时,该方法被调用,处理该rsponse,即在下载器中间件处理完成后,马上要进入某个回调函数parse_xx()前被调用。
参数:
response(Response对象):被处理的Response
spider(Spider对象):该Response对应的Spider
返回值:
该方法返回一个None或者抛出一个异常。如果其返回None,Scrapy江会继续处理该Response,调用所有其他的中间件直到Spider处理该Response。如果其抛出一个异常,Scrapy将不会调用其他中间件的process_spider_input()方法,而是调用Request的errback。errback的输出将会从另一个方向被重新输入中间件链中,使用process_spider_output()方法来处理,当期抛出异常时调用procrss_spider_execption().
process_spider_output(response,result,spider)
当Spider处理完毕Response返回result时,即在爬虫运行yield item或者yield scrapy.Request()的时候调用该方法
这些因该都是内置的中间件方法
,好像不是,是要自己模仿这样写
process_spider_exception(response,exception,spider)
说明:当spider或其他spider中间件的process_spider_input()抛出异常时,该方法被调用。
参数:
response:异常抛出时处理的Response
exception:抛出异常
spider:抛出异常的Spider
返回值:
该方法必须返回一个None或者一个包含Response或Item对象的可迭代对象(iterable)
如果返回None,Scrapy将继续处理该异常,调用中间件链中的其他中间件的process_spider_exception()方法,直到所有中间件都被调用,该异常到达引擎(异常将被记录并被忽略)
如果其返回一个可迭代对象,那么中间件链的process_spider_output()方法将被调用,其他的中间件的process_spider_exception()将不会被调用。
process_start_request(start_request,spider)
说明:
该方法以Spider启动的Request为参数被调用
参数
start_request(包含Request的可迭代对象):start request列表
spider(Spider对象):启动start request的Spider
返回值:
该方法接收的是一个可迭代对象(start_requests参数),而且必须返回一个包含Request对象的可迭代对象。
Spider内置中间件
Spider已经内置了一些可以辅助爬取的中间件,通过这些中间件的启用、配置可以方便的进行爬虫的优化,提高爬取成功功率与效率。
DepthMiddleware爬取深度中间件
作用:他是一个用于追踪被爬取网站中每个Request的爬取深度的中间件。深度是start_urls中定义URL的相对值,也就是相对URL的深度。
他可用于限制爬取的最大深度,并根据深度控制请求优先级等。
HttpErrorMiddleware失败请求处理中间件
作用:
过滤出所有失败的HTTP Response,爬虫不需要消耗更多的资源,设置更为复杂的逻辑来处理这些异常Request。根据HTTP标准,返回值在200-300的为成功的Response.
如果想处理在这个范围之外的Response,可以通过Spider的handler_httpstatus_list属性或HTTPERROR_ALLOWED_CODES设置来指定Spider能处理的Response返回值。
当然,除非必要且目的明确,否则不推荐处理非200状态码的响应。
OffsiteMiddleware过滤请求中间件
RefererMiddleware参考位置中间件
UrlLengthMiddleware网址长度限制中间件
下载器内置中间件
CookiesMiddleware
作用:
该中间件可以使用Cookie爬取网站数据。记录了向Web Server发送的Cookie,并在之后的Request请求中发送回去,就像操作浏览器一样。
很有用的一点是,每个住址爬虫可以保存多个cookies,只需要为Request.meta指定cookiejar值。
HttpProxyMiddleware
作用:
此中间件可以通过在Request,meta中添加proxy属性值为该请求设置HTTP代理,默认获取代理的方式是通过以下环境变量来获取代理地址:
http_proxy
https_proxy
no_proxy
在settings.py中的设置:
HTTPPROXY_ENABLED:默认为False,表示是否激活HttpProxyMiddleware
HTTPPROXY_AUTH_ENCODING:代理有验证时的账户信息编码方式。
Scrapy基本配置
命令行选项优先级最高
每个爬虫内置配置
custom_setting可以为某些爬虫定制不同的配置,写在spider中,该变量为一个字典
项目设置模块
通过scrapy startproject命令创建项目后,都会生成一个settings.py文件,该文件就是该项目的配置文件。
# Scrapy settings for test1 project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# https://docs.scrapy.org/en/latest/topics/settings.html
# https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
# Scrapy项目名字
BOT_NAME = 'test1'
SPIDER_MODULES = ['test1.spiders']
NEWSPIDER_MODULE = 'test1.spiders'
# 注销的都是后面加的,就是项目需要他时,他在启用
# 使用Scrapy搜索spider的模块列表
# SPIDER_MODULES = ['segementfault.spiders']
# 使用爬虫创建命令genspider创建爬虫时生成的模块
# NEWSPIDER_MODULE = 'segementfault.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
# 默认的USER_AGENT,私用BOT_NAME配置生成,建议覆盖
#USER_AGENT = 'test1 (+http://www.yourdomain.com)'
# Obey robots.txt rules
# 如果启用,Scrapy则会遵守网站Rebots.txt协议,建议设置为False.
ROBOTSTXT_OBEY = False
# Configure maximum concurrent requests performed by Scrapy (default: 16)
# 配置Scrapy最大并发数,默认为32,一般需要增大设置
#CONCURRENT_REQUESTS = 32
# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
# 为同一个站点设置下载延迟
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
# 下载延迟的设置只会根据以下两个中的一个生效
# 对单个网站设置最大的请求并发数
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
# 对单个IP设置最大的请求并发数
#CONCURRENT_REQUESTS_PER_IP = 16
# Disable cookies (enabled by default)
# 禁用Cookie,默认True启用,建议为False
#COOKIES_ENABLED = False
# Disable Telnet Console (enabled by default)
# 关闭Telent控制台,默认启用
#TELNETCONSOLE_ENABLED = False
# Override the default request headers:
# 默认的请求头,根据爬取网站覆盖
#DEFAULT_REQUEST_HEADERS = {
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
# 启用Spider爬虫中间件
#SPIDER_MIDDLEWARES = {
# 'test1.middlewares.Test1SpiderMiddleware': 543,
#}
# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
# 启用Download下载器中间件
#DOWNLOADER_MIDDLEWARES = {
# 'test1.middlewares.Test1DownloaderMiddleware': 543,
#}
# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
# 启用扩展
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 配置管道信息
#ITEM_PIPELINES = {
# 'test1.pipelines.Test1Pipeline': 300,
#}
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
# 启用配置AutoThrottle扩展,默认禁用,建议启用
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
# 初始化下载延迟
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
# 高延迟下最大的下载延迟
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
# Scrapy请求应该并行发送每个远程服务器的平均数量
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
# 启用调试模式,设计每一个响应状态数据
#AUTOTHROTTLE_DEBUG = False
# 启用和配置HTTP缓存
# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
# HTTP缓存过期时间
#HTTPCACHE_EXPIRATION_SECS = 0
# HTTP缓存目录
#HTTPCACHE_DIR = 'httpcache'
# HTTP缓存忽略的响应状态码
#HTTPCACHE_IGNORE_HTTP_CODES = []
# HTTP缓存存储目录
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
当我们编写完管道、中间件,使用扩展时,一定要在settings.py中启用,才能够正常使用。
默认的命令行配置
在项目中使用,默认的配置为项目配置
>scrapy settings --get BOT_NAME
scrapybot
在项目外使用命令行时,默认使用Scrapy全局配置
import scrapy
>scrapy settings --get BOT_NAME
scrapybot
默认全局配置(优先级最低)
Scrapy默认全局配置是所有配置信息的基础,每种配置都是在此基础上进行覆盖的。
日志
Scrapy使用Python内置的日志系统记录事件日志,在使用日志功能之前还需进行一些配置。
LOG_FILE:指定日志文件,如果为None,就是用标准错误输出。
LOG_ENABLED:是否启用日志,为True时启用日志,为False时不启用
LOG_ENCODING:使用指定的编码方式输出日志,默认为UTF-8
LOG_LEVEL:日志记录的最低级别,可选的级别还有CRITICAL、ERROR、WARNING、INFO、DEBUG。默认为DEBUG,打印所有记录
LOG_FORMAT:日志输出格式,默认为'%(asctime)s[%(name)s]%(levelname)s:%(message)s'
LOG_DATEFORMAT:日志日期记录格式,默认格式为"%Y_%m%d%H:%M:%S"
LOG_STDOUT:默认为False,如果为True,那么表示进程所有的标准输出(及错误)将被重定向到log中。例如执行print 'hello',其将会在Scrapy log中显示。
数据收集
scrapy数据收集有哪些作用,可以方便的统计一些特殊信息,包括一些指令数据的统计,比如特定的关键字、404页面等。Scrapy提供的这种收集数据机制叫做Stats Collection.
数据收集器对每个Spider保持一个状态表。当Spider启动时,该表自动打开,当Spider关闭时,该表自动关闭。
Scrapy常用服务
发送邮件
有两种方法可以创建邮件发送其(Mail Sender)。可以通过标准构造器(Constructor)创建。
from scrapy.mail import MailSender
mailer= MailSender()
或者通过传递一个Scrapy设置对象,通过settings配置创建:
mailer = MailSender.from_settings(settings)
再使用send()方法来发送邮件(不包括附件)
mailer.send(to=["someone@example.com"],subject="Some subject",body="Some body",cc=["another@example.com"])
MailSender类介绍
略
在settings.py中对Mail进行设置
settings.py中的设置定义了MailSender构造器的默认值