[Scrapyフレームワーク]「バージョン2.4.0ソースコード」のリクエストとレスポンス(リクエストとレスポンス)の詳細記事

すべてのソースコード分析記事インデックスディレクトリポータル

[Scrapy Framework]バージョン2.4.0ソースコード:すべての構成ディレクトリインデックス

前書き

Scrapyのリクエストとレスポンスは、ウェブサイトのデータをクロールするために使用されます。

Requestオブジェクトは、データキャプチャ中に生成され、システムを介してダウンローダーに渡されます。ダウンローダーは、リクエストを実行し、Responseオブジェクトを返します。これは、リクエストを行ったスパイダーに返されます。

オブジェクトをリクエストする

クラスscrapy.http.Request(* args、** kwargs)

主なパラメータ:
url(str):要求されたURL、URLが無効な場合、ValueErrorは例外を発生させます

コールバック:コールバック関数。次に指定されたコールバックメソッドを実行するために使用されます

メソッド:HTTPアクセスメソッド、デフォルトのGET

メタ:渡されたパラメータの辞書

本文:キャプチャされたテキスト情報を要求します。デフォルトのエンコーディングはutf-8です。

ヘッダー:セットリクエストの聞き手情報。通常、ランダムに新しいメソッドに置き換えられます。

クッキー:設定されたリクエストのクッキー情報、一般的な保存方法は辞書です

エンコーディング:デフォルトはutf-8です

優先度:ハンドラーの優先度

dont_filter:重複するフィルター設定を無視するかどうか

errback:エラーコールバック関数

フラグ:ロギングに使用されます

cb_kwargs:キーワードパラメータとして要求されたコールバック関数に渡される任意のデータのdict

追加のデータがコールバック関数に渡されます

要求されたコールバックは、要求への応答がダウンロードされたときに呼び出される関数です。

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)

Request.cb_kwargs属性を使用して、2番目のコールバックでパラメーターを受け取ります

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,
    )

フォールバックを使用して、リクエスト処理で例外をキャッチします

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/",              # 200 正常访问
        "http://www.httpbin.org/status/404",    # 404 无页面
        "http://www.httpbin.org/status/500",    # 500 服务器挂了
        "http://www.httpbin.org:12345/",        # 超时访问不到主机端口
        "http://www.httphttpbinbin.org/",       # DNS解析错误
    ]

    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))
		......

    def errback_httpbin(self, failure):
        # 全部的失败日志
        self.logger.error(repr(failure))
		# 如果想对某些错误进行特殊处理,需要失败的类型

        if failure.check(HttpError):
			# 这些异常来自HttpError Spider中间件获得非200的相应
            response = failure.value.response
            self.logger.error('HttpError on %s', response.url)

        elif failure.check(DNSLookupError):
            # 这是原始请求
            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のパラメーターに従って処理できます。

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特殊キー

より詳細な操作については、ミドルウェアと実際のアプリケーションケースを参照してください。ここでは簡単な説明のみを示します。

  1. dont_redirect:Request.metaのdont_redirectキーがTrueに設定されている場合、ミドルウェアは要求を無視します。

  2. dont_retry:Request.metaのdont_retryキーがTrueに設定されている場合、このミドルウェアは要求を無視します。

  3. handle_httpstatus_list:この範囲外の応答コードを処理する場合は、handle_httpstatus_listスパイダー属性またはHTTPERROR_ALLOWED_CODESを使用して、指定したスパイダーが処理できる応答コードを設定できます。

  4. handle_httpstatus_all:Request.metaのhandle_httpstatus_listキーを使用して、各リクエストに許可される応答コードを指定することもできます。要求された応答コードを許可する場合は、メタキーhandle_httpstatus_allをTrueに設定することもできます。

  5. dont_merge_cookies:Cookieを要求します。

  6. cookiejar:cookiejarを使用してメタキーを要求し、各スパイダーで複数のcookieセッションを維持することをサポートします。デフォルトでは、単一のCookie jar(セッション)を使用しますが、識別子を渡して他の識別子を使用することもできます。

  7. dont_cache:True以外のdont_cacheメタキーを使用して各戦略の応答をキャッシュすることは避けてください。

  8. redirect_reasonsredirect_urlsの各リダイレクトの理由は、redirect_reasonsRequest.metaキーにあります。

  9. redirect_urls:リクエストが通過するURL(リダイレクト時)は、redirect_urlsRequest.metaキーにあります。

  10. bindaddress:リクエストの実行に使用される発信IPアドレスのIP。

  11. dont_obey_robotstxt:Request.metaのdont_obey_robotstxtキーがTrueに設定されている場合、ROBOTSTXT_OBEYが有効になっている場合でも、ミドルウェアはリクエストを無視します。

  12. download_timeout:ダウンローダーがタイムアウトするまで待機する時間(秒単位)。参照:DOWNLOAD_TIMEOUT。

  13. download_maxsize:download_maxsizeスパイダー属性を使用して各スパイダーのサイズを設定し、download_maxsizeRequest.metaキーを使用して各リクエストのサイズを設定できます。

  14. download_latency:要求の開始(つまり、ネットワークを介して送信されるHTTPメッセージ)から応答を取得するのにかかる時間。このメタキーは、応答をダウンロードした後にのみ使用できます。他のほとんどのメタキーはScrapyの動作を制御するために使用されますが、このキーは読み取り専用である必要があります。

  15. download_fail_on_dataloss:応答の失敗が原因で失敗したかどうか。

  16. proxy:ミドルウェアは、Requestオブジェクトのプロキシ要素値を設定することにより、リクエストのHTTPプロキシを設定します。

  17. ftp_user:リクエスト要素に「ftp_user」がない場合、FTP接続に使用されるユーザー名。

  18. ftp_password:リクエスト要素に「ftp_password」がない場合、FTP接続に使用されるパスワード。

  19. referrer_policy:リクエストの「Referer」ヘッダーに入力するときに適用されるリファラーポリシー。

  20. max_retry_times:メタキーを使用して、各リクエストの再試行時間を設定します。初期化後、max_retry_timesメタキーの優先度はRETRY_TIMES設定よりも高くなります。

