Scrapy-requests-and-responses

提供:Dev Guides
移動先:案内検索

スクレイピー-リクエストとレスポンス

説明

Scrapyは、 Request および Response オブジェクトを使用してWebサイトをクロールできます。 要求オブジェクトはシステムを通過し、スパイダーを使用して要求を実行し、応答オブジェクトを返すと要求に戻ります。

リクエストオブジェクト

要求オブジェクトは、応答を生成するHTTP要求です。 次のクラスがあります-

class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = False, errback])

次の表は、リクエストオブジェクトのパラメータを示しています-

Sr.No Parameter & Description
1

url

URLリクエストを指定する文字列です。

2

callback

これは、要求の応答を最初のパラメーターとして使用する呼び出し可能な関数です。

3

method

HTTPメソッド要求を指定する文字列です。

4

headers

これは、リクエストヘッダーを含む辞書です。

5

body

要求本文を持つ文字列またはユニコードです。

6

cookies

これは、リクエストCookieを含むリストです。

7

meta

これは、リクエストのメタデータの値を含む辞書です。

8

encoding

URLのエンコードに使用されるutf-8エンコードを含む文字列です。

9

priority

これは、スケジューラーが優先順位を使用して要求を処理する順序を定義する整数です。

10

dont_filter

これは、スケジューラがリクエストをフィルタリングしないことを指定するブール値です。

11

errback

要求の処理中に例外が発生したときに呼び出される呼び出し可能な関数です。

追加データをコールバック関数に渡す

要求のコールバック関数は、応答が最初のパラメーターとしてダウンロードされるときに呼び出されます。

たとえば-

def parse_page1(self, response):
   return scrapy.Request("http://www.something.com/some_pagel",
      callback = self.parse_page2)

def parse_page2(self, response):
   self.logger.info("%s page visited", response.url)

次の例に示すように、呼び出し可能な関数に引数を渡し、2番目のコールバックでそれらの引数を受け取りたい場合、 Request.meta 属性を使用できます-

def parse_page1(self, response):
   item = DemoItem()
   item['foremost_link'] = response.url
   request = scrapy.Request("http://www.something.com/some_pagel",
      callback = self.parse_page2)
   request.meta['item'] = item
   return request

def parse_page2(self, response):
   item = response.meta['item']
   item['other_link'] = response.url
   return item

リクエスト処理で例外をキャッチするためのエラーバックの使用

errbackは、要求の処理中に例外が発生したときに呼び出される呼び出し可能な関数です。

次の例はこれを示しています-

import scrapy

from scrapy.spidermiddlewares.httperror import HttpError
from twisted.internet.error import DNSLookupError
from twisted.internet.error import TimeoutError, TCPTimedOutError

class DemoSpider(scrapy.Spider):
   name = "demo"
   start_urls = [
      "http://www.httpbin.org/",              # HTTP 200 expected
      "http://www.httpbin.org/status/404",    # Webpage not found
      "http://www.httpbin.org/status/500",    # Internal server error
      "http://www.httpbin.org:12345/",        # 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('Recieved response from {}'.format(response.url))
      # ...

   def errback_httpbin(self, failure):
      # logs failures
      self.logger.error(repr(failure))

      if failure.check(HttpError):
         response = failure.value.response
         self.logger.error("HttpError occurred on %s", response.url)

      elif failure.check(DNSLookupError):
         request = failure.request
         self.logger.error("DNSLookupError occurred on %s", request.url)

      elif failure.check(TimeoutError, TCPTimedOutError):
         request = failure.request
         self.logger.error("TimeoutError occurred on %s", request.url)

Request.meta特殊キー

request.meta特殊キーは、Scrapyによって識別される特殊なメタキーのリストです。

次の表は、Request.metaのキーの一部を示しています-

Sr.No Key & Description
1

dont_redirect

trueに設定するとキーになり、応答のステータスに基づいて要求をリダイレクトしません。

2

dont_retry

trueに設定するとキーになり、失敗した要求を再試行せず、ミドルウェアによって無視されます。

3

handle_httpstatus_list

これは、要求ごとに許可できる応答コードを定義するキーです。

4

handle_httpstatus_all

これは、_true_に設定することにより、要求の応答コードを許可するために使用されるキーです。

5

dont_merge_cookies

これは、_true_に設定することにより、既存のCookieとのマージを回避するために使用されるキーです。

6

cookiejar

これは、スパイダーごとに複数のCookieセッションを保持するために使用されるキーです。

7

dont_cache

これは、各ポリシーでのHTTPリクエストとレスポンスのキャッシュを回避するために使用されるキーです。

8

redirect_urls

これは、リクエストが通過するURLを含むキーです。

9

bindaddress

要求の実行に使用できるのは、発信IPアドレスのIPです。

10

dont_obey_robotstxt

trueに設定するとキーになり、ROBOTSTXT_OBEYが有効になっている場合でも、robots.txt除外標準で禁止されているリクエストをフィルタリングしません。

11

download_timeout

ダウンローダーがタイムアウトするまで待機するスパイダーごとのタイムアウト(秒単位)を設定するために使用されます。

12

download_maxsize

ダウンローダーがダウンロードするスパイダーごとの最大サイズ(バイト単位)を設定するために使用されます。

13

proxy

要求オブジェクトにプロキシを設定して、要求を使用するためのHTTPプロキシを設定できます。

サブクラスのリクエスト

要求クラスをサブクラス化することにより、独自のカスタム機能を実装できます。 組み込みの要求サブクラスは次のとおりです-

FormRequestオブジェクト

FormRequestクラスは、ベースリクエストを拡張することでHTMLフォームを処理します。 次のクラスがあります-

class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body,
   cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])

