リクエストとレスポンス

Scrapyは、Webサイトのクロールに RequestResponse オブジェクトを使用します。

通常、 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 パラメータを使用します。 これは、現在改善に取り組んでいる既知の制限です。

  • cookies (dict or list) --

    リクエスト・クッキー。これらは2つの形式で送信できます。

    1. 辞書の使用:

      request_with_cookies = Request(url="http://www.example.com",
                                     cookies={'currency': 'USD', 'country': 'UY'})
      
    2. 辞書のリストの使用:

      request_with_cookies = Request(url="http://www.example.com",
                                     cookies=[{'name': 'currency',
                                              'value': 'USD',
                                              'domain': 'example.com',
                                              'path': '/currency'}])
      

    後者の形式では、クッキーの domain および path 属性をカスタマイズできます。これは、クッキーが後のリクエストのために保存される場合にのみ役立ちます。

    一部のサイトが(レスポンスで)クッキーを返すと、それらはそのドメインのクッキーに保存され、今後のリクエストで再度送信されます。これは通常のWebブラウザの一般的な動作です。

    保存されたクッキーを送信せず、受信したクッキーを保存しないリクエストを作成するには、 request.metadont_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

リクエスト・ヘッダーを含む辞書のようなオブジェクト。

body

バイト(bytes)としてのリクエスト・ボディ。

この属性は読み取り専用です。リクエストの本文を変更するには、 replace() を使用します。

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とその組み込み拡張機能によって認識される特殊なキーがあります。

以下がその特殊キーです:

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=FalseStopDownload 例外に渡します。

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 or ipaddress.IPv6Address) -- レスポンスの送信元のサーバーのIPアドレス。

  • protocol (str) -- レスポンスのダウンロードに使用されたプロトコル。 例: "HTTP/1.0", "HTTP/1.1", "h2"

バージョン 2.0.0 で追加: certificate パラメータ。

バージョン 2.1.0 で追加: ip_address パラメータ。

バージョン 2.5.0 で追加: protocol パラメータ。

url

レスポンスのURLを含む文字列。

この属性は読み取り専用です。レスポンスのURLを変更するには、 replace() を使用します。

status

レスポンスのHTTPステータスを表す整数。例: 200404

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 がスパイダーから送信されます。

参考

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 です。

copy()[ソース]

このレスポンスのコピーである新しいレスポンスを返します。

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 オブジェクトを作成すると、このエンコーディングを使用してエンコードされたバイトに変換されます。 encodingNone (デフォルト)の場合、レスポンス・ヘッダーとボディの中でエンコーディングを探します。

TextResponse オブジェクトは、標準の Response に加えて、次の属性をサポートします:

text

文字列としてのスポンス・ボディ

response.body.decode(response.encoding) と同じですが、最初の呼び出し後に結果がキャッシュされるため、余分なオーバーヘッドなしで response.text に複数回アクセスできます。

注釈

str(response.body) は、レスポンス・ボディを文字列に変換する正しい方法ではありません:

>>> str(b'body')
"b'body'"
encoding

このレスポンスのエンコードを含む文字列。 エンコードは、次のメカニズムを順番に試して解決されます:

  1. __init__ メソッドの encoding 引数で渡されたエンコーディング

  2. Content-Type HTTPヘッダーで宣言されたエンコーディング。 このエンコードが有効でない(つまり不明の)場合、無視され、次の解決メカニズムが試行されます。

  3. レスポンス・ボディで宣言されたエンコーディング。 TextResponseクラスは、このための特別な機能を提供しません。 ただし、 HtmlResponseXmlResponse クラスはサポートします。

  4. レスポンス・ボディを見て推測するエンコーディング。 これはより壊れやすい方法ですが、最後に試す方法でもあります。

selector

レスポンスをターゲットとして使用する Selector インスタンス。セレクターは最初のアクセスで遅延的(lazily)にインスタンス化されます。

TextResponse オブジェクトは標準の Response に加えて以下のメソッドをサポートします:

xpath(query)[ソース]

TextResponse.selector.xpath(query) へのショートカット:

response.xpath('//p')
css(query)[ソース]

TextResponse.selector.css(query) へのショートカット:

response.css('p')
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つだけが受け入れられます)。

SelectorListurls パラメータの引数として渡す場合、または css または xpath パラメータを使用する場合、このメソッドはリンクを取得できないセレクターのリクエストを生成しないことに注意してください。 (例えば、href 属性のないアンカータグ)

json()[ソース]

バージョン 2.2 で追加.

JSON ドキュメントを Python オブジェクトに逆シリアライズ(deserialize)します。

逆シリアライズ(deserialize)された JSON ドキュメントから Python オブジェクトを返します。 結果は、最初の呼び出し後にキャッシュされます。

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 参照。