Scrapy-requests-and-responses
スクレイピー-リクエストとレスポンス
説明
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])