ブログに戻る

パーサーが空のフィールドを返す?プロキシは関係ない:レイアウトのドリフトを修正する方法

パーサーは空を返しましたが、プロキシを変更しています — 問題はサイトのリデザインにありました。5分でバンとレイアウトのドリフトを見分ける方法、Scraplingの適応セレクターがどのように機能するか(SQLiteでの要素のフィンガープリンティングと類似性による検索が2.46ミリ秒で行われる)そして、なぜ基準をデータを収集するのと同じジオから取得する必要があるのかを解説します。

📅2026年9月5日
パーサーが空のフィールドを返す?プロキシは関係ない:レイアウトのドリフトを修正する方法

パーサーは半年間動作していましたが、今日はデータベースに空の行が追加されました。最初の考えは「禁止された、プロキシを変更する必要がある」ということです。プールを変更し、IPの質を向上させ、データセンターの代わりに居住用のものにお金を払っても、フィールドは依然として空です。なぜなら、原因はブロックではなく、サイトが新しいレイアウトに移行したため、あなたのCSSセレクタはもはや何にも付いていないからです。

これは最も高価なタイプの故障です。なぜなら、静かに起こるからです。禁止はすぐにわかります:403、キャプチャ、リダイレクト。レイアウトのドリフトは何も落としません—HTTP 200、ページが取得され、トラフィックが支払われ、出力はNoneです。どのようにして5分でこれらを区別し、各リデザインの後にセレクタを手動で書き直すのをやめるかを見ていきましょう。

誰がこれを必要とするのか

これは、スプリントを超えてパーサーを運用している人々のためのガイドです:競合他社の価格監視、レビュー収集、求人の集約、分析のための毎日のエクスポート。スクリプトを一度実行して捨てるだけなら、レイアウトのドリフトは関係ありません。スクリプトが数ヶ月間cronで回っている場合、それはサポートの主要なコスト項目です。

問題の規模は作り話ではありません。GroupBWTのアナリストによると、サイトの管理されていない構造的変更は、大規模プロジェクトにおけるスクレイパーのサポートコストの約40〜60%を占めています。特定の業界では、10〜15%のクローラーが毎週修理を必要としています—DOMのシフト、フィンガープリンティング、エンドポイントのスロットリングが原因です。つまり、セレクタの修理は、アンチボットの回避とコストが競合し、注意が払われることははるかに少ないのです。

背景は良くありません:Apifyの「State of Web Scraping 2026」レポートによると、65.8%の回答者がプロキシの使用を増やし、58.3%が年々プロキシコストの増加を指摘し、62%以上がインフラコストの全体的な増加を示しています。主にボットからの保護が強化されたためです。この状況で、あなたが何も取得できないページに支払ったトラフィックを無駄にするのは、二重に悔しいことです。

ステップ1. 禁止とレイアウトのドリフトを区別する

診断には数分かかり、厳密に順序に従って行う必要があります—さもなければ、間違った故障を「修理」するのは簡単です。

  1. レスポンスコードとボディのサイズを確認してください。 403、429、503、確認ページへのリダイレクト、または2〜5KBのボディ—これはアンチボットです。HTTP 200と200〜800KBの完全なページ—サイトはあなたを受け入れました、問題はプロキシではありません。
  2. 生のHTMLをディスクに保存し、目で開いてください。 デバッガではなく、ブラウザで。商品/レビュー/価格がそこにあり、パーサーがそれを見ていない場合—これはレイアウトのドリフトです。
  3. ファイル内を検索して必要なテキストを見つけてください。 HTMLに存在するが、あなたのセレクタではアクセスできない—マークアップが変更されました。まったく存在しない—コンテンツはスクリプトによってロードされており、HTTPリクエストではなくブラウザエンジンが必要です。
  4. 以前の成功したエクスポートと比較してください。 同じURLの古いHTMLと新しいHTMLを比較してください:通常、新しいクラスラッパー、移動したブロック、またはiddata-*に置き換わったことがすぐにわかります。
  5. サイトが別のバージョンのページを提供していないか確認してください。 これについては別途詳しく説明しますが、ここではプロキシが関係しています。

もし3番目のポイントの後に診断が「マークアップが崩れた」となった場合、プロキシを変更するのは無意味です。セレクタが腐ったときでも要素を見つけることができるパーサーが必要です。

ステップ2. アダプティブセレクタとは何か

アイデアはシンプルです:.product-card > h3.titleの行に固執する代わりに、ライブラリは必要な要素の「ポートレート」を一度記憶し、次回の実行時にページ上でこのポートレートに最も似た要素を探します。

