spider数据挖掘-----9、scrapy框架(五)

一、下载中间件(第四和第五步,引擎和下载器中间的组件,经过他的都可以用来修改)

scrapy settings --get DOWNLOADER_MIDDLEWARES_BASE可以查看系统自定义的中间件,

得到多个下载中间件的类,他们都有自己独特的功能

数值越小越靠近引擎,越大越靠近下载器,下载器返回的数据先通过最大再到最小的数值

可以理解为request是顺着小到大,response是顺着大到小,在自定义设置中间件后引入使用时设置数值要注意基础中间件的数值是否会有覆盖所引入的中间件的可能。自定义的中间件都是基于以下基础中间件的所以想要只执行自己的,不执行以下和自己设定的就可以把以下的那个进行None去掉,

比如  'baidu.middlewares.User_AgentDownloaderMiddleware': 323,
"scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": None,都是起一样的作用,就把不是自己设定的关闭
"scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100,机器人协议中间件
 "scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware": 300, http身份验证中间件
 "scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware": 350,
 下载超时中间件
  "scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware": 400,
  默认请求头中间件
   "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": 500,
   用户代理中间件(UA)
    "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
    重新尝试中间件(前面超时中间件超时后才传到这里重新尝试)
 "scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware": 560,
 	ajax抓取中间件(基于元片段html标签抓取ajax页面的中间件)
 "scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware": 580,
  	始终使用字符串作为原因中间件(根据meta-refresh.html标签处理request重定向的中间件)
  "scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware": 590,
  允许网站数据发送或接收压缩的(gizp)流量的中间件
 "scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 600,
 重定向中间件(根据request的状态处理重定向)
  "scrapy.downloadermiddlewares.cookies.CookiesMiddleware": 700,
  凭证中间件
 "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 750,
 代理中间件
  "scrapy.downloadermiddlewares.stats.DownloaderStats": 850, 
  通过此中间件存储通过它的所有请求、响应、异常信息
  "scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware": 900,
  缓存中间件

内置下载中间件:(系统自带的中间件)

常用内置中间件:
CookieMiddleware 支持cookie,通过设置COOKIES_ENABLED 来开启和关闭

HttpProxyMiddleware HTTP代理,通过设置request.meta[‘proxy’]的值来设置,IP代理

UserAgentMiddleware 与用户代理中间件。

自定义中间件:可以自己写的,不会与系统冲突,即使优先级有相同的也不会不处理

下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架。
它是一个轻量级的底层系统,用来全局修改scrapy的request和response。

scrapy框架中的下载中间件,是实现了特殊方法的类。

scrapy系统自带的中间件被放在DOWNLOADER_MIDDLEWARES_BASE设置中

用户自定义的中间件需要在DOWNLOADER_MIDDLEWARES中进行设置
改设置是一个dict,键是中间件类路径,期值是中间件的顺序,是一个正整数0-1000.越小越靠近引擎。

下载中间件API:(返回值的中间件比较重要,返回值决定下一步请求到哪里)

每个中间件都是Python的一个类,他们都有定义了以下一个或者多个方法:
process_request(request(请求对象),spider(爬虫对象)) 处理请求,对于通过中间件的每个请求调用此方法,在这里写入request代理,可以不用在爬虫请求构造的时候每个request都写一次,省去代码量

# Called for each request that goes through the downloader
# middleware.

# Must either:必选其一,就是必定会出现以下的一种情况
# - return None: continue processing this request
返回None  request被继续交给下一个中间件处理,证明处理的内容不是当前优先级的中间件可以完成的
# - or return a Response object
返回response对象,不会交给下一个process_request,而是交给下载器,证明该中间件符合条件
# - or return a Request object
返回一个request对象,直接交给引擎处理,进行重新排队再提交一次
# - or raise IgnoreRequest: process_exception() methods of
抛出异常,并使用process_exception进行处理
#   installed downloader middleware will be called
一定会被处理

process_response(request, response, spider) 处理响应,对于通过中间件的每个响应,调用此方法

# Called with the response returned from the downloader.处理响应

# Must either;
# - return a Response object
返回response对象,继续交给下一个中间件,返回的途中不需要找适合的中间件了,直接穿过所有的中间件
# - return a Request object
返回一个request对象,直接交给引擎处理,不需穿过中间件,没有其他的组件接收,最后引擎进行提交处理
# - or raise IgnoreRequest
抛出异常,并使用process_exception进行处理

process_exception(request, exception, spider) 处理请求时发生了异常调用

# Called when a download handler or a process_request()  处理异常
# (from other downloader middleware) raises an exception.

# Must either:
# - return None: continue processing this exception
返回None,继续调用其他中间件,不断传递给下一个中间件直到能执行此任务的
# - return a Response object: stops process_exception() chain
停止调用其他中间件,说明第一个找到的就是符合要求的
# - return a Request object: stops process_exception() chain
返回request,直接交给引擎处理

from_crawler(cls,crawler ):用来创建爬虫文件,不大重要

