非同期プログラミングと、aiohttp や httpx などのライブラリは、その速度とスケーラビリティにより、最新の Web スクレイピングにとって天の恵みとなっています。数百のリクエストを同時に発行できるため、非常に速い速度でデータを収集できます。
ただし、この新たに発見されたスクレイピング能力には重要な責任が伴います。Web サイトに損害を与えたり、ブロックされたりしないように、リクエスト レートを抑制する必要があります。ありがたいことに、Python には、制御された責任あるスクレイピングのための優れたオプションが多数用意されています。
この包括的なガイドでは、非同期 Web スクレイパーのレート制限に関するさまざまな方法とベスト プラクティスについて説明します。敬意を持って、持続的に、合法的に、または上記のすべてをスクレイピングすることを検討している場合でも、サイトの書き込みを避けるための戦略を読み続けてください。
増大する攻撃的な Web スクレイピングの脅威
まず、サイトをスクレイピングする際に責任あるレート制限が不可欠になった理由についての背景から始めましょう。
過去 5 年間で、問題のあるスクレイピングの量は驚くべきレベルに爆発的に増加しました。いくつかの推定では、 現在、全 Web トラフィックの 40% 以上がスクレイパーまたはボットから来ています 何らかの形で。
この成長の多くは、Puppeteer、Playwright、プロキシ サービスなどのツールのアクセシビリティの向上によって促進され、スケーラブルなスクレイパーの構築がこれまでより簡単になりました。しかし、残念なことに、これらのボットのほとんどは、責任を持ってスクレイピングすることにほとんど注意を払っていません。
この激流のスクレイピング活動により、多くの Web サイトが圧倒されました。 LinkedIn、Amazon、Craigslist のような大規模なサービスでさえ、スクレイパーの悪用に悩まされています。
LinkedIn 2019で報告 彼らは 95 日あたり XNUMX 万以上のスクレイパー ボット セッションをブロックしていました。
Amazon されています 偽レビューとの戦い 2015 年以降、スクレーパーは数十億ドルの詐欺被害に遭っています。
クレイグスリスト 実際に 訴訟を起こした 2019年に許可なくリスティングをスクレイピングしたサイトに対して。
また、リソースが限られている小規模な Web サイトの場合、積極的なスクレイピングによって機能が完全に破壊されたり、サイトがシャットダウンされたりする可能性があります。悲しいことにあります 多くの 例 これがインターネット上で起こっていることについて。
無制限で無謀な Web スクレイピングが Web の健全性に重大な脅威をもたらすことは明らかです。コミュニティはより大きな利益のために自主規制する必要があります。
責任ある Web スクレイピングの中核原則
では、ボットが急増するこの時代における責任ある Web スクレイピングとは正確には何でしょうか?留意すべき重要な原則をいくつか示します。
合法的にスクレイピング – サイトの利用規約を遵守し、著作権を尊重してください。必要に応じて許可を得てください。
倫理的にスクレイピング – ウェブサイトの機能やパフォーマンスに悪影響を与えたり、所有者に費用を負担させたりしないでください。
丁寧に削る – 攻撃やサービス拒否のように思われないように、適切な速度でクロールします。
持続可能なスクレイピング – スクレイピングの取り組みが長期的に妨げられないようにしてください。アクセスを維持します。
これらの原則に従うということは、スクレイピングの速度と量を意図的に制限することを意味します。提示されたクロール予算、レート制限に従い、必要に応じて商用スクレイピング ツールの料金を支払います。それはコーダーとしての私たちの義務です。
責任あるスクレイピングにおけるレート制限の役割
レート制限は、特に、上記の責任あるスクレイピングの実践に従う上で重要な役割を果たします。リクエスト レートの調整が非常に重要である理由を見てみましょう。
ブロックを回避します – リクエストの送信が速すぎることは、スクレイパーが検出されブロックされる最も簡単な方法の 1 つです。レーダーに映らないように速度を落としてください。
サーバーの負荷を軽減します – 高速スクレイピングでは、ターゲット サイトに簡単に過負荷がかかり、パフォーマンスが低下する可能性があります。 RPS を制限すると、インフラストラクチャのタキシングが防止されます。
信頼性を向上 – スパムリクエストは失敗してブロックされることがよくあります。レート制限を慎重に行うと、成功率が高くなります。
監視を許可します – スロットリングを使用すると、ログとメトリクスを確認して、やみくもに再試行したりスパムを送信したりして失敗するのではなく、問題を特定できます。
コンプライアンスを実現します – 多くのサイトでは、スクレイピングを完全に禁止しているか、ToS で 1 リクエスト/5 秒などの制限を課しています。スロットルを使用すると、ルールに従うことができます。
要約すると、レート制限は、確実に、合法的に、持続的に、丁寧にスクレイピングを行うために不可欠です。それはプログラマーとしての私たちの責任です。次に、Python スクレーパーを効率的にスロットルするためのいくつかのテクニックを見てみましょう。
レート制限で使用する非同期スクレイピング ライブラリ
このガイドは非同期スクレイパー速度の制限に焦点を当てているため、まず Python で人気のある非同期スクレイピング ライブラリをいくつか取り上げます。
名前 | 説明 | 強み |
---|---|---|
httpx | フル機能の非同期 HTTP クライアント | 速くて使いやすい |
aiohttp | ベテランの非同期ライブラリ | 素晴らしいドキュメント、サポート |
トリオウェブソケット | 非同期 Web ソケット | 高速な自動化 |
トレク | Twisted をベースに構築 | 性能 |
一般的な強力なスクレーピングの場合、 httpx 私の個人的なお勧めは、優れたパフォーマンスと使いやすさです。ただし、これらのライブラリはいずれもレート制限の恩恵を受けることができます。
これらのツールを使用すると、数百または数千の同時リクエストを実行して、非同期プログラミングの速度の利点を実際に享受できます。ただし、これから説明するテクニックを使用して、スクレイピングの速度を責任を持って制限する必要があります。
Python 非同期スクレーパーの速度を制限する簡単なアプローチ
より堅牢なソリューションに入る前に、非同期スクレーパーのスループットを制限するいくつかの基本的な方法から始めましょう。
リクエスト間の明示的なスリープ
最も単純なスロットル方法は、小さなスロットルを追加することです。 time.sleep()
リクエストループ内の呼び出し:
import time
# Sleep 0.1 sec to limit to 10 RPS
time.sleep(0.1)
長所:
- 実装が簡単
短所:
- 正確ではありません – 睡眠は積み重なっていきます
- リクエストを監視するのが難しい
これは基本的なケースでは機能しますが、これから説明する他のオプションの精度と可視性が欠けています。
同時リクエストの制限
セマフォを使用して同時に実行するリクエストの数を制限できます。
# Limit to 10 concurrent requests
sem = asyncio.Semaphore(10)
async def request():
async with sem:
await fetch()
長所:
- ターゲットサイトの並列負荷を制限します
短所:
- 1 秒あたりの全体的なリクエストを制御することはまだできません
- スループットの監視/測定が難しい
単純な場合にも使用できますが、精度の制御が不足しています。正確な RPS 制限を提供する、より堅牢なライブラリを見てみましょう。
Aiometer による正確なレート制限によるスムーズな Python スクレイピング
非同期コードを調整するための最も人気のある Python ライブラリの 1 つは次のとおりです。 照度計。わずか数行で、スクレイパーを 1 秒あたりのリクエストのレートに正確に制限することが簡単にできます。
Aiometer は、次のように非同期コードをラップすることで機能します。
import aiometer
async def fetch(url):
# make request
await aiometer.run_on_each(
fetch,
urls,
max_per_second=5
)
その後、aiometer が強制する 5 RPS などの正確なレート制限を設定できます。これにより、スループットを正確に制御できます。
長所:
- シンプルなAPI
- 正確な RPS レートに正確に制限
- すべてのリクエストの可視化
- 最大同時実行数もサポート
私の経験では、aiometer は現在、Python 非同期スクレイピングに最適なターンキー レート制限を提供します。構成は最小限で、スクレーパーを確実に滑らかにします。
次に実際の例を見てみましょう。
Aiometer のケーススタディ: Google ニュースを責任を持ってスクレイピング
aiometer の動作を示すために、制御された速度で Google ニュースから最新のヘッドラインをスクレイピングするスクリプトの例を次に示します。
import asyncio
from httpx import AsyncClient
import aiometer
from bs4 import BeautifulSoup
async def fetch(url):
async with AsyncClient() as client:
resp = await client.get(url)
soup = BeautifulSoup(resp.text, ‘html.parser‘)
for title in soup.select(‘h3‘):
print(title.text)
async def main():
urls = [
‘https://news.google.com/‘
for _ in range(50)
]
await aiometer.run_on_each(
fetch, urls, max_per_second=2
)
asyncio.run(main())
ここでは、httpx を使用してページを取得し、BeautifulSoup を使用してそれを解析し、aiometer を使用して全体のスクレイピング速度を 2 秒あたり XNUMX リクエストに制限します。
これにより、Google のサーバーに対して責任を負いながら、非同期の全機能を利用してすべての見出しを効率的にスクレイピングできるようになります。もし私たちが全速力で走れば、おそらく彼らは私たちの交通を妨害するでしょう。
このような公開サイトでは、aiometer を使用すると、パフォーマンスと責任の適切なバランスを見つけることが簡単になります。
より強力なターゲット向けの高度なプロキシ ローテーション
Google、Facebook、LinkedIn などのより洗練された Web サイトの場合、レート制限だけでは長期にわたって確実にデータを収集するのに十分ではないことがよくあります。これらのサイトには、スクレーパーを積極的に検出してブロックする高度なボット保護システムが備えられています。
ターゲットを尊重しブロックを回避しながらスクレイピングを成功させるには、商用プロキシ サービスが不可欠になります。プロキシは、複数の ID にリクエストを分散するための新しい IP アドレスを提供します。
私の経験では、難しいサイトをスクレイピングするときにブロックを回避するには、住宅用プロキシ プールが最も効果的です。
ここでは、いくつかの著名なサービスとその主な利点を紹介します。
スマートプロキシ – Instagram や LinkedIn などのサイトと緊密に統合された 10 万を超える住宅用 IP。高速なパフォーマンス。
ルミナティ – 大規模なピアツーピア IP プールを備えた住宅用プロキシの最初の先駆者。世界中で優れたカバレッジを実現。
スクレイプオプス – Playwright のようなヘッドレス ブラウザ向けに最適化された最新の管理されたプロキシ。 IP スティッキー セッションを修正しました。
ジオサーフ – 南アフリカのようなニッチな国の住宅用プロキシに焦点を当てます。国際的なターゲット設定に適しています。
統合プロセスはプロバイダーによって異なりますが、通常は次の作業が含まれます。
- 新しいリクエストごとにプロキシをローテーションする
- ターゲットサイトの要件ごとに分類されたプール
- 国、ユーザーエージェントなどの他のプロキシパラメータの使用
この高度なプロキシ処理とリクエストのスロットリングを組み合わせることで、ほぼすべてのサイトを責任を持ってスクレイピングするための強力な組み合わせが提供されます。
以下は、困難なサイトをスクレイピングする際に、プロキシが成功率をどの程度高めるかを示すベンチマークです。
Site | プロキシを使用した場合の成功率 | プロキシなしの成功率 |
---|---|---|
でログイン | 視聴者の38%が | 視聴者の38%が |
視聴者の38%が | 視聴者の38%が | |
確かに | 視聴者の38%が | 視聴者の38%が |
視聴者の38%が | 視聴者の38%が |
ご覧のとおり、プロキシはボット保護システムを無効にすることで信頼性を大幅に向上させます。追加コストがかかりますが、そうでなければ非常に困難なサイトのスクレイピングが可能になります。商用スクレイピングの場合、プロキシは必須とみなされます。
Webスクレイピングを巡る法的状況とリスク
ウェブサイトを技術的に尊重することに加えて、適切な使用権と許可を得て法的にスクレイピングを保証する必要もあります。
Web スクレイピングに関する法的状況は依然としてやや曖昧ですが、留意すべき重要な原則がいくつかあります。
純粋に公開されているデータをスクレイピングすることは、米国におけるフェアユースの権利に該当する可能性があります。ただし、他の多くの国ではそれが禁止されています。
スクレイピングによってサイトの利用規約に違反した場合でも、CFAA に基づく停止措置や損害賠償などの民事訴訟の対象となる可能性があります。
技術的には、公的政府サイトには、自由なスクレイピングに対する最も明確な法的立場があります。しかし、規制は州によって異なります。
記事などの著作権で保護されたデータを合法的にスクレイピングするにはライセンスが必要です。ニュースサイトは多くの場合、アクセスを厳しく制限または禁止します。
電子メールやソーシャル メディア データなどの個人情報をスクレイピングすると、使用方法によってはプライバシー法に違反することがよくあります。
要約すると、公開データのスクレイピングはフェアユースに該当すると考えられますが、法律は依然複雑であり、違反した場合には場合によっては民事罰または刑事罰が科される可能性があります。特定のユースケースに関するアドバイスについては、弁護士に相談してください。
私の経験から次のベスト プラクティスをお勧めします。
robots.txt を尊重します。 クロール ディレクティブは、サイトがスクレイピングを許可するかどうかを示します。ただし、robots.txt には法的拘束力がないことに注意してください。
利用規約をお読みください: サイトの利用規約で何が許可されているか、何が禁止されているかを正確に理解してください。
研究の優先順位: あなたの目的と同様のタイプのスクレイピングに関する裁判例を確認してください。
許可を求めます: 合法性があいまいだと思われる場合は、Web サイトに直接アクセスをスクレイピングするように依頼すると、根拠をカバーできる可能性があります。
レート制限により、準拠して持続可能なスクレイピングが可能になりますが、合法的にスクレイピングするには法律とサイトのポリシーも参照する必要があります。
責任を持って Web をスクレイピングすることについての最終的な考え
最後に、このガイドが非同期 Python スクレーパーを調整するためのテクニックとベスト プラクティスの包括的な概要を提供できたことを願っています。
レート制限により、以下によって責任を持ってスクレーピングが行われるようになります。
- ブロックを避ける
- サイトのリソースを尊重する
- 合法かつコンプライアンスに準拠したスクレイピング
- 信頼性の高いデータ収集を可能にする
aiometer などのライブラリを使用すると、正確なスロットルを簡単に実装できます。また、商用プロキシ/ブラウザは、より厳しいサイトをスクレイピングする際に不可欠な保護を提供します。
しかし、技術的な解決策は存在しますが、コミュニティとして私たちは哲学的に責任あるスクレイピングを受け入れる必要もあります。大きなスクレーピング力には大きな責任が伴います。
自主規制し、影響を意図的に制限することで、持続可能な Web エコシステムを育成できます。そこを優しくこすってください!