これが最も実用的に実現されているのがScraplingです—カリム・ショアイールのオープンなPythonフレームワークです。このプロジェクトは2024年10月にリリースされ、2026年9月までにGitHubで78,000以上のスターを獲得しました;執筆時点での最新リリースはv0.4.15(2026年8月23日付)で、コミットは毎日行われています。Python 3.10以上が必要です。

アダプティブ検索のメカニズムは次のように機能します。auto_save=Trueでセレクタを呼び出すと、Scraplingは要素のフィンガープリントを保存します:

  • タグ名、テキスト、すべての属性とその値;
  • 隣接するタグの名前;
  • 要素までのパス—タグ名のみに基づいて;
  • 親のタグ、属性、テキスト。

フィンガープリントはローカルのSQLiteデータベースに保存され、「ドメイン + 識別子」のペアでキー付けされます。ドメインはページのURLから取得され(またはadaptive_domainパラメータで指定され)、デフォルトの識別子はセレクタの行そのものです—またはidentifier=を渡すことで独自のものにすることができます。

レイアウトが変更され、通常のセレクタが空を返すと、adaptive=Trueの呼び出しが保存されたフィンガープリントを引き上げ、ページ上のすべての要素を通過させ、属性の順序に至るまでの類似性のあいまいな評価を行います。最も一致する要素が返されます。

これは安価です。プロジェクトの公式ベンチマークによると、パースは1.99 msで、Parsel/Scrapyの2.01 ms、PyQueryの22.93 ms、Selectolaxの80.57 ms、BeautifulSoup with lxmlの1541 msに対して行われます。類似要素のアダプティブ検索自体は2.46 msで、AutoScraperの13.3 msに対してです。つまり、リデザインからの保険は、数百ミリ秒のネットワーク遅延の中でリクエストに約2ミリ秒を追加します。

ステップ3. インストールと有効化

インストールは、ブラウザが必要かどうかによって異なります:

  1. pip install scrapling — ネットワーク部分なしのパーサーのみ。HTMLを自分のコードで取得する場合はこれで十分です。
  2. pip install "scrapling[fetchers]"、次にscrapling install — フェッチャーを追加し、依存関係とともにブラウザをダウンロードします。
  3. 追加:[ai] — MCPサーバー、[rag] — RAG用のラッパー、[shell] — インタラクティブコンソール、[all] — すべて一度に。pyd4vinci/scraplingの準備されたイメージがあります。

次に、2回の実行があります。最初は生の作業レイアウトでフィンガープリントを保存し、2回目はリデザインを生き延びることができます:

  1. 基準実行。 adaptive=TrueSelectorオブジェクトを作成し、必ずurlを渡してください—さもなければドメインは"default"キーに移動し、異なるサイトのフィンガープリントが混ざります。必要なセレクタをauto_save=Trueで呼び出します。
  2. 実戦実行。 同じセレクタですが、adaptive=Trueを使用します。マークアップが無事であれば、通常の方法が機能します。壊れた場合は、類似性の検索が始まります。
  3. 相違をログに記録します。 通常のセレクタが空を返し、アダプティブなものが何かを見つけた瞬間—これは「サイトが移動した」という信号であり、監視で見る必要がありますが、静かに飲み込むべきではありません。

上書きに関する重要な詳細:保存は蓄積されません。同じ「ドメイン + 識別子」のペアに対する再度のauto_saveは、以前のフィンガープリントを上書きします。したがって、基準は確実に正しいページで取得し、すべてのURLプールをループするのではなく、行う必要があります。

ステップ4. プロキシ:それがどのように関係しているのか

私たちは、レイアウトのドリフトはプロキシの問題ではないと始めました。これは半分正しいですが、もう半分はお金がかかります。

サイトはプロキシの出力に応じて異なるマークアップを返すことがあります。 ロケール、言語、国はページのテンプレートを変更します:ブロックの順序が異なる、クラスが異なる、価格や日付の形式が異なる。これは仮説ではありません—Scrapling自体には示唆に富んだ修正があります:バージョン0.4.12ではStealthyFetcherから強制的なロケールen-USが削除されました。なぜなら、強制されたロケールが実際の地理と食い違い、動作を壊していたからです。したがって、作業ルールは次のとおりです:データを収集するために後で使用するのと同じ地理から基準フィンガープリントを取得してください。 ドイツのIPを介して取得されたフィンガープリントは、ブラジルのIPを介して取得されたページと一致しにくくなり、「サイトがレイアウトを変更した」という誤警報を引き起こします。