応答を停止します

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”表明未下载完整响应
        yield {
    
    "len": len(response.text), "last_chars": response.text[-40:]}

    def on_bytes_received(self, data, request, spider):
        raise scrapy.exceptions.StopDownload(fail=False)

サブクラスをリクエストする

クラスscrapy.http.FormRequest(url [、formdata、…])

パラメータを渡すために使用されるクラスであるFormRequestオブジェクトには、HTMLフォームを処理する機能があります。指定された応答に含まれるHTML要素のフォームフィールド値が事前に入力された新しいFormRequestオブジェクトを返します。

メインパラメータ
応答(応答オブジェクト):フォームフィールドへの入力に使用されるHTMLフォームの応答が含まれます

formname(str):定義されている場合、name属性がこの値に設定されているフォームが使用されます。

formid(str):定義されている場合、id属性がこの値に設定されたフォームが使用されます。

formxpath(str):定義されている場合、xpathに一致する最初のフォームが使用されます。

formcss(str):定義されている場合、cssセレクターに一致する最初のフォームが使用されます。

formnumber(int):応答に複数のフォームが含まれている場合に使用されるフォームの数。最初の(およびデフォルト値)は0です。

formdata(dict):フォームデータでカバーされるフィールド。フィールドが応答要素にすでに存在する場合、そのフィールドの値は、このパラメーターで渡されたフィールドによって上書きされます。このパラメーターで渡される値がNoneの場合、フィールドが応答要素に存在していても、フィールドは要求に含まれません。

clickdata(dict):クリックされたコントロールの属性を検索します。指定しない場合は、最初のクリック可能な要素のクリックをシミュレートして、フォームデータを送信します。html属性に加えて、nr属性を使用して、フォーム内の他の送信可能な入力に関連するゼロベースのインデックスを持つコントロールを識別することもできます。

dont_click(bool):Trueの場合、要素をクリックせずにフォームデータを送信できます。

FormRequestを使用してHTTPPOST経由でデータを送信する

import scrapy

def authentication_failed(response):
	# 检查响应的内容,如果失败,则返回True;如果成功,则返回False。
    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

クラスscrapy.http.JsonRequest(url [、…data、dumps_kwargs])

JsonRequestのヘッダー設定

{
    
    
	'Content-Type':'application/json',
	'Accept':'application/json, text/javascript, */*; q=0.01'
}

パラメータの説明:

  1. データ(オブジェクト):JSONエンコーディングを必要とし、本体に割り当てられるJSONシリアル化可能なオブジェクトです。Request.bodyがパラメーターを提供する場合、このパラメーターは無視されます。Request.bodyがパラメーターを提供せず、データパラメーターを提供する場合、Request.methodは自動的に「POST」をに設定します。
  2. dumps_kwargs(dict):データをJSON形式にシリアル化するために使用される基本的なjson.dumps()メソッドに渡されるパラメーター。

JSONペイロードを使用してJSONPOSTリクエストを送信します

data = {
    
    
    'name1': 'value1',
    'name2': 'value2',
}
yield JsonRequest(url='http://www.example.com/post/action', data=data)

応答オブジェクト

クラスscrapy.http.Response(* args、** kwargs)

ResponseオブジェクトはHTTP応答を表し、HTTP応答は通常ダウンロードされ(ダウンローダーによってダウンロードされ)、処理のためにSpiderに送信されます。

パラメータの説明:

  1. url(str):応答のURL

  2. status(int):応答のHTTPステータス。デフォルトは200です。

  3. headers(dict):この応答のヘッダーdict値は、文字列(単一値ヘッダーの場合)またはリスト(複数値ヘッダーの場合)にすることができます。

  4. 本文(バイト):応答本文。デコードされたテキストに文字列としてアクセスするには、response.textを使用して、TextResponseなどのコード化されたResponseサブクラスを認識します。

  5. flags(list):Response.flags属性の初期値を含むリストです。指定した場合、リストは表面的にコピーされます。

  6. request(scrapy.http.Request):Response.requestプロパティの初期値。これは、リクエストがこの応答を生成したことを意味します。

  7. 証明書(twisted.internet.ssl.Certificate):サーバーSSL証明書のオブジェクトを表します。

  8. ip_address(ipaddress.IPv4Addressまたはipaddress.IPv6Address):応答を開始したサーバーのIPアドレス。

応答サブクラス

使用可能な組み込みのResponseサブクラスのリスト。Responseクラスをサブクラス化して、集合関数を実現できます。

クラスscrapy.http.TextResponse(url [、encoding [、…]])

TextResponseオブジェクトは、エンコード関数を基本Responseクラスに追加します。これは、画像、音声、または任意のメディアファイルなどのバイナリデータにのみ使用できます。

ここでのデータ処理方法は、応答部分と同じで、どちらも文字列を処理しているので、繰り返しません。

クラスscrapy.http.HtmlResponse(url [、…])

HTMLコードを表示することで自動的に検出されるMETAHTTP-EQUIV属性のサポートを追加するHtmlResponseオブジェクト。

クラスscrapy.http.XmlResponse(url [、…])

XmlResponseオブジェクト。XML宣言行のエンコードを表示することにより、自動検出のサポートを追加します。

おすすめ

転載: blog.csdn.net/qq_20288327/article/details/113504317