ミドルウェア機能のダウンローダ
Downloaderのミドルウェアの機能で非常に強いです。
- あなたは、ユーザエージェントを変更することができます
- リダイレクトの取り扱い
- プロキシ設定
- 失敗の再試行
- クッキーおよびその他の設定
Downloaderのミドルウェアは、場所の全体的なアーキテクチャに役割を果たし、次の2つです。
- で、私たちは要求を修正ダウンロードする前に実行することができ、ダウンロード、Doanloaderリクエストに送信される前に、キュー内のスケジューラのスケジューリング。
- スパイダーに送信する前に生成されたレスポンスをダウンロードした後、あること、我々はあなたがResposneはスパイダーを解決する修正する前に生成することができます。
Scrapyビルトインダウンローダーミドルウェア
- 失敗し、再試行、自動リダイレクトのミドルウェアの責任です:Scrapyではすでになど、多くのダウンローダミドルウェアを提供
- これらはDOWNLOADER_MIDDLEWARES_BASE変数に定義されています。
- 注:プロジェクトの構成を変更し、変更したい場合は、以下の設定はグローバル設定で、変更しないでください!
# 在python3.6/site-packages/scrapy/settings/default_settings.py默认配置中
DOWNLOADER_MIDDLEWARES_BASE = {
# Engine side
'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
# Downloader side
}
- 番号が優先される辞書形式、より小さな優先呼。
カスタムのダウンローダミドルウェアミドルウェア
私たちは、DOWNLOADER_MIDDLEWARESプロジェクトで設定されたのダウンローダミドルウェア独自のカスタム変数を追加することができます。3つのコアのメソッドを持っているのダウンローダミドルウェア:
1) process_request(request,spider)
-
:ミドルウェアをダウンロードすることにより、各要求は、メソッドが呼び出されるように、方法は、次の3つのいずれかを返す必要があることを要件は
None
、リターンResponse对象
、リターンRequest对象
またはraise IgnoreRequest
。3つの戻り値への影響は異なっています。 -
None
:Scrapyは、適切なハンドラのダウンロード(ダウンロードハンドラ)が呼び出されるまで、要求は(応答がダウンロードされている)が行われ、要求を処理するためのミドルウェア他の対応するメソッドの実行を継続します。 -
Response对象
:Scrapyは他process一()またはにprocess_exception()メソッド、または対応するダウンロード機能を呼び出さないであろう、それは応答を返します。各応答が返されたときにインストールprocess_responseミドルウェア()メソッドが呼び出されます。 -
Request对象
:Scrapy停止呼び出しprocess一方法と再スケジューリング要求が戻ります。新しい要求が相応に中間チェーンを返すために行われた場合、応答のダウンロードに応じて呼び出されます。 -
raise一个IgnoreRequest异常
:ミドルウェアにprocess_exceptionがインストールダウンロード()メソッドが呼び出されます。例外を処理するために、誰の方法が存在しない場合は、エラーバックの要求(Request.errback)メソッドが呼び出されます。スローされた例外を処理するコードがない場合は、例外は無視され、記録されません。
2) process_response(request,response,spider)
-
process_response
:戻り値は、次の3つの方法であるresponse对象
、request对象
またはraise一个IgnoreRequest异常
-
戻った場合
Response
(着信応答は同じであってもよいし、または新たなオブジェクトであってもよい)、response
鎖中の他のミドルウェアであるprocess_response()
アプローチ。 -
それが返された場合は
Request
、オブジェクトを、要求を停止して返すようにミドルウェア・チェーンは再スケジュールされたダウンロードされます。処理は次のようにあるprocess_request()
要求で行わリターン。 -
それがスローした場合IgnoreRequest例外が呼び出されます
request的errback(Request.errback)
。 -
コードは、例外処理をスローしていない場合、例外が(他の異常とは異なるように)無視され、記録されていません。
-
ここでは、簡単な例は、上記のプロジェクトで、私たちは次のコードミドルウェアを追加し続けて記述します。
def process_response(self, request, response, spider): response.status = 201 return response
3) process_exception(request,exception,spider)
-
プロセッサ(ダウンロードハンドラ)をダウンロードしたりする場合
process_request()
(ダウンロードミドルウェア)が例外をスローした場合、Scrapyコールを(異常IgnoreRequestを含みます)process_exception()
。 -
process_exception()
戻り値:これは3つのリターンであるNone
、Response 对象
またはRequest 对象
。 -
それは返す場合
None
、Scrapyが例外を処理していきますし、他のミドルウェアインストール呼び出すprocess_exception()
すべてが完成したミドルウェアが呼び出されるまで、メソッドを、デフォルトの例外ハンドラが呼び出されます。 -
それは返す場合
Response 对象
ミドルウェアチェーンがすでにインストールされているprocess_response()
メソッドが呼び出されます。Scrapyは、他のミドルウェアを呼び出すことはありませんprocess_exception()
アプローチを。
プロジェクトの実践
1)以下のようにコマンドがあり、新しいプロジェクトdoubanを作成します。
$ scrapy startproject douban
2)次のようにコマンドがあり、dbbookのためのスパイダーのクラス名を作成します。
$ cd douban
$scrapy genspider dbbook book.douban.com
爬虫類のコードを記述します。
# -*- coding: utf-8 -*-
import scrapy
class DbbookSpider(scrapy.Spider):
name = 'dbbook'
allowed_domains = ['book.douban.com']
start_urls = ['https://book.douban.com/top250?start=0']
def parse(self, response):
#print("状态:")
pass
3)コマンド爬虫類を実行し、エラーを排除
$ scrapy crawl dbbook
#結果は、403エラー(サーバーアクセス拒否)を返しました。
分析:のUser-Agent値のデフォルト要求scrapyフレーム情報:Scrapy / 1.5.0(http://scrapy.org)。
解決策:設定USER_AGENTまたはDEFAULT_REQUEST_HEADERS情報:我々は、設定ファイルをのsettings.pyことができます。
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
# 或
# ...
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
}
# ...
別の解決策があります:
middlewares.py
見つかったファイルのDoubanDownloaderMiddleware
種類、ここでprocess_request
処理の方法は次の通りであります:
def process_request(self, request, spider):
#输出header头信息
print(request.headers)
#伪装浏览器用户
request.headers['user-agent']='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
return None
4)Downloaderのミドルウェアミドルウェアを開きます
DOWNLOADER_MIDDLEWARES情報を設定するには:プロジェクトのsettings.py設定ファイルで
DOWNLOADER_MIDDLEWARES = {
'douban.middlewares.DoubanDownloaderMiddleware': 543,
}