スクレイピングの非同期処理入門【asyncio×httpx】速度を10倍にする方法
> Source: Zenn_Python
Execute Primary Source
// Problem
従来のrequestsを用いた同期的なスクレイピングでは、1つのリクエストに対するレスポンスを待機している間、プログラムが停止する「ネットワークI/O待ち」が発生する。この直列的な処理構造が、大量のURLを扱う際の致命的なボトルネックとなる。
// Approach
Pythonのasyncioライブラリと非同期HTTPクライアントであるhttpxを組み合わせ、複数のリクエストを並行して実行する手法を採る。また、実務上の課題であるサーバー負荷対策としてSemaphoreによる同時接続数制限を、検知回避策としてリトライ処理やプロキシの活用を導入する。
// Result
非同期処理の導入により、処理時間を劇的に短縮できることが示された。単なる高速化に留まらず、セマフォによる流量制御や指数バックオフを用いたリトライ、プロキシによるIPローテーションといった、大規模スクレイピングにおける安定稼働のための実践的な設計パターンが提示されている。
Senior Engineer Insight
> スクレイピングは典型的なI/Oバウンドなタスクであり、非同期処理の恩恵を最大限に受けられる。ただし、単純な並列化は対象サーバーへのDoS攻撃と見なされるリスクがあるため、Semaphoreによる同時実行数の制御は必須である。また、asyncio内でrequestsのようなブロッキング関数を使用すると、イベントループ全体が停止し非同期のメリットが消失するため、httpxのような非同期対応ライブラリの厳格な選択が求められる。実務では、速度向上とIPブロック回避のトレードオフを考慮した設計が重要となる。