以下はパラメータです-

*formdata* -要求の本文に割り当てられたHTMLフォームデータを含む辞書です。

-残りのパラメーターはリクエストクラスと同じで、*リクエストオブジェクト*セクションで説明されています。

次のクラスメソッドは、リクエストメソッドに加えて FormRequest オブジェクトによってサポートされています-

classmethod from_response(response[, formname = None, formnumber = 0, formdata = None,
   formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])

次の表は、上記のクラスのパラメータを示しています-

Sr.No Parameter & Description
1

response

これは、応答のHTMLフォームを使用してフォームフィールドに事前入力するために使用されるオブジェクトです。

2

formname

指定されている場合、name属性を持つフォームが使用される文字列です。

3

formnumber

応答に複数のフォームがある場合に使用されるフォームの整数です。

4

formdata

これは、オーバーライドに使用されるフォームデータのフィールドのディクショナリです。

5

formxpath

指定された場合は文字列で、xpathに一致する形式が使用されます。

6

formcss

指定された場合は文字列で、CSSセレクターに一致する形式が使用されます。

7

clickdata

クリックされたコントロールを観察するために使用される属性の辞書です。

8

dont_click

trueに設定されている場合、フォームからのデータは、要素をクリックせずに送信されます。

以下は、リクエストの使用例の一部です-

  • FormRequestを使用してHTTP POST経由でデータを送信する*

次のコードは、スパイダーでHTMLフォームPOSTを複製するときに FormRequest オブジェクトを返す方法を示しています-

return [FormRequest(url = "http://www.something.com/post/action",
   formdata = {'firstname': 'John', 'lastname': 'dave'},
   callback = self.after_post)]
  • FormRequest.from_response()を使用してユーザーログインをシミュレートする*

通常、Webサイトは、事前に入力されたフォームフィールドを提供する要素を使用します。

  • FormRequest.form_response()*メソッドは、これらのフィールドをスクレイピング中に自動的に入力する場合に使用できます。

次の例はこれを示しています。

import scrapy
class DemoSpider(scrapy.Spider):
   name = 'demo'
   start_urls = ['http://www.something.com/users/login.php']
   def parse(self, response):
      return scrapy.FormRequest.from_response(
         response,
         formdata = {'username': 'admin', 'password': 'confidential'},
         callback = self.after_login
      )

   def after_login(self, response):
      if "authentication failed" in response.body:
         self.logger.error("Login failed")
         return
      # You can continue scraping here

応答オブジェクト

これは、スパイダーに送られて処理されるHTTP応答を示すオブジェクトです。 次のクラスがあります-

class scrapy.http.Response(url[, status = 200, headers, body, flags])

次の表は、応答オブジェクトのパラメータを示しています-

Sr.No Parameter & Description
1

url

URL応答を指定する文字列です。

2

status

HTTPステータスレスポンスを含む整数です。

3

headers

これは、応答ヘッダーを含む辞書です。

4

body

応答本文を含む文字列です。

5

flags

応答のフラグを含むリストです。

応答サブクラス

応答クラスをサブクラス化することにより、独自のカスタム機能を実装できます。 組み込みの応答サブクラスは次のとおりです-

  • TextResponseオブジェクト*

TextResponseオブジェクトは、画像、音声などのバイナリデータに使用されます。 基本Responseクラスをエンコードする機能があります。 次のクラスがあります-

class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])

以下はパラメータです-

*encoding* -応答のエンコードに使用されるエンコード付きの文字列です。

-残りのパラメーターは応答クラスと同じで、*応答オブジェクト*セクションで説明されています。

次の表は、応答メソッドに加えて、TextResponseオブジェクトでサポートされる属性を示しています-

Sr.No Attribute & Description
1

text

response.textに複数回アクセスできる応答本文です。

2

encoding

これは、応答のエンコードを含む文字列です。

3

selector

これは、最初のアクセスでインスタンス化される属性であり、ターゲットとして応答を使用します。

次の表は、_response_メソッドに加えて_TextResponse_オブジェクトでサポートされるメソッドを示しています-

Sr.No Method & Description
1

xpath (query)

TextResponse.selector.xpath(query)へのショートカットです。

2

css (query)

TextResponse.selector.css(query)へのショートカットです。

3

body_as_unicode()

これはメソッドとして使用できる応答本文であり、response.textに複数回アクセスできます。

HtmlResponseオブジェクト

これは、HTMLの_meta httpequiv_属性を調べることにより、エンコードと自動検出をサポートするオブジェクトです。 そのパラメーターは応答クラスと同じであり、応答オブジェクトのセクションで説明されています。 次のクラスがあります-

class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])

XmlResponseオブジェクト

これは、XML行を見てエンコードと自動検出をサポートするオブジェクトです。 そのパラメーターは応答クラスと同じであり、応答オブジェクトのセクションで説明されています。 次のクラスがあります-

class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])