すべてのソースコード分析記事インデックスディレクトリポータル
[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特殊キー
より詳細な操作については、ミドルウェアと実際のアプリケーションケースを参照してください。ここでは簡単な説明のみを示します。
-
dont_redirect:Request.metaのdont_redirectキーがTrueに設定されている場合、ミドルウェアは要求を無視します。
-
dont_retry:Request.metaのdont_retryキーがTrueに設定されている場合、このミドルウェアは要求を無視します。
-
handle_httpstatus_list:この範囲外の応答コードを処理する場合は、handle_httpstatus_listスパイダー属性またはHTTPERROR_ALLOWED_CODESを使用して、指定したスパイダーが処理できる応答コードを設定できます。
-
handle_httpstatus_all:Request.metaのhandle_httpstatus_listキーを使用して、各リクエストに許可される応答コードを指定することもできます。要求された応答コードを許可する場合は、メタキーhandle_httpstatus_allをTrueに設定することもできます。
-
dont_merge_cookies:Cookieを要求します。
-
cookiejar:cookiejarを使用してメタキーを要求し、各スパイダーで複数のcookieセッションを維持することをサポートします。デフォルトでは、単一のCookie jar(セッション)を使用しますが、識別子を渡して他の識別子を使用することもできます。
-
dont_cache:True以外のdont_cacheメタキーを使用して各戦略の応答をキャッシュすることは避けてください。
-
redirect_reasons:redirect_urlsの各リダイレクトの理由は、redirect_reasonsRequest.metaキーにあります。
-
redirect_urls:リクエストが通過するURL(リダイレクト時)は、redirect_urlsRequest.metaキーにあります。
-
bindaddress:リクエストの実行に使用される発信IPアドレスのIP。
-
dont_obey_robotstxt:Request.metaのdont_obey_robotstxtキーがTrueに設定されている場合、ROBOTSTXT_OBEYが有効になっている場合でも、ミドルウェアはリクエストを無視します。
-
download_timeout:ダウンローダーがタイムアウトするまで待機する時間(秒単位)。参照:DOWNLOAD_TIMEOUT。
-
download_maxsize:download_maxsizeスパイダー属性を使用して各スパイダーのサイズを設定し、download_maxsizeRequest.metaキーを使用して各リクエストのサイズを設定できます。
-
download_latency:要求の開始(つまり、ネットワークを介して送信されるHTTPメッセージ)から応答を取得するのにかかる時間。このメタキーは、応答をダウンロードした後にのみ使用できます。他のほとんどのメタキーはScrapyの動作を制御するために使用されますが、このキーは読み取り専用である必要があります。
-
download_fail_on_dataloss:応答の失敗が原因で失敗したかどうか。
-
proxy:ミドルウェアは、Requestオブジェクトのプロキシ要素値を設定することにより、リクエストのHTTPプロキシを設定します。
-
ftp_user:リクエスト要素に「ftp_user」がない場合、FTP接続に使用されるユーザー名。
-
ftp_password:リクエスト要素に「ftp_password」がない場合、FTP接続に使用されるパスワード。
-
referrer_policy:リクエストの「Referer」ヘッダーに入力するときに適用されるリファラーポリシー。
-
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'
}
パラメータの説明:
- データ(オブジェクト):JSONエンコーディングを必要とし、本体に割り当てられるJSONシリアル化可能なオブジェクトです。Request.bodyがパラメーターを提供する場合、このパラメーターは無視されます。Request.bodyがパラメーターを提供せず、データパラメーターを提供する場合、Request.methodは自動的に「POST」をに設定します。
- 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に送信されます。
パラメータの説明:
-
url(str):応答のURL
-
status(int):応答のHTTPステータス。デフォルトは200です。
-
headers(dict):この応答のヘッダー。dict値は、文字列(単一値ヘッダーの場合)またはリスト(複数値ヘッダーの場合)にすることができます。
-
本文(バイト):応答本文。デコードされたテキストに文字列としてアクセスするには、response.textを使用して、TextResponseなどのコード化されたResponseサブクラスを認識します。
-
flags(list):Response.flags属性の初期値を含むリストです。指定した場合、リストは表面的にコピーされます。
-
request(scrapy.http.Request):Response.requestプロパティの初期値。これは、リクエストがこの応答を生成したことを意味します。
-
証明書(twisted.internet.ssl.Certificate):サーバーSSL証明書のオブジェクトを表します。
-
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宣言行のエンコードを表示することにより、自動検出のサポートを追加します。