Pythonウェブクローラーチュートリアル:Requests to Playwright
Senior Web Scraping Engineer
TL;DR:
- Pythonのウェブクロールはルールを持つキューです。 それは1つ以上のURLから始まり、発見されたリンクを正規化し、重複を拒否し、範囲を強制し、各ページで何が起こったかを記録します。
- RequestsとBeautiful Soupはサーバーレンダリングされたページにとって適切なベースラインです。 これによりクロールが迅速になり、失敗の検査が容易になります。
- PlaywrightはすべてのURLではなくJavaScriptのブランチに属します。 初期のレスポンスから必要なコンテンツが欠けているページのみをレンダリングします。
- Scrapeless Scraping Browserはブラウザの実行をクロールプロセスから分離します。 これは管理されたセッションと動的レンダリングが主な運用コストになるときに便利です。
クロールは、直前に取得したものから次に行く場所を決定します。これにより、URLポリシー、キューの状態、重複排除が、任意のCSSセレクタよりも重要になります。
このチュートリアルは、層を重ねてデザインを構築します:安定したページのためのプレーンHTTP、クライアントサイドコンテンツのためのブラウザレンダリング、そしてローカルChromiumが制約となるときの管理されたブラウザ実行です。
Pythonのウェブクロウラーとは?
Pythonのウェブクロウラーは、シードセットからリンクをたどることによってページを発見するプログラムです。ウェブスクレイピングは既知のページからフィールドを抽出しますが、クロールはどのページが存在するかを発見し、後で処理するためにスケジュールします。
これらの2つの作業はしばしば1つのプロセスを共有しますが、設計では別々に保つべきです。発見は正規のURLと関係メタデータを返します。抽出はタイトル、価格、日付、または本文テキストなどのレコードを返します。
クロールパイプラインの概要
| ステージ | 入力 | 出力 | 主要ルール |
|---|---|---|---|
| シード | 開始URL | 初期キュー | 明示的に許可されたドメインを使用 |
| フェッチ | 正規URL | HTTPレスポンスまたはレンダリングされたページ | 明確なタイムアウトを設定 |
| 発見 | HTMLドキュメント | 候補リンク | 相対URLを解決 |
| 正規化 | 候補URL | 正規URL | フラグメントを削除し、ホストケースを正規化 |
| フィルタリング | 正規URL | 受け入れられたまたは拒否されたURL | ドメイン、パス、深さの範囲を強制 |
| 重複排除 | 受け入れられたURL | 新しいキューアイテムまたは既存のレコード | 正規形式に基づくキー |
| 抽出 | ページコンテンツ | 構造化されたレコード | オプションフィールドはnullableとして扱う |
| 保存 | レコードと出所 | 耐久性のあるデータセット | ソースURLと収集時間を保持 |
パスA: 静的ページのためのRequestsとBeautiful Soup
Requestsは、初期レスポンスにクロールに必要なリンクとフィールドがすでに含まれている場合に適しています。次に、Beautiful SoupがHTMLを検索可能なツリーに変換します。
幅優先トラバーサルのためにdequeを、訪問済みの正規URLのためにセットを、厳格なページ制限を設定します。相対リンクはurljoinで解決し、解決後にホスト名を確認します。 URI一般構文 は、相対参照とフラグメントがURLモデルにどのように適合するかを定義します。
成功したフェッチの後にのみURLを訪問済みとしてマークしないでください。キューに入るときにマークします。そうしないと、2つの親ページがいずれのリクエストも完了する前に同じ子ページをスケジュールできることがあります。
重複排除前にURLを正規化する
URLの正規化は、/products、/products#reviews、および同等の絶対URLが1つのクロールターゲットまたは3つになるかどうかを決定します。保守的な正規化ツールは次のことを行うべきです:
- スキームとホスト名を小文字にする;
- フラグメントを削除する;
.と..のパスセグメントを解決する;- デフォルトポートを削除する;
- 意味が知られていない限りクエリパラメータを保持する;
- スケジュール前に非HTTPスキームを拒否する。
WHATWG URL標準 は、最新のブラウザによって実装されたパーサーの動作を文書化しています。未知のクエリパラメータを削除すると、異なるリソースが崩壊する可能性があるため、正規化は保守的に保つ必要があります。
範囲、深さ、クロール予算を強制する
クロールは最初のリクエストを送信する前に明示的な停止ルールが必要です。許可されたホスト、受け入れられるパスプレフィックス、最大深さ、および最大ページを定義します。深さはシードからのリンクエッジの数であり、サイト階層のプロキシではありません。
各キューアイテムと共に発見の親を保存します。それにより、ページが訪問された理由を説明するのに役立つURLグラフが作成され、無限のカレンダーやファセットナビゲーションパターンが可視化されます。
Scrapelessを使ってスクレイピングを開始する
Scrapelessであなたのウェブスクレイピングと自動化ワークフローをパワーアップしましょう!
今日サインアップして5ドルの無料クレジットを得ましょう — クレジットカードは不要。Scrapeless Dashboardで今すぐ無料クレジットを請求しましょう。
ロボットとサイトポリシーを尊重する
ロボットの指令はクロール計画の一部であり、後回しにしてはいけません。ロボット排除プロトコル は、クロウラーがrobots.txtルールを発見し解釈する方法を定義します。
適用される条件および法律を確認し、適切な場合にはクローラーを特定し、収集を許可された公共ページに制限してください。ロボットルールは認可メカニズムではなく、許可されたパスは法的および契約的レビューを置き換えるものではありません。
パスB: JavaScriptページのためのPlaywright
Playwrightは、必要なリンクやフィールドがクライアントサイドの実行後にのみ表示される場合に適しています。初期の応答が不完全であることが判明した後、それらのページをブラウザブランチにルーティングします。
domcontentloadedを出発点のナビゲーションイベントとして使用し、その後、データに関連付けられた特定のページ状態を待ちます。Playwrightロケータガイダンスは、ターゲットと一致する場合、役割、ラベル、テキスト、およびその他のユーザー向け属性を推奨しています。
抽出後は、各ページとブラウザコンテキストを閉じてください。ブラウザリソースは、軽量HTTPリクエストと同じ無制限ループ内で存続してはならない。
ブラウザ実行をScrapelessに移動するタイミング
Scrapeless Scraping Browserは、クローラーのブラウザブランチが管理されたセッション、地理的ルーティング、および生産ブラウザ容量を必要とする場合に便利です。Scraping Browserクイックスタートでは、現在の接続パスをカバーしています。
クローラーのキュー、URLルール、抽出スキーマ、およびストレージをアプリケーションの制御下に保ってください。ブラウザ実行レイヤーのみを移動します。この分離により、静的ページはリクエスト上に留まり、動的ページは管理されたブラウザを使用できます。
再開のためのクローリング状態を保存
キューに入っている、進行中、完了、拒否、失敗した状態をそれぞれ分けて保持します。正規化されたURL、発見元、深さ、取得方法、応答ステータス、コンテンツハッシュ、およびパーサーバージョンを保存します。
コンテンツハッシュは、変更されていないページが下流処理に再度入るのを防ぎます。パーサーバージョンは、セレクタの更新が履歴出力を変更する際にスキーマ変更を追跡可能にします。
実際にブラウザ実行を必要とするページの割合を測定した後、Scrapelessの価格を確認します。Scraping Browserベストプラクティスガイドは、ページがその境界を越えた後、ブラウザバックされた作業を確実に実行する方法を説明しています。
結論
信頼できるPythonクローラーは、制御されたURLグラフです。リクエストとBeautiful Soupで始め、重複排除の前に正規化し、スコープをスケジュールの前に施行し、JavaScriptに依存するページのみをPlaywrightまたはScrapeless Scraping Browserを通じてルーティングします。
制御されたクローラーパイプラインの構築準備は整いましたか?
DiscordやTelegramでウェブデータパイプラインを構築している開発者に参加してください。 app.scrapeless.comでアカウントを作成し、実際のURLセットに対してブラウザブランチを測定してください。
FAQ
Q: クローリングとスクレイピングの違いは何ですか?
クローリングはページを発見し、スケジュールします。スクレイピングはページからフィールドを抽出します。1つのパイプラインで両方を行うことができますが、状態と出力を分けることで操作が容易になります。
Q: ウェブクローリングは合法ですか?
ウェブクローリングは許可された公共ページにアクセスする際に合法である可能性がありますが、要件は法域やサイトによって異なります。使用例について適用される条件、プライバシー義務、および法的助言を確認してください。
Q: Pythonクローラーはプロキシが必要ですか?
地理的ルーティングや分散出口が必要な場合には、プロキシが便利です。これはクローラーがスコープとポリシーを尊重する義務を変更するものではありません。
Q: クローラーはアクセス拒否ページをどのように処理すべきですか?
ページを異なるアクセス結果として記録し、そのURLの抽出を停止し、セッション、出口、および認可の仮定を確認してからワークフローを続けます。
Q: DOMが変更された場合はどうなりますか?
発見および抽出セレクタを保存されたフィクスチャに対して再確認し、パーサーバージョンを更新し、新しいスキーマが確認されるまで欠落フィールドをnullable(null許容)として扱います。
Q: クローラーはどのくらいの同時実行を使用すべきですか?
ホストごとに3つを超えないワーカーから始め、サイトのポリシーやサーバーの動作が必要な場合には限度を下げます。ブラウザジョブは、別の厳密なキャパシティプールを使用するべきです。
Q: クローラーはAIエージェントなしで動作できますか?
はい。キュー、URLポリシー、HTTPクライアント、ブラウザブランチ、およびストレージパイプラインは、モデルなしで通常のPythonサービスとして動作できます。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



