Scrapy フレームワークは、データをクロールするアプリケーションの作成と管理に使用できるオープン ソースの Python クローラー フレームワークであり、現在市場で最も人気のあるクローラー フレームワークの 1 つです。 Scrapy フレームワークは、ネットワーク リクエストに非同期 IO を使用します。これにより、Web サイト データを効率的にキャプチャでき、スケーラビリティと安定性の利点があります。
この記事では、Scrapy フレームワークの特性と利点を深く分析し、具体的なコード例を通じてその効率的で安定した動作を説明します。
Scrapy フレームワークは Python 言語を使用します。これは学習が簡単で、参入障壁が低いです。同時に、ユーザーがすぐに使い始められるよう、完全なドキュメントとサンプル コードも提供します。以下は、Zhihu で人気のある質問のタイトルとリンクを取得するために使用できる簡単な Scrapy クローラーの例です。
import scrapy class ZhihuSpider(scrapy.Spider): name = "zhihu" # 爬虫名 start_urls = [ 'https://www.zhihu.com/hot' ] # 起始网站链接 def parse(self, response): for question in response.css('.HotItem'): yield { 'title': question.css('h2::text').get(), 'link': question.css('a::attr(href)').get() }
上記のコードでは、scrapy を継承して「zhihu」という名前のクローラー プログラムが定義されています。スパイダークラス。 start_urls 属性はクラスで定義され、クロールされる Web サイトのリンクはリストで指定されます。 parse() メソッドは、応答を解析し、CSS セレクターを通じて人気のある質問のタイトルとリンクを取得し、結果を辞書の結果として返すように定義されています。
Scrapy フレームワークはネットワーク リクエストに非同期 IO を使用し、複数の非同期リクエストを同時に送信し、すべての応答をすぐに返すことができます。この方法により、クローラーの速度と効率が大幅に向上します。以下は、単純な Scrapy 非同期リクエスト コードの例です。
import asyncio import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): urls = [ 'https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com' ] tasks = [] for url in urls: tasks.append(asyncio.ensure_future(fetch(url))) responses = await asyncio.gather(*tasks) print(responses) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
上記のコードでは、非同期リクエスト メソッドは、asyncio ライブラリと aiohttp ライブラリを通じて実装されています。 fetch() 非同期関数はリクエストを送信するために定義されており、aiohttp ライブラリは非同期 HTTP クライアントを実装するために使用されます。 main() 非同期関数は URL を処理するために定義され、fetch() によって返された Future オブジェクトがタスク リストに追加され、最後に asyncio.gather() 関数を使用してすべてのタスクの戻り結果を取得します。
Scrapy フレームワークは、豊富な拡張インターフェイスとプラグインを提供します。ユーザーはカスタム ミドルウェア、パイプライン、ダウンローダーなどを簡単に追加できるため、その機能を拡張できます。機能性とパフォーマンス。以下は、単純な Scrapy ミドルウェアの例です。
from scrapy import signals class MyMiddleware: @classmethod def from_crawler(cls, crawler): o = cls() crawler.signals.connect(o.spider_opened, signal=signals.spider_opened) crawler.signals.connect(o.spider_closed, signal=signals.spider_closed) return o def spider_opened(self, spider): spider.logger.info('常规中间件打开: %s', spider.name) def spider_closed(self, spider): spider.logger.info('常规中间件关闭: %s', spider.name) def process_request(self, request, spider): spider.logger.info('常规中间件请求: %s %s', request.method, request.url) return None def process_response(self, request, response, spider): spider.logger.info('常规中间件响应: %s %s', str(response.status), response.url) return response def process_exception(self, request, exception, spider): spider.logger.error('常规中间件异常: %s %s', exception, request.url) return None
上記のコードでは、MyMiddleware ミドルウェア クラスが定義されています。クローラー プログラムのシグナル接続を処理するために、特別な from_crawler() 関数がクラスで定義されています。 Spider_opened() 関数と Spider_closed() 関数は、クローラーの開始信号と終了信号を処理するために定義されています。 process_request() 関数と process_response() 関数は、要求信号と応答信号を処理するために定義されています。 process_Exception() 関数は、例外情報を処理するために定義されています。
Scrapy フレームワークは高度な構成と調整が可能で、ユーザーのニーズに応じてクローラーの詳細を調整できるため、Scrapy フレームワーク クローラーの安定性と堅牢性が向上します。素晴らしいセックス。以下は、Scrapy のダウンロード遅延とタイムアウト設定の例です。
DOWNLOAD_DELAY = 3 DOWNLOAD_TIMEOUT = 5
上記のコードでは、DOWNLOAD_DELAY パラメーターを 3 に設定することにより、2 つのダウンロードの間に 3 秒待つ必要があることを意味します。 DOWNLOAD_TIMEOUT パラメータを 5 に設定すると、5 秒以内に応答が受信されない場合はタイムアウトして終了することになります。
概要
Scrapy フレームワークは、学習が簡単、非同期 IO、スケーラビリティと安定性という利点を備えた、効率的でスケーラブルで安定した Python クローラー フレームワークです。この記事では、Scrapy フレームワークの主な機能と利点を、具体的なコード例を通じて紹介します。効率的で安定したクローラー アプリケーションを開発したいユーザーにとって、Scrapy フレームワークは間違いなく良い選択です。
以上がScrapy フレームワークの特性と利点の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。