スパイダーデータマイニング-9、スクレイプフレームワーク(5)

1.ミドルウェアをダウンロードします(エンジンとダウンローダーの間のコンポーネントである4番目と5番目のステップは、ミドルウェアの後で変更するために使用できます)

スクレイピー設定--getDOWNLOADER_MIDDLEWARES_BASEは、システムカスタムミドルウェアを表示できます。

複数のダウンロードミドルウェアクラスを取得します。それらはすべて独自の機能を備えています

値が小さいほど、エンジンに近くなり、ダウンローダーに近くなります。ダウンローダーによって返されるデータは、最初に最大値を渡し、次に最小値を渡します。

リクエストは小から大、レスポンスは大から小であることがわかります。ミドルウェアをカスタマイズした後は、基本的なミドルウェアの価値が導入されたミドルウェアをカバーできるかどうかに注意する必要があります。カスタムミドルウェアは、以下の基本的なミドルウェアに基づいているため、独自のミドルウェアのみを実行する場合、以下および独自の設定を実行しない場合は、以下のミドルウェアを削除できます。

比如  '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とユーザーエージェントミドルウェア。

カスタムミドルウェア:自分で書くことができ、システムと競合することはなく、優先順位が同じであっても処理されません

ダウンロードミドルウェアは、Scrapyの要求/応答プロセスにフックするために使用されるフレームワークです。
これは、scrapyの要求と応答をグローバルに変更するために使用される軽量の低レベルシステムです。

Scrapyフレームワークのダウンロードミドルウェアは、特別なメソッドを実装するクラスです。

スクレイピーシステムに付属するミドルウェアは、DOWNLOADER_MIDDLEWARES_BASE設定に配置されます

ユーザー定義のミドルウェアはDOWNLOADER_MIDDLEWARESで設定する必要があります。
変更設定はdictであり、キーはミドルウェアのクラスパスであり、期待値はミドルウェアの順序であり、正の整数0〜1000です。 、エンジンに近い。

ミドルウェアAPIのダウンロード:(戻り値のミドルウェアの方が重要であり、戻り値によって次のリクエストの送信先が決まります)

各ミドルウェアはPythonのクラスであり、次のメソッドの1つ以上を定義しています:
process_request(リクエスト(リクエストオブジェクト)、スパイダー(クローラーオブジェクト))リクエストを処理し、ミドルウェアメソッドを介してリクエストごとにこれを呼び出します。ここでリクエストプロキシを使用すると、クローラーリクエストの作成時に各リクエストを1回記述する必要がないため、コードの量を節約できます。

# 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ステップなどに属します。

2つのカスタムUser-Agentミドルウェア

request.headers ["User_Agent"] = random.choice(ランダムに選択されたターゲットプール)(ランダム選択、ランダムライブラリインポートランダム)
request.headers ["parameters"]リクエストヘッダーの指定されたパラメーターに
複数のエージェントを追加し、メタ経由で設定

ユーザーエージェントプール:User-Agentミドルウェアに追加

proxyip = random.choice(IPPOOL)(操作にはランダムライブラリも使用)
request.meta ['proxy'] = "http://" + proxyip ["ipaddr"](値のみがキーを取得しません)

対応する「scrapy.downloadermiddlewares.cookies.CookiesMiddleware」を設定のミドルウェアに追加します。ミドルウェアを閉じるには「なし」

3つの一般的に使用されるScrapy.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がブロックされやすくなります。

設定の優先順位:

コマンドライン(コンソールで指定された操作)>スパイダー(クローラーファイル設定のコード)>設定項目の設定(ミドルウェアなど)>コンソールで指定されていない操作>設定ファイルのコード設定(DEFAULT_REQUEST_HEADERS = {availableなど)リクエストヘッダーを追加})

キャッシュ戦略:すべてのリクエストがキャッシュされ、次回はリクエスト時に元のキャッシュに直接アクセスできます

おすすめ

転載: blog.csdn.net/qwe863226687/article/details/114117160