其他中间件见官方文档:https://docs.scrapy.org/en/latest/topics/downloader-middleware.html

爬虫中间件:用得少,属于第1和第2步等,引擎与爬虫之间的组件。

二、自定义User-Agent中间件

request.headers[“User_Agent”]=random.choice(被随机挑选的目标池)(随机选择,随机的库import random)
request.headers[“参数”]在请求头里加在指定参数中
设置多个代理,通过meta设置

用户代理池:添加到User-Agent中间件中

proxyip = random.choice(IPPOOL)(也利用随机库进行操作)
request.meta[‘proxy’]=“http://”+proxyip[“ipaddr”](只取值不取键)

settings中中间件加入对应的 “scrapy.downloadermiddlewares.cookies.CookiesMiddleware”:None为关闭该中间件

三、常用Scrapy.settings,(项目需求越多,settings配置文件内容就越多)

BOT_NAME = 'baidu'  scrapy 项目名字
SPIDER_MODULES = ['baidu.spiders']爬虫模块
NEWSPIDER_MODULE = 'baidu.spiders'	使用genspider(可以自己写)命令创建的爬虫模块
USER_AGENT = 'baidu (+http://www.yourdomain.com)' 默认的用户代理
Configure maximum concurrent requests performed by Scrapy (default: 16)
设置最大并发请求,通过scrapy操作,默认为16,CONCURRENT_REQUESTS = 32可设置32个
Configure a delay for requests for the same website (default: 0)
设置网络请求延迟,,DOWNLOAD_DELAY = 3设置为3秒
The download delay setting will honor only one of:对访问的一种限制
#CONCURRENT_REQUESTS_PER_DOMAIN = 16 单个域名允许的最大并发请求(对域名限制),(单个站点以此为主)CONCURRENT_REQUESTS = 32设置32,但单个域名设置16,最大只会执行16,而不是32
#CONCURRENT_REQUESTS_PER_IP = 16	单个IP允许的最大并发请求(对IP限制)(域名和IP都设置的时候,只会对IP进行限制,而不会再去管域名)
# Disable cookies (enabled by default)是否关闭cookies
#COOKIES_ENABLED = False 			 默认使用cookies
 Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False  设置使用监控控制台,默认为使用,启用时false为取消监控控制台
# Override the default request headers:一般有添加请求头有默认的,request命令行的,中间件的
DEFAULT_REQUEST_HEADERS = {可添加请求头}这里在settings添加的请求头是全局的(优先级别最低的)
SPIDER_MIDDLEWARES = {爬虫中间件
#    'baidu.middlewares.BaiduSpiderMiddleware': 543,
# }
DOWNLOADER_MIDDLEWARES = {·····}爬虫中间件
还有一些基础的下载中间件
"scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100,
·······

扩展程序,取消注释,启用时会取消使用监控控制台
EXTENSIONS = { 'scrapy.extensions.telnet.TelnetConsole': None,
}


#ITEM_PIPELINES = {
#    'github.pipelines.GithubPipeline': 300,
#}				设置管道

启用或者配置 扩展            下载延迟的时间:通过计算建立TCP连接到接收到HTTP包头之间的时间来测量,由于scrapy忙于处理其他的回调函数,所以往往无法准确测量这个时间,但是这个大概的测量值算是合理的,所以按照这个编写出延迟时间还是可以使用的。限制的算法:下载延迟==收到响应的延迟时间除于当前的并发数。。。。。
	然后在智能延迟中,下一次的延迟就会取多组延迟数的平均值(可自定义设置),一般没有达到200response都会自动把下一次延迟调的更高,以免出事。不会比DOWNLOAD_DELAY更低,不会比AUTOTHROTTLE_MAX_DELAY更高,智能延迟的每秒并发请求平均数等都不能比上面自己设定过的默认延迟、平均、并发等更快
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#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		并行发给远程请求的平均数
#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			默认不启用
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

DEPTH_LIMT=3爬虫爬取次级页面的深度(可自定义设置)


常用项目设置
BOT_NAME				项目名称

CONCURRENT_ITEMS			item处理最大并发数,默认100

CONCURRENT_REQUESTS			下载最大并发数

CONCURRENT_REQUESTS_PER_DOMAIN	单个域名最大并发数

CONCURRENT_REQUESTS_PER_IP		单个ip最大并发数



UAgent 用户代理:客户端自身进行代理进行访问(比如浏览器对服务器进行的访问)

IP代理:通过IP服务器帮忙代理进行访问

下载延迟,在访问爬取进行下载电影等数据时,为了调成和普通用户一样而设置,否则容易被封IP

settings设置优先级:

命令行(控制台指定的操作)>spider(爬虫文件设置的代码)>setting项目(比如在中间件中)的设置>控制台不指定的操作>settings文件中的代码设置(比如DEFAULT_REQUEST_HEADERS = {可添加请求头})

缓存策略:所有请求缓存,下次在请求直接访问原来的缓存即可

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/114117160