実践的な結果:

  • プールが多国籍である場合—adaptive_domainを介してフィンガープリントを分け、ドメイン + 国の形式のキーを設定します。そうしないと、SQLiteの1つのエントリが異なる地理のバージョンで常に上書きされます。
  • 長いシナリオの場合、タスク全体に対して1つの国と1つのセッションを保持します。これをどのように実現するかは、スティッキーセッションとその使用方法に関する資料で詳しく説明されています。
  • A/Bテストと段階的な展開は、同じドメインで同時に2つの生のレイアウトを提供します。ここでアダプティブ検索は特に有用です:それは両方のブランチから要素を引き出しますが、ハードセレクタはリクエストの半分でランダムに空を返します。

Scraplingでプロキシを設定することはすべてのレベルで可能です。迅速なHTTPリクエストのために、FetcherAsyncFetcherにはproxiesパラメータがあります。セッション用にはProxyRotatorがあり、アドレスのリストが渡され、FetcherSessionに挿入されます。ブラウザのDynamicSessionStealthySessionは、シナリオの途中でIPが変更されないようにセッションレベルでプロキシを受け入れます。

さらに、プールと神経を節約するもう1つの機能がバージョン0.4.12で登場しました—AutoThrottle:ライブラリはサーバーの応答に応じてリクエスト間の遅延を自動的に調整し、ブロック時には遅延を倍増し、Retry-Afterヘッダーを尊重します。これは、注意深い収集と無邪気なリトライによる禁止の加速を区別する行動です。

落とし穴

  • フィンガープリントを含むSQLiteをgitにコミットしないでください。 これはドキュメントで明確に警告されています。また、個人データを含むページでauto_saveを使用しないでください—フィンガープリントには要素のテキストと属性が含まれます。
  • アダプティブ検索は監視の代替ではありません。 それは「最も似ている」要素を返しますが、最も似ているものが常に正しいとは限りません。サイトが割引価格と通常価格を入れ替えた場合、類似性は高いですが、データは正しくありません。値の範囲とエクスポート内の空フィールドの割合を確認してください。
  • 静かな故障は大きな故障よりも高価です。 セレクタが静かにNoneを返す間、パイプラインはページを巡回し、支払ったトラフィックを消費し続けます。データを抽出できなかったギガバイトが実際にどのようにコストがかかるかについては、別の分析があります—なぜプロキシのGBあたりの価格が誤解を招くのか
  • フィンガープリントは古くなります。 確認されたリデザインの後は、基準を再度取得してください。そうしないと、次のサイトの修正は古いポートレートからのものと見なされ、精度が低下します。
  • HTMLにコンテンツがまったくない場合—アダプティブ性は役に立たず、ブラウザフェッチャーが必要です。バージョン0.4.15では、ブラウザのタブがリクエスト間で再利用されるようになり、close_pages()メソッドが強制的にそれらを閉じます;また、ヘッドレスモードでのフリーズが修正され、Turnstileの解決はブラウザのロケールに依存しなくなりました。

このタスクに適したプロキシの種類

選択はパーサーではなく、ターゲットサイトによって決まります:

  • データセンタープロキシ — 深刻なアンチボットのないサイト用:ドキュメント、政府のレジストリ、オープンカタログ、RSSおよびCSVフィード(最新の0.4.13ではXMLFeedSpiderCSVFeedSpiderが自動的にgzipを解凍する機能が追加されました)。安価で迅速で、ここではマークアップの安定性が通常高いです。
  • 居住用プロキシ — マーケットプレイス、アグリゲーター、地理に基づいて結果をパーソナライズするすべてのものに。ここでは基準を取得し、1つの国からデータを収集することが重要です。さもなければ、故障を修理するのではなく、自分の地理を修正することになります。
  • モバイルプロキシ — サイトがモバイルテンプレートを返し、それをそのままパースする必要がある場合、またはIPの信頼性がギガバイトの価格よりも重要な場合。

まとめ

エクスポート内の空のフィールドは、異なる治療法を持つ2つの異なる診断です。まず、レスポンスコードと生のHTMLを確認してください:ページが完全に届いた場合、プロキシを変更する必要はなく、マークアップが崩れました。Scraplingのアダプティブセレクタは、このクラスの故障をリクエストあたり数ミリ秒で解決します—作業レイアウトでフィンガープリントを保存し、実戦でadaptive=Trueを有効にし、リデザインの信号として発生した瞬間をログに記録してください。そして、地理を安定させてください:実際には「突然のリデザイン」の半分が、国の変更によって来た別の言語バージョンのページであることが判明します。

安定した地理と予測可能なセッションがあなたのパーサーに必要なものであれば、ProxyCoveの居住用プロキシを見てください:国の選択、スティッキーセッション、実際に使用したトラフィックに対する支払い。