リクエストとレスポンス¶
Scrapyは、Webサイトのクロールに Request
と Response
オブジェクトを使用します。
通常、 Request
オブジェクトはスパイダーで生成され、ダウンローダーに到達するまでシステム内をあちこち旅行(pass across)します。ダウンローダーはリクエストを実行し、リクエストを発行したスパイダーに Response
オブジェクトを返します。
Request
クラスと Response
クラスの両方には、基本クラスでは必要のない機能を追加するサブクラスがあります。これらについては、 Requestのサブクラス と Responseのサブクラス で説明しています。
Requestオブジェクト¶
- class scrapy.http.Request(*args, **kwargs)[ソース]¶
Request
オブジェクトはHTTPリクエストを表します。これは通常スパイダーで生成され、ダウンローダーによって実行され、そして、Response
が生成されます。- パラメータ
url (str) -- このリクエストのURL。URLが不正な場合、
ValueError
例外が発生する。callback (collections.abc.Callable) -- 最初のパラメーターとしてこのリクエストのレスポンス(ダウンロード後)に呼び出される関数。詳細については、以下の 追加のデータをコールバック関数に渡す を参照してください。リクエストでコールバックが指定されていない場合、スパイダーの
parse()
メソッドが使用されます。 処理中に例外が発生した場合、代わりにエラーバック(errback)が呼び出されることに注意してください。method (str) -- このリクエストのHTTPメソッド。デフォルトは
'GET'
です。meta (dict) --
Request.meta
属性の初期値。指定すると、このパラメーターに渡された辞書は浅いコピー(shallow copy)されます。body (bytes or str) -- リクエスト・ボディ。 文字列が渡されると、渡された
encoding
(デフォルトはutf-8
)を使用してバイトとしてエンコードされます。body
が指定されていない場合、空のバイト・オブジェクトが格納されます。この引数のタイプに関係なく、格納される最終値はバイト・オブジェクトになります(文字列やNone
ではありません)。headers (dict) --
このリクエストのヘッダー。 辞書値は、文字列(単一値のヘッダーの場合)またはリスト(複数値のヘッダーの場合)です。 値として
None
が渡された場合、HTTPヘッダーはまったく送信されません。注意
Cookie
ヘッダーを介して設定されたクッキーは、 CookiesMiddleware では考慮されません。リクエストにクッキーを設定する必要がある場合、Request.cookies
パラメータを使用します。 これは、現在改善に取り組んでいる既知の制限です。リクエスト・クッキー。これらは2つの形式で送信できます。
辞書の使用:
request_with_cookies = Request(url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'})
辞書のリストの使用:
request_with_cookies = Request(url="http://www.example.com", cookies=[{'name': 'currency', 'value': 'USD', 'domain': 'example.com', 'path': '/currency'}])
後者の形式では、クッキーの
domain
およびpath
属性をカスタマイズできます。これは、クッキーが後のリクエストのために保存される場合にのみ役立ちます。一部のサイトが(レスポンスで)クッキーを返すと、それらはそのドメインのクッキーに保存され、今後のリクエストで再度送信されます。これは通常のWebブラウザの一般的な動作です。
保存されたクッキーを送信せず、受信したクッキーを保存しないリクエストを作成するには、
request.meta
でdont_merge_cookies
キーをTrue
に設定します。手動で定義したクッキーを送信し、クッキーの保存を無視するリクエストの例:
Request( url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'}, meta={'dont_merge_cookies': True}, )
詳細については、 CookiesMiddleware を参照してください。
注意
Cookie
ヘッダーを介して設定されたクッキーは、 CookiesMiddleware では考慮されません。リクエストにクッキーを設定する必要がある場合、Request.cookies
パラメータを使用します。 これは、現在改善に取り組んでいる既知の制限です。encoding (str) -- このリクエストのエンコーディング(デフォルトは
'utf-8'
)。 このエンコードは、URLをパーセントエンコードし、本文をバイトに変換するために使用されます(文字列として指定されている場合)。priority (int) -- このリクエストの優先度(デフォルトは
0
)。スケジューラーは優先度を使用して、リクエストの処理に使用される順序を定義します。より高い優先度値を持つリクエストは、より早く実行されます。比較的低い優先度を示すために、負の値が許可されています。dont_filter (bool) -- このリクエストは、スケジューラによってフィルタリングされるべきではないことを示します。 これは、重複フィルターを無視するために、同じリクエストを複数回実行する場合に使用されます。注意して使用しないと、クロールループに陥ります。デフォルトは
False
です。errback (collections.abc.Callable) --
リクエストの処理中に例外が発生した場合に呼び出される関数。 これには、404 HTTPエラーなどで失敗したページが含まれます。 最初のパラメータとして
Failure
を受け取ります。 詳細については、以下の リクエスト処理で例外をキャッチするためにエラーバック(errback)を使用する を参照してください。バージョン 2.0 で変更: errback パラメータが指定されている場合、callback パラメータは不要になりました。
flags (list) -- リクエストに送信されたフラグは、ロギングまたは同様の目的に使用できます。
cb_kwargs (dict) -- キーワード引数としてリクエストのコールバックに渡される任意のデータを含む辞書。
- url¶
このリクエストのURLを含む文字列。 この属性にはエスケープされたURLが含まれているため、
__init__
メソッドで渡されたURLとは異なる可能性があることに注意してください。この属性は読み取り専用です。リクエストのURLを変更するには、
replace()
を使用します。
- method¶
リクエスト内のHTTPメソッドを表す文字列。 これは大文字であることが保証されています。 例:
"GET"
、"POST"
、"PUT"
など
- headers¶
リクエスト・ヘッダーを含む辞書のようなオブジェクト。
- meta¶
このリクエストの任意のメタデータを含む辞書。 この辞書は、新しいリクエストに対して空であり、通常、さまざまなScrapyコンポーネント(拡張機能、ミドルウェアなど)によって設定されます。したがって、この辞書に含まれるデータは、有効にした拡張機能によって異なります。
Scrapyによって認識される特殊なメタ・キーのリストについては、 Request.meta 特殊キー を参照してください。
この辞書は、リクエストが
copy()
またはreplace()
メソッドを使用して複製された場合、 浅いコピー(shallow copy) であり、スパイダー内でresponse.meta
属性からアクセスすることもできます。
- cb_kwargs¶
このリクエストの任意のメタデータを含む辞書。その内容は、キーワード引数としてリクエストのコールバックに渡されます。新しいリクエストの場合は空です。つまり、デフォルトではコールバックは引数として
Response
オブジェクトのみを取得します。この辞書は、リクエストが
copy()
またはreplace()
メソッドを使用して複製された場合、 浅いコピー(shallow copy) であり、スパイダー内でresponse.cb_kwargs
属性からアクセスすることもできます。リクエストの処理に失敗した場合、リクエストのエラーバック(errback)で
failure.request.cb_kwargs
としてこの辞書にアクセスできます。 詳細については、errback関数内で追加データにアクセスする を参照してください。
- copy()[ソース]¶
このリクエストのコピーである新しいリクエストを返します。 追加のデータをコールバック関数に渡す も参照してください。
- replace([url, method, headers, body, cookies, meta, flags, encoding, priority, dont_filter, callback, errback, cb_kwargs])[ソース]¶
指定されたキーワード引数によって新しい値が指定されたメンバーを除き、同じメンバーを持つリクエスト・オブジェクトを返します。
Request.cb_kwargs
およびRequest.meta
属性は(新しい値が引数として与えられない限り)デフォルトでは浅くコピー(shallow copy)されます。 追加のデータをコールバック関数に渡す も参照してください。
- classmethod from_curl(curl_command, ignore_unknown_options=True, **kwargs)[ソース]¶
cURL コマンドを含む文字列からリクエストオブジェクトを作成します。 HTTPメソッドとURLとヘッダーとクッキーとボディを設定します。
Request
クラスと同じ引数を受け入れ、優先度を取得し、cURLコマンドに含まれる同じ引数の値をオーバーライドします。認識されないオプションはデフォルトで無視されます。不明なオプションを見つけるときにエラーを発生させるには、
ignore_unknown_options=False
を渡してこのメソッドを呼び出します。注意
JSONRequest
またはXmlRpcRequest
のようなRequest
のサブクラスからfrom_curl()
を使用し、DefaultHeadersMiddleware
またはUserAgentMiddleware
またはHttpCompressionMiddleware
のような ダウンローダー・ミドルウェア と スパイダー・ミドルウェア を有効にすることで、Request
オブジェクトを変更できます。cURL コマンドを Scrapy リクエストに変換するには、 curl2scrapy を使用できます。
追加のデータをコールバック関数に渡す¶
リクエストのコールバックは、そのリクエストのレスポンスがダウンロードされるときに呼び出される関数です。コールバック関数は、ダウンロードされた Response
オブジェクトを最初の引数として呼び出されます。
例:
def parse_page1(self, response):
return scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
def parse_page2(self, response):
# this would log http://www.example.com/some_page.html
self.logger.info("Visited %s", response.url)
場合によっては、後で2番目のコールバックで引数を受け取ることができるように、これらのコールバック関数に引数を渡すことに興味があるかもしれません。 次の例は、 Request.cb_kwargs
属性を使用してこれを実現する方法を示しています:
def parse(self, response):
request = scrapy.Request('http://www.example.com/index.html',
callback=self.parse_page2,
cb_kwargs=dict(main_url=response.url))
request.cb_kwargs['foo'] = 'bar' # add more arguments for the callback
yield request
def parse_page2(self, response, main_url, foo):
yield dict(
main_url=main_url,
other_url=response.url,
foo=foo,
)
注意
Request.cb_kwargs
はバージョン 1.7
で導入されました。 それ以前は、コールバックに情報を渡すために Request.meta
を使用することが推奨されていました。1.7
以降では、 Request.cb_kwargs
がユーザー情報を処理するための好ましい方法となり、 Request.meta
は、ミドルウェアや拡張機能などのコンポーネントとの通信のために残されています。
リクエスト処理で例外をキャッチするためにエラーバック(errback)を使用する¶
リクエストのエラーバック(errback)は、処理中に例外が発生したときに呼び出される関数です。
最初のパラメータとして Failure
を受け取り、接続確立タイムアウト、DNSエラーなどを追跡するために使用できます。
すべてのエラーをログに記録し、必要に応じて特定のエラーをキャッチするスパイダーの例を次に示します:
import scrapy
from scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import DNSLookupError
from twisted.internet.error import TimeoutError, TCPTimedOutError
class ErrbackSpider(scrapy.Spider):
name = "errback_example"
start_urls = [
"http://www.httpbin.org/", # HTTP 200 expected
"http://www.httpbin.org/status/404", # Not found error
"http://www.httpbin.org/status/500", # server issue
"http://www.httpbin.org:12345/", # non-responding host, timeout expected
"http://www.httphttpbinbin.org/", # DNS error expected
]
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(u, callback=self.parse_httpbin,
errback=self.errback_httpbin,
dont_filter=True)
def parse_httpbin(self, response):
self.logger.info('Got successful response from {}'.format(response.url))
# do something useful here...
def errback_httpbin(self, failure):
# log all failures
self.logger.error(repr(failure))
# in case you want to do something special for some errors,
# you may need the failure's type:
if failure.check(HttpError):
# these exceptions come from HttpError spider middleware
# you can get the non-200 response
response = failure.value.response
self.logger.error('HttpError on %s', response.url)
elif failure.check(DNSLookupError):
# this is the original request
request = failure.request
self.logger.error('DNSLookupError on %s', request.url)
elif failure.check(TimeoutError, TCPTimedOutError):
request = failure.request
self.logger.error('TimeoutError on %s', request.url)
errback関数内で追加データにアクセスする¶
リクエストの処理に失敗した場合は、コールバック関数の引数にアクセスして、errback内の引数に基づいてさらなる処理ができるようにすることをお勧めします。以下の例は、 Failure.request.cb_kwargs
を使用してこれを実現する方法を示しています:
def parse(self, response):
request = scrapy.Request('http://www.example.com/index.html',
callback=self.parse_page2,
errback=self.errback_page2,
cb_kwargs=dict(main_url=response.url))
yield request
def parse_page2(self, response, main_url):
pass
def errback_page2(self, failure):
yield dict(
main_url=failure.request.cb_kwargs['main_url'],
)
Request.meta 特殊キー¶
Request.meta
属性には任意のデータを含めることができますが、Scrapyとその組み込み拡張機能によって認識される特殊なキーがあります。
以下がその特殊キーです:
ftp_password
(詳細はFTP_PASSWORD
参照)ftp_user
(詳細はFTP_USER
参照)
bindaddress¶
リクエストの実行に使用する発信IPアドレスのIP
download_timeout¶
ダウンローダーがタイムアウトするまで待機する時間(秒)。 DOWNLOAD_TIMEOUT
も参照してください。
download_latency¶
リクエストが開始されてから、つまりネットワークを介して送信されたHTTPメッセージから、レスポンスの取得に費やされた時間。 このメタ・キーは、レスポンスがダウンロードされた場合にのみ使用可能になります。他のほとんどのメタ・キーはScrapyの動作を制御するために使用されますが、これは読み取り専用であると想定されています。
download_fail_on_dataloss¶
壊れたレスポンスで失敗するかどうか。 DOWNLOAD_FAIL_ON_DATALOSS
を参照してください。
max_retry_times¶
メタ・キーを使用して、リクエストごとに再試行回数を設定します。初期化されると、 max_retry_times
メタ・キーは RETRY_TIMES
設定よりも優先されます。
レスポンスのダウンロードの停止¶
bytes_received
または headers_received
シグナルのハンドラーから StopDownload
例外を発生させると、そのレスポンスのダウンロードを停止させます。以下の例を参照してください:
import scrapy
class StopSpider(scrapy.Spider):
name = "stop"
start_urls = ["https://docs.scrapy.org/en/latest/"]
@classmethod
def from_crawler(cls, crawler):
spider = super().from_crawler(crawler)
crawler.signals.connect(spider.on_bytes_received, signal=scrapy.signals.bytes_received)
return spider
def parse(self, response):
# 'last_chars' show that the full response was not downloaded
yield {"len": len(response.text), "last_chars": response.text[-40:]}
def on_bytes_received(self, data, request, spider):
raise scrapy.exceptions.StopDownload(fail=False)
これにより、以下の出力が生成されます:
2020-05-19 17:26:12 [scrapy.core.engine] INFO: Spider opened
2020-05-19 17:26:12 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2020-05-19 17:26:13 [scrapy.core.downloader.handlers.http11] DEBUG: Download stopped for <GET https://docs.scrapy.org/en/latest/> from signal handler StopSpider.on_bytes_received
2020-05-19 17:26:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://docs.scrapy.org/en/latest/> (referer: None) ['download_stopped']
2020-05-19 17:26:13 [scrapy.core.scraper] DEBUG: Scraped from <200 https://docs.scrapy.org/en/latest/>
{'len': 279, 'last_chars': 'dth, initial-scale=1.0">\n \n <title>Scr'}
2020-05-19 17:26:13 [scrapy.core.engine] INFO: Closing spider (finished)
デフォルトでは、結果のレスポンスは対応するエラーバック(errback)によって処理されます。 代わりにコールバックを呼び出すには、この例のように、fail=False
を StopDownload
例外に渡します。
Requestのサブクラス¶
以下は組み込みの Request
のサブクラスのリストです。また、サブクラス化して独自のカスタム機能を実装することもできます。
FormRequestオブジェクト¶
FormRequestクラスは、ベースの Request
をHTMLフォームを処理する機能に関して拡張します。 lxml.html forms を使用して、フォームフィールドに Response
オブジェクトからのフォームデータを事前入力します。
- class scrapy.http.FormRequest(url[, formdata, ...])[ソース]¶
FormRequest
クラスは、新しいキーワード・パラメータを__init__
メソッドに追加します。残りの引数はRequest
クラスと同じであり、ここでは説明しません。- パラメータ
formdata (dict or collections.abc.Iterable) -- これは、URLエンコードされてリクエストの本文に割り当てられるHTMLフォームデータを含む辞書(または (キー, 値)タプルの反復可能要素)です。
FormRequest
オブジェクトは、標準のRequest
メソッドに加えて、次のクラスメソッドをサポートします:- classmethod from_response(response[, formname=None, formid=None, formnumber=0, formdata=None, formxpath=None, formcss=None, clickdata=None, dont_click=False, ...])[ソース]¶
指定のレスポンスに含まれるHTML
<form>
要素で見つかった値が事前に入力されたフォームフィールド値を持つ新しいFormRequest
オブジェクトを返します。例については、 FormRequest.from_response() を使用してユーザーログインをシミュレートする を参照してください。ポリシーは、デフォルトでは、
<input type="submit">
のようにクリック可能に見えるフォームコントロールのクリックを自動的にシミュレートすることです。 これは非常に便利で、多くの場合望ましい動作ですが、時にはデバッグが困難な問題を引き起こす可能性があります。 たとえば、javascriptを使用して、入力 and/or 送信されたフォームを操作する場合、デフォルトのfrom_response()
動作は最適ではない場合があります。この動作を無効にするには、dont_click
引数をTrue
に設定します。 また、(無効にするのではなく)クリックしたコントロールを変更したい場合は、clickdata
引数を使用することもできます。注意
オプション値に先頭または末尾の空白があるselect要素でこのメソッドを使用すると、lxml 3.8で修正されるべきlxmlのバグ(bug in lxml)のために機能しません。
- パラメータ
response (
Response
object) -- フォームフィールドに事前入力するために使用されるHTMLフォームを含むレスポンスformname (str) -- 指定した場合、name属性をこの値に設定したフォームが使用されます。
formid (str) -- 指定した場合、この値に設定されたid属性を持つフォームが使用されます。
formxpath (str) -- 指定すると、xpathに一致する最初のフォームが使用されます。
formcss (str) -- 指定した場合、cssセレクターに一致する最初のフォームが使用されます。
formnumber (int) -- レスポンスに複数のフォームが含まれる場合に使用するフォームの数。 最初のもの(およびデフォルト)は
0
です。formdata (dict) -- フォームデータでオーバーライドするフィールド。レスポンス
<form>
要素にフィールドが既に存在する場合、その値はこのパラメーターで渡された値によってオーバーライドされます。このパラメーターに渡された値がNone
の場合、フィールドはレスポンス<form>
要素に存在していても、リクエストに含まれません。clickdata (dict) -- クリックされたコントロールを検索する属性。 指定されていない場合、最初のクリック可能な要素のクリックをシミュレートしてフォームデータが送信されます。 html属性に加えて、コントロールは
nr
属性を介して、フォーム内の他の送信可能な入力に対するゼロベースのインデックスによって識別できます。dont_click (bool) -- Trueの場合、要素をクリックせずにフォームデータが送信されます。
このクラスメソッドの他のパラメータは、
FormRequest
の__init__
メソッドに直接渡されます。
Request使用例¶
HTTP POST経由でデータを送信するためにFormRequestを使う¶
スパイダーでHTMLフォームPOSTをシミュレートし、いくつかのキー値フィールドを送信する場合、以下のように(スパイダーから) FormRequest
オブジェクトを返すことができます:
return [FormRequest(url="http://www.example.com/post/action",
formdata={'name': 'John Doe', 'age': '27'},
callback=self.after_post)]
FormRequest.from_response() を使用してユーザーログインをシミュレートする¶
Webサイトでは通常、セッション関連データや認証トークン(ログインページ用)などの <input type="hidden">
要素を介して事前入力されたフォームフィールドを提供します。 スクレイピングするとき、これらのフィールドは自動的に事前入力され、ユーザー名やパスワードなどのいくつかのフィールドのみがオーバーライド必須です。この作業には FormRequest.from_response()
メソッドを使用できます。以下はこれを使用するスパイダーの例です:
import scrapy
def authentication_failed(response):
# TODO: Check the contents of the response and return True if it failed
# or False if it succeeded.
pass
class LoginSpider(scrapy.Spider):
name = 'example.com'
start_urls = ['http://www.example.com/users/login.php']
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'username': 'john', 'password': 'secret'},
callback=self.after_login
)
def after_login(self, response):
if authentication_failed(response):
self.logger.error("Login failed")
return
# continue scraping with authenticated session...
JsonRequest¶
JsonRequestクラスは、ベースの Request
クラスにJSONリクエストを処理する機能をくわえます。
- class scrapy.http.JsonRequest(url[, ... data, dumps_kwargs])[ソース]¶
JsonRequest
クラスは、2つの新しいキーワード・パラメータを__init__
メソッドに追加します。残りの引数はRequest
クラスと同じであり、ここでは説明しません。JsonRequest
を使用すると、Content-Type
ヘッダーをapplication/json
にセットし、そして、Accept
ヘッダーをapplication/json, text/javascript, */*; q=0.01
にセットします。- パラメータ
data (object) -- JSONエンコードして本文に割り当てる必要があるJSONシリアル化可能オブジェクトです。
Request.body
引数が指定されている場合、このパラメーターは無視されます。Request.body
引数が提供されておらず、データ引数が提供されている場合、Request.method
は'POST'
に自動的に設定されます。dumps_kwargs (dict) -- データをJSON形式にシリアル化するために使用される、基礎となる
json.dumps()
メソッドに渡されるパラメータ。
JsonRequest使用例¶
JSONペイロードを含むJSON POSTリクエストを送信する:
data = {
'name1': 'value1',
'name2': 'value2',
}
yield JsonRequest(url='http://www.example.com/post/action', data=data)
Responseオブジェクト¶
- class scrapy.http.Response(*args, **kwargs)[ソース]¶
Response
オブジェクトはHTTPレスポンスを表し、通常は(ダウンローダーによって)ダウンロードされ、処理のためにスパイダーに送られます。- パラメータ
url (str) -- このレスポンスのURL
status (int) -- レスポンスのHTTPステータス。デフォルトは
200
です。headers (dict) -- このレスポンスのヘッダー。 辞書値は、文字列(単一値のヘッダーの場合)またはリスト(複数値のヘッダーの場合)です。
body (bytes) -- レスポンス・ボディ。デコードされたテキストに文字列としてアクセスするには、
TextResponse
のようなエンコーディング対応の Responseサブクラス のresponse.text
を使用します。flags (list) --
Response.flags
属性の初期値を含むリストです。 指定すると、リストは浅くコピー(shallow copy)されます。request (scrapy.http.Request) --
Response.request
属性の初期値。これは、このレスポンスを生成したRequest
を表します。certificate (twisted.internet.ssl.Certificate) -- サーバーのSSL証明書を表すオブジェクト。
ip_address (
ipaddress.IPv4Address
oripaddress.IPv6Address
) -- レスポンスの送信元のサーバーのIPアドレス。protocol (
str
) -- レスポンスのダウンロードに使用されたプロトコル。 例: "HTTP/1.0", "HTTP/1.1", "h2"
バージョン 2.0.0 で追加:
certificate
パラメータ。バージョン 2.1.0 で追加:
ip_address
パラメータ。バージョン 2.5.0 で追加:
protocol
パラメータ。- status¶
レスポンスのHTTPステータスを表す整数。例:
200
、404
- headers¶
レスポンス・ヘッダーを含む辞書のようなオブジェクト。値にアクセスするには、
get()
を使用して指定した名前の最初のヘッダー値を返すか、getlist()
を使用して指定した名前のすべてのヘッダー値を返します。たとえば、以下のの呼び出しはヘッダーのすべてのクッキーを提供します:response.headers.getlist('Set-Cookie')
- body¶
バイト(bytes)としてのレスポンス・ボディ
ボディを文字列として使用する場合は、
TextResponse.text
を使用します(TextResponse
およびそのサブクラスでのみ使用可能)。この属性は読み取り専用です。 レスポンスのボディを変更するには、
replace()
を使用します。
- request¶
このレスポンスを生成した
Request
オブジェクト。この属性は、レスポンスとリクエストが、すべての ダウンローダー・ミドルウェア を通過した後、Scrapyエンジンで割り当てられます。 特に、これは以下を意味します:HTTPリダイレクトにより、元のリクエスト(リダイレクト前のURLへ)がリダイレクトされたレスポンス(リダイレクト後の最終URL)に割り当てられます。
Response.request.urlは必ずしもResponse.urlと同じではありません
この属性は、スパイダー・コード、および スパイダー・ミドルウェア でのみ使用できます。ただし、(他の方法でリクエストを使用できる場合の)ダウンローダー・ミドルウェアと
response_downloaded
シグナルのハンドラーには含まれません。
- meta¶
Response.request
オブジェクトのRequest.meta
属性(つまりself.request.meta
)へのショートカット。Response.request
属性とは異なり、Response.meta
属性はリダイレクトと再試行に沿って伝播されるため、元のRequest.meta
がスパイダーから送信されます。参考
Request.meta
属性
- cb_kwargs¶
バージョン 2.0 で追加.
Response.request
オブジェクトのRequest.cb_kwargs
属性(つまりself.request.cb_kwargs
)へのショートカット。Response.request
属性とは異なり、Response.cb_kwargs
属性はリダイレクトと再試行に沿って伝播されるため、元のRequest.cb_kwargs
がスパイダーから送信されます。参考
- flags¶
このレスポンスのフラグを含むリスト。フラグは、レスポンスのタグ付けに使用されるラベルです。 例:
'cached'
、'redirected
' など。これらは、エンジンがログ記録に使用するResponse ( __str__ メソッド)の文字列表現に表示されます。
- certificate¶
バージョン 2.0.0 で追加.
サーバーのSSL証明書を表す
twisted.internet.ssl.Certificate
オブジェクト。https
のレスポンスに対してのみ入力され、それ以外の場合はNone
が入力されます。
- ip_address¶
バージョン 2.1.0 で追加.
レスポンスの送信元のサーバーのIPアドレス。
この属性は現在、HTTP 1.1 ダウンロードハンドラ、つまり
http(s)
のレスポンスによってのみ入力されます。 他のハンドラの場合、ip_address
は常にNone
です。
- protocol¶
バージョン 2.5.0 で追加.
レスポンスのダウンロードに使用されたプロトコル。 例: "HTTP/1.0", "HTTP/1.1"
この属性は現在、HTTPダウンロードハンドラ、つまり
http(s)
レスポンスによってのみ入力されます。 他のハンドラの場合、protocol
は常にNone
です。
- replace([url, status, headers, body, request, flags, cls])[ソース]¶
指定されたキーワード引数によって新しい値が指定されたメンバーを除き、同じメンバーを持つレスポンスオブジェクトを返します。属性
Response.meta
はデフォルトでコピーされます。
- urljoin(url)[ソース]¶
指定の url (たぶん相対URL)と レスポンスの
url
(Response.url
) を組み合わせて、絶対URLを構築します。これは
urljoin()
のラッパーであり、以下の呼び出しを行うための単なるエイリアスです:urllib.parse.urljoin(response.url, url)
- follow(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, cb_kwargs=None, flags=None) → scrapy.http.request.Request[ソース]¶
リンク
url
をたどるためのRequest
インスタンスを返します。Request.__init__
メソッドと同じ引数を受け入れますが、url
は絶対URLだけでなく、相対URLまたはscrapy.link.Link
オブジェクトでもかまいません。TextResponse
は、絶対URLと相対URLとLinkオブジェクトに加えてセレクターをサポートするfollow()
メソッドを提供します。バージョン 2.0 で追加: flags パラメータ。
- follow_all(urls, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, cb_kwargs=None, flags=None) → Generator[scrapy.http.request.Request, None, None][ソース]¶
バージョン 2.0 で追加.
urls
内のすべてのリンクをたどるために、反復可能(iterable)なRequest
インスタンスを返します。Request.__init__
メソッドと同じ引数を受け入れますが、urls
の要素は、絶対URLだけでなく、相対URLまたはLink
オブジェクトにすることができます。TextResponse
は、絶対URLと相対URLとLinkオブジェクトに加えてセレクターをサポートするfollow_all()
メソッドを提供します。
Responseのサブクラス¶
使用可能な組み込みResponseのサブクラスのリストは以下のとおりです。 Responseクラスをサブクラス化して、独自の機能を実装することもできます。
TextResponseオブジェクト¶
- class scrapy.http.TextResponse(url[, encoding[, ...]])[ソース]¶
TextResponse
オブジェクトは、エンコード機能を、ベースのResponse
クラスに追加します。これは、画像、音声、メディアファイルなどのバイナリデータにのみ使用することを目的としています。TextResponse
オブジェクトは、基本のResponse
オブジェクトに加えて、新しい__init__
メソッド引数をサポートします。 残りの機能はResponse
クラスの場合と同じであり、ここでは説明しません。- パラメータ
encoding (str) -- このレスポンスに使用するエンコーディングを含む文字列です。文字列をボディとして
TextResponse
オブジェクトを作成すると、このエンコーディングを使用してエンコードされたバイトに変換されます。 encoding がNone
(デフォルト)の場合、レスポンス・ヘッダーとボディの中でエンコーディングを探します。
TextResponse
オブジェクトは、標準のResponse
に加えて、次の属性をサポートします:- text¶
文字列としてのスポンス・ボディ
response.body.decode(response.encoding)
と同じですが、最初の呼び出し後に結果がキャッシュされるため、余分なオーバーヘッドなしでresponse.text
に複数回アクセスできます。注釈
str(response.body)
は、レスポンス・ボディを文字列に変換する正しい方法ではありません:>>> str(b'body') "b'body'"
- encoding¶
このレスポンスのエンコードを含む文字列。 エンコードは、次のメカニズムを順番に試して解決されます:
__init__
メソッドのencoding
引数で渡されたエンコーディングContent-Type HTTPヘッダーで宣言されたエンコーディング。 このエンコードが有効でない(つまり不明の)場合、無視され、次の解決メカニズムが試行されます。
レスポンス・ボディで宣言されたエンコーディング。 TextResponseクラスは、このための特別な機能を提供しません。 ただし、
HtmlResponse
とXmlResponse
クラスはサポートします。レスポンス・ボディを見て推測するエンコーディング。 これはより壊れやすい方法ですが、最後に試す方法でもあります。
TextResponse
オブジェクトは標準のResponse
に加えて以下のメソッドをサポートします:- follow(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding=None, priority=0, dont_filter=False, errback=None, cb_kwargs=None, flags=None) → scrapy.http.request.Request[ソース]¶
リンク
url
をたどるにはRequest
インスタンスを返します。Request.__init__
メソッドと同じ引数を受け入れますが、url
は絶対URLだけでなく、以下も受け入れます。相対URL
Link
オブジェクト。例: リンク抽出器(link extractors) の結果<link>
または<a>
要素のSelector
オブジェクト。例えばresponse.css('a.my_link')[0]
属性
Selector
(SelectorListではありません)。 例:response.css('a::attr(href)')[0]
またはresponse.xpath('//img/@src')[0]
使用例については リクエストを作成するためのショートカット を参照して下さい。
- follow_all(urls=None, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding=None, priority=0, dont_filter=False, errback=None, cb_kwargs=None, flags=None, css=None, xpath=None) → Generator[scrapy.http.request.Request, None, None][ソース]¶
urls
内のすべてのリンクをたどるためのRequest
インスタンスを生成するジェネレータ。Request
の__init__
メソッドと同じ引数を受け入れますが、各urls
要素は絶対 URL である必要はなく、以下のいずれも指定できます:相対URL
Link
オブジェクト。例: リンク抽出器(link extractors) の結果<link>
または<a>
要素のSelector
オブジェクト。例えばresponse.css('a.my_link')[0]
属性
Selector
(SelectorListではありません)。 例:response.css('a::attr(href)')[0]
またはresponse.xpath('//img/@src')[0]
さらに、
css
およびxpath
引数は、follow_all
メソッド内でリンク抽出を実行するために受け入れられます(urls
およびcss
およびxpath
のうちの1つだけが受け入れられます)。SelectorList
をurls
パラメータの引数として渡す場合、またはcss
またはxpath
パラメータを使用する場合、このメソッドはリンクを取得できないセレクターのリクエストを生成しないことに注意してください。 (例えば、href
属性のないアンカータグ)
HtmlResponseオブジェクト¶
- class scrapy.http.HtmlResponse(url[, ...])[ソース]¶
HtmlResponse
クラスはTextResponse
のサブクラスで、HTMLの meta http-equiv 属性を調べることでエンコーディングの自動検出サポートを追加します。TextResponse.encoding
参照。
XmlResponseオブジェクト¶
- class scrapy.http.XmlResponse(url[, ...])[ソース]¶
XmlResponse
クラスはTextResponse
のサブクラスで、XML宣言行を調べることでエンコーディングの自動検出サポートを追加します。TextResponse.encoding
参照。